Не удалось прочитать файл в структуру MQL5 MT5

Я пытаюсь прочитать файл в структуру, но не могу, так как произошла ошибка компиляции. Посмотрите, что я пробовал:

struct file_row_struct
{
   datetime file_time;
   string file_range_green;
   string file_range_red;
   double file_dist_green_red;
   double file_slope_green;
   double file_slope_red;
   string file_prev_color;
   string file_current_color;   
}filerow[];

int size = 1;
FileReader = FileOpen(file_read_path,FILE_READ|FILE_CSV,','); 
   if(FileReader != INVALID_HANDLE)
   {
   //while(!FileIsEnding(FileReader))
   //   linecount++;
   while(!FileIsEnding(FileReader))
      {
         FileReadStruct(FileReader,filerow,size); 
         size++; 

      }   
   Print("File Opened successfully");
   //PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
   FileClose(FileReader);
   }
   else Print("Not Successful in opening file:  %s  ", GetLastError());

Суть файла примера доступна по адресу: Пример данных

Ошибка компиляции, с которой я столкнулся, выглядит следующим образом:

'filerow' - structures containing objects are not allowed   NeuralExpert.mq5    108 36

Пожалуйста, подскажите, в чем я ошибся. Я предполагаю, что в структуре есть функция-член строки, поэтому она не позволяет.


person Jaffer Wilson    schedule 28.05.2018    source источник


Ответы (1)


Структуры — это простые типы в MQL. Это означает, что вы можете иметь в нем целочисленные и плавающие значения всех типов (все, что приводит к ulong и double) и некоторые другие. Это также означает, что в нем не может быть строк и других структур. Если у вас есть строки в структуре - вы не можете пройти по ссылке и много других проблем (поэтому лучше сказать сложные типы не поддерживаются в структурах, они у вас все равно могут быть, но ваша ответственность сделать все правильно).
Поскольку вы не можете передавать структуры по ссылке, вы не можете использовать FileReadStruct().
Что делать? Я бы предложил использовать класс CObject-based и CArrayObj для их хранения вместо filerow[].

class CFileRow : public CObject
   {
//8 fields
public:
    CFileRow(const string line)
      {
      //convert string line that you are to read from file into class
      }
    ~CFileRow(){}
   };
CArrayObj* fileRowArray = new CArrayObj();

while(!FileIsEnding(FileReader))
  {
     string line=FileReadString(FileReader);
     fileRowArray.Add(new CFileRow(line));
  }
person Daniel Kniaz    schedule 28.05.2018