Не удалось прочитать файл в структуру MQL5 MT5 - PullRequest
0 голосов
/ 28 мая 2018

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

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

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

1 Ответ

0 голосов
/ 28 мая 2018

Структуры - это простые типы в 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));
  }
...