Мой мозг просто сломан.
Такой вопрос:
Есть ObjectM* prevNode; Если использую его, все нормально.
А есть тоже самое с моей точки зрения ObjectM* Prev() {return (prevNode);}
Но на него выходит ошибка ListP (SBER,M1) invalid pointer access in 'ListM.mqh' (64,19)
Если раскомментировать строки 65 и 67 закомментировав 64 66 ошибки не будет. Что делает функция Prev() и Next(), что теряется указатель?
Дальше код все равно не рабочий, что происходит не понимаю в принципе.
Ваша функция возвращает значение, которое содержится в переменной prevNode, а не ссылку на переменную prevNode.
Можете объяснить. Каких случаях я получаю сам объект, а в каких указатель ? ObjectM* - звёздочка говорит об выдаче указателя из функции. Переменная хранит указатель.
Если указать без звёздочки объект в функции. То в принципе компилятор жалуется. Что не может выдать, потому что нет конструктора константного.
object of 'class ObjectM' cannot be returned, copy constructor 'ObjectM::ObjectM(const ObjectM &)' not found
Можете объяснить. Каких случаях я получаю сам объект, а в каких указатель ? ObjectM* - звёздочка говорит об выдаче указателя из функции. Переменная хранит указатель.
Если указать без звёздочки объект в функции. То в принципе компилятор жалуется. Что не может выдать, потому что нет конструктора константного.
object of 'class ObjectM' cannot be returned, copy constructor 'ObjectM::ObjectM(const ObjectM &)' not found
Ну тут логика как с простыми переменными. Указатель это просто число.
В Вашем коде, то что сейчас написано, это примерно как ниже
int PrevNode; int NewNode; int GetPrevNode(){return(PrevNode);} GetPrevNode()=NewNode;
Как это должно работать? Ведь результат работы функции это не переменная которой можно что-то потом присвоить. Это и есть значение.
а при комментировании, раскомментировании ваших строк, все получается правильно. PrevNode = NewNode.
Ну тут логика как с простыми переменными. Указатель это просто число.
В Вашем коде, то что сейчас написано, это примерно как ниже
Как это должно работать? Ведь результат работы функции это не переменная которой можно что-то потом присвоить. Это и есть значение.
а при комментировании, раскомментировании ваших строк, все получается правильно. PrevNode = NewNode.
Вы не правы, я об этом даже на ForexPedia статью писал. НЕТ в mql4/5 указателей, есть дескрипторы! Метаквоты сделали большую бяку, когда для нубов назвали дескрипторы указателями. Поэтому мне постоянно идут вопросы, почему указатели из учебника С/С++ работают неправильно?
Если мы работаем в С++, то конструкция (для простейшего примера)
int * pInt; // означает, что создана переменная, в которой МОЖЕТ храниться виртуальный адрес на реальную переменную int. Почему виртуальный? Потому, что со времен Windows NT винда не отдает программисту реальные физические адреса.
Еще жестче поступает виртуалка mql4/5, она поступает, как C#. Вместо хотя бы виртуального адреса, с которым можно провернуть арифметику указателей, MQL возвращает дескрипторы, которые вообще ни на что не указывают (для программиста ). Это просто числа, которые генерирует виртуалка mql4/5, ну как с дескрипторами открытых файлов.
И я согласен с CEO Ренатом, что это правильное решение. Если бы оставили реальные указатели, у здешних горе-программистов наступил бы моральный баттхерт )). А потом пошло бы деление на ноль и прочие ужасы разрыва пукана. Стало страшно, пошел выпить 50 грамм касторки!
Он пытался применить указатели плюсов в MQL5!
Вы не правы, я об этом даже на ForexPedia статью писал. НЕТ в mql4/5 указателей, есть дескрипторы! Метаквоты сделали большую бяку, когда для нубов назвали дескрипторы указателями. Поэтому мне постоянно идут вопросы, почему указатели из учебника С/С++ работают неправильно?
Если мы работаем в С++, то конструкция (для простейшего примера)
int * pInt; // означает, что создана переменная, в которой МОЖЕТ храниться виртуальный адрес на реальную переменную int. Почему виртуальный? Потому, что со времен Windows NT винда не отдает программисту реальные физические адреса.
Еще жестче поступает виртуалка mql4/5, она поступает, как C#. Вместо хотя бы виртуального адреса, с которым можно провернуть арифметику указателей, MQL возвращает дескрипторы, которые вообще ни на что не указывают (для программиста ). Это просто числа, которые генерирует виртуалка mql4/5, ну как с дескрипторами открытых файлов.
И я согласен с CEO Ренатом, что это правильное решение. Если бы оставили реальные указатели, у здешних горе-программистов наступил бы моральный баттхерт )). А потом пошло бы деление на ноль и прочие ужасы разрыва пукана. Стало страшно, пошел выпить 50 грамм касторки!
Он пытался применить указатели плюсов в MQL5!
У меня и так моральный баттхерт. Где найти примеры использования дескрипторов mql5?
Просто, примите к сведению, что функция Ваша возвращает значение-указатель, а не переменную-указатель. Является ли этот указатель адресом памяти или дескриптором сути не меняет.
А какая разница? Если дескриптор - это число. То в принципе там это число и должно прилетать всегда. Но по какой то причине компилятор это число не понимает.
Вы вошли в тему создание указателей на указатель. Чего, как нам ответили нет.
А какая разница? Если дескриптор - это число. То в принципе там это число и должно прилетать всегда. Но по какой то причине компилятор это число не понимает.
Он его прекрасно понимает. Он не может присвоить значению новое значение. Т.к. значение возвращаемое функцией это НЕ переменная. Это значение переменной.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Мой мозг просто сломан.
Такой вопрос:
Есть ObjectM* prevNode; Если использую его, все нормально.
А есть тоже самое с моей точки зрения ObjectM* Prev() {return (prevNode);}
Но на него выходит ошибка ListP (SBER,M1) invalid pointer access in 'ListM.mqh' (64,19)
Если раскомментировать строки 65 и 67 закомментировав 64 66 ошибки не будет. Что делает функция Prev() и Next(), что теряется указатель?
Дальше код все равно не рабочий, что происходит не понимаю в принципе.