Объясните мне указатели. Ничего не понимаю. Пишу Лист

 

Мой мозг просто сломан. 

Такой вопрос:

Есть  ObjectM*           prevNode; Если использую его, все нормально.

А есть тоже самое с моей точки зрения  ObjectM*  Prev()   {return (prevNode);}

Но на него выходит ошибка ListP (SBER,M1) invalid pointer access in 'ListM.mqh' (64,19)

Если раскомментировать строки 65 и 67 закомментировав 64 66 ошибки не будет. Что делает функция  Prev()  и Next(), что теряется указатель? 

Дальше код все равно не рабочий, что происходит не понимаю в принципе. 



Файлы:
ListM.mqh  15 kb
ListP.mq5  6 kb
 
vbymrf:

Мой мозг просто сломан. 

Такой вопрос:

Есть  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.
Улавливаете разницу?
 
Sergey Gridnev #:
Ваша функция возвращает значение, которое содержится в переменной prevNode, а не ссылку на переменную prevNode.
Улавливаете разницу?

Можете объяснить. Каких случаях я получаю сам объект, а в каких указатель ?  ObjectM* - звёздочка говорит об выдаче указателя из функции. Переменная хранит указатель. 

Если указать без звёздочки объект в функции. То в принципе компилятор жалуется. Что не может выдать, потому что нет конструктора константного.

object of 'class ObjectM' cannot be returned, copy constructor 'ObjectM::ObjectM(const ObjectM &)' not found

Т.е. я  в принципе не знаю, как получить объект. А вы говорите, что он мне хочет его выдать.
 
vbymrf #:

Можете объяснить. Каких случаях я получаю сам объект, а в каких указатель ?  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.

 
Andrey Barinov #:

Ну тут логика как с простыми переменными. Указатель это просто число.

В Вашем коде, то что сейчас написано, это примерно как ниже

Как это должно работать? Ведь результат работы функции это не переменная которой можно что-то потом присвоить. Это и есть значение.

а при комментировании, раскомментировании ваших строк, все получается правильно. PrevNode = NewNode.

Вы не правы,  я об этом даже на ForexPedia статью писал. НЕТ в mql4/5 указателей, есть дескрипторы! Метаквоты сделали большую бяку, когда для нубов назвали дескрипторы указателями. Поэтому мне постоянно идут вопросы, почему указатели из учебника С/С++ работают неправильно?

Если мы работаем в С++, то конструкция (для простейшего примера)

int * pInt; // означает, что создана переменная, в которой МОЖЕТ храниться виртуальный адрес на реальную переменную int. Почему виртуальный? Потому, что со времен Windows NT винда не отдает программисту реальные физические адреса. 

Еще жестче поступает виртуалка mql4/5, она поступает, как C#. Вместо хотя бы виртуального адреса, с которым можно провернуть арифметику указателей, MQL возвращает дескрипторы, которые вообще ни на что не указывают (для программиста ). Это просто числа, которые генерирует  виртуалка mql4/5, ну как с дескрипторами открытых файлов.

И я согласен с CEO Ренатом, что это правильное решение. Если бы оставили реальные указатели, у здешних горе-программистов наступил бы моральный баттхерт )). А потом пошло бы деление на ноль и прочие ужасы разрыва пукана. Стало страшно, пошел выпить 50 грамм касторки! 

Он пытался применить указатели плюсов в MQL5! 



 
Alexey Volchanskiy #:

Вы не правы,  я об этом даже на ForexPedia статью писал. НЕТ в mql4/5 указателей, есть дескрипторы! Метаквоты сделали большую бяку, когда для нубов назвали дескрипторы указателями. Поэтому мне постоянно идут вопросы, почему указатели из учебника С/С++ работают неправильно?

Если мы работаем в С++, то конструкция (для простейшего примера)

int * pInt; // означает, что создана переменная, в которой МОЖЕТ храниться виртуальный адрес на реальную переменную int. Почему виртуальный? Потому, что со времен Windows NT винда не отдает программисту реальные физические адреса. 

Еще жестче поступает виртуалка mql4/5, она поступает, как C#. Вместо хотя бы виртуального адреса, с которым можно провернуть арифметику указателей, MQL возвращает дескрипторы, которые вообще ни на что не указывают (для программиста ). Это просто числа, которые генерирует  виртуалка mql4/5, ну как с дескрипторами открытых файлов.

И я согласен с CEO Ренатом, что это правильное решение. Если бы оставили реальные указатели, у здешних горе-программистов наступил бы моральный баттхерт )). А потом пошло бы деление на ноль и прочие ужасы разрыва пукана. Стало страшно, пошел выпить 50 грамм касторки! 

Он пытался применить указатели плюсов в MQL5! 



У меня и так моральный баттхерт. Где найти примеры использования дескрипторов mql5?

 
vbymrf #:

У меня и так моральный баттхерт. Где найти примеры использования дескрипторов mql5?

Просто, примите к сведению, что функция Ваша возвращает значение-указатель, а не переменную-указатель. Является ли этот указатель адресом памяти или дескриптором сути не меняет.
 
Sergey Gridnev #:
Просто, примите к сведению, что функция Ваша возвращает значение-указатель, а не переменную-указатель. Является ли этот указатель адресом памяти или дескриптором сути не меняет.

А какая разница? Если дескриптор - это число. То в принципе там это число и должно прилетать всегда. Но по какой то причине компилятор это число не понимает. 

Вы вошли в тему создание указателей на указатель. Чего, как нам ответили нет.

 
Я могу уже только гадать. Как это все работает. Может она создает указатель  на указатель? Но как тогда мне привести его?
 
vbymrf #:

А какая разница? Если дескриптор - это число. То в принципе там это число и должно прилетать всегда. Но по какой то причине компилятор это число не понимает. 

Он его прекрасно понимает. Он не может присвоить значению новое значение. Т.к. значение возвращаемое функцией это НЕ переменная. Это значение переменной.

 
Andrey Barinov #:

Он его прекрасно понимает. Он не может присвоить значению новое значение. Т.к. значение возвращаемое функцией это НЕ переменная. Это значение переменной.

Почему же тогда я не могу присвоить переменной типа объект ? Получаю туже ошибку. 

Причина обращения: