Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1200

 

Ещё вопрос.

Есть структура

struct Fann
{
   int      answer;
   double   v_main_up;
   double   v_add_up;
   double   v_main_dn;
   double   v_add_dn;
   double   data_1[];
   double   data_2[];
   double   data_3[];
};
Fann vfann;

Я её заполнил и хочу сохранить в файл.

FileWriteStruct(filehandle,vfann);

Компилятор ругается - 'vfann' - structures or classes containing objects are not allowed

Я так понимаю, ему не нравятся массивы. А как можно сохранить эту структуру?
 
Сергей Таболин:

Ещё вопрос.

Есть структура

Я её заполнил и хочу сохранить в файл.

Компилятор ругается - 'vfann' - structures or classes containing objects are not allowed

Я так понимаю, ему не нравятся массивы. А как можно сохранить эту структуру?

Да, массивов не должно быть. FileWriteStruct

... Структура не должна содержать строки, динамические массивывиртуальные функции, а также указатели на объекты и функции.

Документация по MQL5: Файловые операции / FileWriteStruct
Документация по MQL5: Файловые операции / FileWriteStruct
  • www.mql5.com
//|                                          Demo_FileWiteStruct.mq5 | //|                        Copyright 2013, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Структура для хранения данных свечи                              |...
 
Сергей Таболин:

Ещё вопрос.

Есть структура

Я её заполнил и хочу сохранить в файл.

Компилятор ругается - 'vfann' - structures or classes containing objects are not allowed

Я так понимаю, ему не нравятся массивы. А как можно сохранить эту структуру?
Создать структуру, в которой вместо массивов будет структура. Сначала каждый массив упаковать в свою структуру. Затем полученную структуру упаковать в результирующую структуру. Распаковывать в обратном порядке.
 
Сергей Таболин:

Я так понимаю, ему не нравятся массивы. А как можно сохранить эту структуру?

переводить в текст, сохранять поэлементно.

 
Artyom Trishkin:
Создать структуру, в которой вместо массивов будет структура. Сначала каждый массив упаковать в свою структуру. Затем полученную структуру упаковать в результирующую структуру. Распаковывать в обратном порядке.
Igor Zakharov:

переводить в текст, сохранять поэлементно.

Спасибо.

А если сделать так:

struct Fann
{
   int      answer;
   double   v_main_up;
   double   v_add_up;
   double   v_main_dn;
   double   v_add_dn;
};
Fann vfann;

   double   data_1[];
   double   data_2[];
   double   data_3[];
...........................
      FileWriteStruct(filehandle,vfann);
      FileWriteArray(filehandle,data_1);
      FileWriteArray(filehandle,data_2);
      FileWriteArray(filehandle,data_3);

FILE_BIN 

Потом так же по порядку это всё можно будет считать в структуру и массивы?

А если таких записей несколько?

 
Сергей Таболин:

Спасибо.

А если сделать так:

FILE_BIN 

Потом так же по порядку это всё можно будет считать в структуру и массивы?

А если таких записей несколько?

Ну да. В том совете я тоже не смог влёт разобраться. Если вообще никак, то можно и так сделать. Но всё-же лучше разобраться как сделать структуру внутри структуры. Достаточно спросить как это сделать. Заодно и я чего-то ещё узнаю...

 
Alexey Viktorov:

Ну да. В том совете я тоже не смог влёт разобраться. Если вообще никак, то можно и так сделать. Но всё-же лучше разобраться как сделать структуру внутри структуры. Достаточно спросить как это сделать. Заодно и я чего-то ещё узнаю...

Спрашиваю ))))

Попробовал сделать "по своему".

Первая структура и 3 массива считываются нормально (при условии, что массивы приёмники не динамические, иначе в первый массив считываются все данные, записанные после структуры).

Однако, если записей больше, то 

   // Проверка
   double   rdata_1[6];
   double   rdata_2[6];
   double   rdata_3[6];
   
   filehandle = FileOpen(filename,FILE_READ|FILE_COMMON|FILE_BIN);
   if(filehandle != INVALID_HANDLE)
   {
      while(!FileIsEnding(filehandle))
      {
         FileReadStruct(filehandle,rfann);
         FileReadArray(filehandle,rdata_1);
         FileReadArray(filehandle,rdata_2);
         FileReadArray(filehandle,rdata_3);
         Print("++++++++++++++++++++++++++++++");
         Print("Структура");
         Print(rfann.v_main_up+"|"+rfann.v_main_dn+"|"+rfann.v_add_up+"|"+rfann.v_add_dn+"|"+rfann.answer);
         Print("Массивы");
         Print("--- 1");
         ArrayPrint(rdata_1);
         Print("--- 2");
         ArrayPrint(rdata_2);
         Print("--- 3");
         ArrayPrint(rdata_3);
      }
   }

выдаёт чёрте чё...

Структура
4.0|-1.0|2.8|-0.7|1
Массивы
--- 1
 1.00000  0.33225 -0.76202 -0.93263 -1.00000 -0.79174
--- 2
-0.14603  0.89562  0.91407  0.93450  0.89481  0.89829
--- 3
 0.89564  0.89217 -0.91174 -0.86623 -1.00000 -0.07680
++++++++++++++++++++++++++++++
Структура
1.839259944929932e+277|-nan|5.295254096666168e-315|3.0|-618173028
Массивы
--- 1
 2.10000 -2.00000 -1.40000 -0.85098 -1.00000 -0.79900
--- 2
-0.30490  0.47926  1.00000  0.70827  0.84163  0.84134
--- 3
 0.83925  0.84173  0.84760  0.84678  0.80368 -0.00063
++++++++++++++++++++++++++++++
Структура
9.384173261527221e-276|5.298850499315376e-315|2.955277867691187e+299|-9.638234784517503e-243|-1705145188
Массивы
--- 1
+0.00000 +0.00000  4.00000  2.80000  0.00000  0.00000
--- 2
 1.00000  0.22097 -0.37383 -0.73115 -0.81752 -1.00000
--- 3
-0.87753  0.46919  0.59706  0.76223  0.82610  0.84312
++++++++++++++++++++++++++++++
 
Artyom Trishkin:
Создать структуру, в которой вместо массивов будет структура. Сначала каждый массив упаковать в свою структуру. Затем полученную структуру упаковать в результирующую структуру. Распаковывать в обратном порядке.

Артём, можно пример? С учётом, что размер массивов динамический.

 
Сергей Таболин:

Спрашиваю ))))

Попробовал сделать "по своему".

Первая структура и 3 массива считываются нормально (при условии, что массивы приёмники не динамические, иначе в первый массив считываются все данные, записанные после структуры).

Однако, если записей больше, то 

выдаёт чёрте чё...

Вы пытаетесь писать 4 разных файла, а открываете только один. Простите.... слов приличных нет.

 
Alexey Viktorov:

Вы пытаетесь писать 4 разных файла, а открываете только один. Простите.... слов приличных нет.

Я пишу всё в один файл. Запись, с последующим чтением, нескольких структур в один файл проходит нормально.

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