Скачать MetaTrader 5

Возврат функцией структуры простого типа.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Pavel Trofimov
1816
Pavel Trofimov  

Собственно вопрос простой подскажите как это выглядит? В справке по языку не нашел. Я решаю задачу организации чтения данных из двумерного массива, члены массива целые числа. Для чтения из такого массива, я создал соответствующую структуру. Объявил функцию чтения этого же типа и застрял в элементарном вопросе синтаксиса команды return.

...
  //объявил массив 
  double            UpPoints[][2]; //Двумерный массив с верхними точками (индекс точки, размерность)
...
  //объявил структуру
   struct            points;
     {
     int             index;//идекс бара точки
     int             dim;  //размерность точки 
     };
...
 //объявил метод класса типа points
 // Метод свойство - чтение из двухмерного массива
   points            ReadFromArray(int temp_i);//чтение структуры из массива по индексу
...
//+------------------------------------------------------------------+
//| Method ReadFromArray                                             |
//+------------------------------------------------------------------+   
points CKeyFinder::ReadFromArray(int temp_i);
   {
   if (temp_i>=0) return (points.index=UpPoints[i][1],points.dim=UpPoints[i][2])
   else return (points.index=0,points.dim=0);
   }

Вот только в правильности синтаксиса в методе сомневаюсь. Оператор this к структурам не применяется. Кто если делал, что-то подобное- подскажите, как правильно. Заранее премного благодарен.

Sergey Eremin
4449
Sergey Eremin  

Можно сделать примерно так:

   void            ReadFromArray(int temp_i, points &result);//чтение структуры из массива по индексу
...
//+------------------------------------------------------------------+
//| Method ReadFromArray                                             |
//+------------------------------------------------------------------+   
void CKeyFinder::ReadFromArray(int temp_i, points &result)
{ 
...
} 
Pavel Trofimov
1816
Pavel Trofimov  
ENSED:

Можно сделать примерно так:

Т.е. скинуть результат через указатель. Спасибо, попробую.
Sergey Eremin
4449
Sergey Eremin  
Rubick:
Т.е. скинуть результат через указатель?

Да, только выше я предлагаю передавать параметр не по указателю (*), а по ссылке(&).

Я могу ошибаться по текущим реалиям, но вроде MQL4/5 не даёт объявлять методы/функции с возвратом на основе структур. Если ошибаюсь, то, надеюсь, меня поправят.

Pavel Trofimov
1816
Pavel Trofimov  
ENSED:

Да, только выше я предлагаю передавать параметр не по указателю (*), а по ссылке(&).

Я могу ошибаться по текущим реалиям, но вроде MQL4/5 не даёт объявлять методы/функции с возвратом на основе структур. Если ошибаюсь, то, надеюсь, меня поправят.

В справке написано, что простые структуры на числовых типах можно:

"Можно возвращать простые типы, простые  структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур."

Sergey Eremin
4449
Sergey Eremin  
Rubick:

В справке написано, что простые структуры на числовых типах можно:

"Можно возвращать простые типы, простые  структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур."

Не поленился, проверил. Действительно можно.
Только у Вас пара опечаток и некоторые ошибки (например, ";" в конце некоторых строк там, где быть не должно, или что в методе следует создать экземляр структуры и его вернуть).

Вот рабочий вариант:

class CKeyFinder
{
   private:
      double            UpPoints[][2]; //Двумерный массив с верхними точками (индекс точки, размерность)
      
      //объявил структуру
      struct            points
        {
        int             index;//идекс бара точки
        int             dim;  //размерность точки 
        };
        
   public:
      //объявил метод класса типа points
      // Метод свойство - чтение из двухмерного массива
      points            ReadFromArray(int temp_i);//чтение структуры из массива по индексу
};
//+------------------------------------------------------------------+
//| Method ReadFromArray                                             |
//+------------------------------------------------------------------+   
points CKeyFinder::ReadFromArray(int temp_i)
{
   points result;
   if (temp_i>=0)
   {
      result.index = UpPoints[temp_i][1];
      result.dim = UpPoints[temp_i][2];
   }
   else 
   {
      result.index = 0;
      result.dim = 0;
   }
   return result;
}

По крайней мере компилируется :)

Andrey Ziablytsev
1720
Andrey Ziablytsev  
Rubick:
//+------------------------------------------------------------------+
//| Method ReadFromArray                                             |
//+------------------------------------------------------------------+   
points CKeyFinder::ReadFromArray(int temp_i);
   {
   if (temp_i>=0) return (points.index=UpPoints[i][1],points.dim=UpPoints[i][2])
   else return (points.index=0,points.dim=0);
   }

Кстати то что вы тут пытаетесь вернуть из функции, это результат присваивания значений элементам структуры. Обычно это true ;) 

Pavel Trofimov
1816
Pavel Trofimov  
ENSED:
Не поленился, проверил. Действительно можно.
Только у Вас пара опечаток и некоторые ошибки (например, ";" в конце некоторых строк там, где быть не должно, или что в методе следует создать экземляр структуры и его вернуть).

Вот рабочий вариант:

По крайней мере компилируется :)

diushych:

Кстати то что вы тут пытаетесь вернуть из функции, это результат присваивания значений элементам структуры. Обычно это true ;) 

Огромное спасибо за помощь! Думаю, тема закрыта.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий