Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1961

 
ANDREY #:

Переформулирую свой вопрос , что бы он стал более  понятен. 
ВОПРОС Можно ли в mql4  элементу массива присвоить не значение константы, не значение переменной( без самой переменной), а выражение , или переменную вместе с ее значением ?
Например   LoS[0]= х+у ; Где , например изначально эти переменные инициализированы   х = 10, а у = 20 и переменная LoS[0] после присвоения ей выражения  х+у   содержала бы значение  30. То, есть в   LoS[0] должна попадать не только сумма значений  Х и У, но  в   LoS[0] должны попадать и сами переменные  Х и У вместе со своими значениями.
А потом, после изменения в программе значения переменной х с 10 на 30 , значение элемента массива LoS[0]  автоматически стало бы 50 поскольку значение х в коде изменилось на 30.
То есть в этом случае для каждого  изменения значения  LoS[0]  не нужно было бы делать стандартную операцию присвоения  LoS[0]= х+у ; А поскольку  Х и У(как переменные) уже находятся внутри  LoS[0], то изменение значения   LoS[0] происходило бы автоматически , без операции присвоения , после того как в программе изменялось бы значение   Х и(или) У
Если в  LoS[0] попадают только значения  Х и У , то для изменения значения   LoS[0] каждый раз нужно делать операция присвоения. Если в  LoS[0] попадают НЕ только значения  Х и У ,но и сами переменные Х и У , то для изменения значения   LoS[0] каждый раз НЕ нужно делать операция присвоения, но достаточно изменить в коде значение переменных   Х и(или) У.

Нет. Так, как хотите Вы не получится. Так или иначе придется выполнять некий код, который будет менять элементы массива.
Но лично у меня возникает вопрос: зачем нужен массив, если ВСЕ его элементы ВСЕГДА хранят одинаковые значения?
 
ANDREY #:

Переформулирую свой вопрос , что бы он стал более  понятен. 
ВОПРОС Можно ли в mql4  элементу массива присвоить не значение константы, не значение переменной( без самой переменной), а выражение , или переменную вместе с ее значением ?
Например   LoS[0]= х+у ; Где , например изначально эти переменные инициализированы   х = 10, а у = 20 и переменная LoS[0] после присвоения ей выражения  х+у   содержала бы значение  30. То, есть в   LoS[0] должна попадать не только сумма значений  Х и У, но  в   LoS[0] должны попадать и сами переменные  Х и У вместе со своими значениями.
А потом, после изменения в программе значения переменной х с 10 на 30 , значение элемента массива LoS[0]  автоматически стало бы 50 поскольку значение х в коде изменилось на 30.
То есть в этом случае для каждого  изменения значения  LoS[0]  не нужно было бы делать стандартную операцию присвоения  LoS[0]= х+у ; А поскольку  Х и У(как переменные) уже находятся внутри  LoS[0], то изменение значения   LoS[0] происходило бы автоматически , без операции присвоения , после того как в программе изменялось бы значение   Х и(или) У
Если в  LoS[0] попадают только значения  Х и У , то для изменения значения   LoS[0] каждый раз нужно делать операция присвоения. Если в  LoS[0] попадают НЕ только значения  Х и У ,но и сами переменные Х и У , то для изменения значения   LoS[0] каждый раз НЕ нужно делать операция присвоения, но достаточно изменить в коде значение переменных   Х и(или) У.

Нет, это свойство массива, размерность задается числом, не переменной. Индекс это инт число или переменная инт, которая меньше размерности. А элемент массива может хранить у себя  переменные различных типов, которые туда можно записать, и потом перезаписать. Функцию в нашем случае записать в элемент массива нельзя, только результат. Это в других языках тока массивы функций, операций...))) И то это надстройка записи, а в реале сперва вычисляются результаты и потом записываются в массив по адресу.

 
Sergey Gridnev #:
Нет. Так, как хотите Вы не получится. Так или иначе придется выполнять некий код, который будет менять элементы массива.
Но лично у меня возникает вопрос: зачем нужен массив, если ВСЕ его элементы ВСЕГДА хранят одинаковые значения?

Спасибо за ответ. Но в моем предполагаемом массивы значения всех элементов должны меняться постоянно. Но я хотел их менять не традиционным способом, а так как описал в своем посте и так как к сожалению , по вашему мнению, поменять не получится.

 
Valeriy Yastremskiy #:

Нет, это свойство массива, размерность задается числом, не переменной. Индекс это инт число или переменная инт, которая меньше размерности. А элемент массива может хранить у себя  переменные различных типов, которые туда можно записать, и потом перезаписать. Функцию в нашем случае записать в элемент массива нельзя, только результат. Это в других языках тока массивы функций, операций...))) И то это надстройка записи, а в реале сперва вычисляются результаты и потом записываются в массив по адресу.

Понял. Спасибо за помощь. Тогда в связи с этим вопросом хотел бы для себя усвоить такое понятие как ССЫЛКА на  . То есть можно ли в переменную поместить не значение переменной, а ссылку на эту переменную в которой находится значение ? И вообще ... есть ли в mql 4 такое понятие как ССЫЛКА НА . Если есть, то что это такое и на что может быть ССЫЛКА.
Спасибо.

 
ANDREY #:

Понял. Спасибо за помощь. Тогда в связи с этим вопросом хотел бы для себя усвоить такое понятие как ССЫЛКА на  . То есть можно ли в переменную поместить не значение переменной, а ссылку на эту переменную в которой находится значение ? И вообще ... есть ли в mql 4 такое понятие как ССЫЛКА НА . Если есть, то что это такое и на что может быть ССЫЛКА.
Спасибо.

Только на объекты классов. На переменные базовых типов не получится хранить ссылки.
 
Sergey Gridnev #:
Только на объекты классов. На переменные базовых типов не получится хранить ссылки.

Спасибо. А я правильно понимаю, что в mql 4 нет объектов классов и что обычную переменную в  mql 4  нельзя преобразовать в объект класса?

 
ANDREY #:

Спасибо. А я правильно понимаю, что в mql 4 нет объектов классов и что обычную переменную в  mql 4  нельзя преобразовать в объект класса?

1) В MQL4 есть классы и, соответственно, объекты классов.
2) Конечно, можно сделать класс-обёртку для хранения переменной базового типа.
 
Sergey Gridnev #:
1) В MQL4 есть классы и, соответственно, объекты классов.
2) Конечно, можно сделать класс-обёртку для хранения переменной базового типа.

Спасибо за ценную информацию. Как я понял в  MQL4  я могу создать класс объектов и поместить в этот класс одну обычную переменную , после чего эта обычная переменная станет объектом этого класса.

ВОПРОС  А после этого  ссылку на данный объект (переменную со значением) я смогу присвоить элементу массива?

 
ANDREY #:

Спасибо за ценную информацию. Как я понял в  MQL4  я могу создать класс объектов и поместить в этот класс одну обычную переменную , после чего эта обычная переменная станет объектом этого класса.

ВОПРОС  А после этого  ссылку на данный объект (переменную со значением) я смогу присвоить элементу массива?

Амперсанд, ссылка, это ссылка на переменную. Используется, когда в функции вычисляются, именно вычисляются различные переменные, и результат запишется в эти переменные. Без ссылки переменные в функции используются ДЛЯ вычислений.

int FileOpenF(string File_NameArg,int &HandleArg)
  {
   HandleArg=FileOpen(File_NameArg,FILE_CSV|FILE_WRITE,";");//Открытие файла
   if(HandleArg==-1) // Неудача при открытии файла
     {
      Alert("Ошибка при открытии файла. ",File_NameArg,// Сообщение об ошибке
            "Возможно, файл занят другим приложением Handle= ",HandleArg);
     }
   return(HandleArg);
  }
// Вызовы

FileOpenF(File_Name,Handle);
   Alert("Открыт файл. File_Name ",File_Name,
         " Handle ",Handle);
   FileOpenF(File_Name1,Handle1);
   Alert("Открыт файл. File_Name1 ",File_Name1,
         " Handle1 ",Handle1);

Хендл файла вычисляется и записывается в переменную, которая по ссылке входит в аргументы функции.

Без амперсанда запись для 2х разный файлов была бы такая

int FileTest1()
  {
   Handle1=FileOpen(File_Name1,FILE_READ|FILE_CSV|FILE_WRITE,";");//Открытие файла
   if(Handle1==-1) // Неудача при открытии файла
     {
      Alert("Ошибка при открытии файла. ",File_Name1,// Сообщение об ошибке
            "Возможно, файл занят другим приложением");
      return(Handle1);


     }

   return(Handle1);
  }
//+------------------------------------------------------------------+
int FileTest2()
  {
   Handle2=FileOpen(File_Name2,FILE_READ|FILE_CSV|FILE_WRITE,";");//Открытие файла
   if(Handle==-1) // Неудача при открытии файла
     {
      Alert("Ошибка при открытии файла. ",File_Name2,// Сообщение об ошибке
            "Возможно, файл занят другим приложением");
      return(Handle2);


     }

   return(Handle2);
  }

У вас наоборот понимание, по ссылке происходит запись в переменную, а не получение значения переменной.

Про классы лучше почитать сначала. Не все там просто.

Основы объектно-ориентированного программирования
Основы объектно-ориентированного программирования
  • www.mql5.com
Для использования объектно-ориентированного программирования (ООП) вовсе не обязательно знать что такое полиморфизм, инкапсуляция... можно просто пользоваться его возможностями. В статье рассматриваются основные возможности ООП с примерами их использования.
 
Valeriy Yastremskiy #:

Амперсанд, ссылка, это ссылка на переменную. Используется, когда в функции вычисляются, именно вычисляются различные переменные, и результат запишется в эти переменные. Без ссылки переменные в функции используются ДЛЯ вычислений.

Хендл файла вычисляется и записывается в переменную, которая по ссылке входит в аргументы функции.

Без амперсанда запись для 2х разный файлов была бы такая

У вас наоборот понимание, по ссылке происходит запись в переменную, а не получение значения переменной.

Про классы лучше почитать сначала. Не все там просто.

Спасибо большое за развернутое объяснение. Теперь я все понял по своему вопросу.

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