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

[Удален]  
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 разных файла, а открываете только один. Простите.... слов приличных нет.

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

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

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

Но читается массив от начала до конца. Как вы его разбиваете на 3 части? Как вы записали структуру и в тот-же файл умудрились записать массив? Я самоучка, много чего не знаю, но то, что это разные форматы данных, как-то подозреваю.

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

[Удален]  
Alexey Viktorov:

Но читается массив от начала до конца. Как вы его разбиваете на 3 части? Как вы записали структуру и в тот-же файл умудрились записать массив? Я самоучка, много чего не знаю, но то, что это разные форматы данных, как-то подозреваю.

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

Я же говорю, если в один файл записать только 1 структуру и 3 массива, то потом их оттуда можно прочитать (с условием, что для чтения массивов нужно указать размер каждого из них). Но вот фокус с записью и последующим чтением нескольких таких последовательностей у меня не прокатил. Возможно, нужно двигать указатель, но это уже напряжно...

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

Я же говорю, если в один файл записать только 1 структуру и 3 массива, то потом их оттуда можно прочитать (с условием, что для чтения массивов нужно указать размер каждого из них). Но вот фокус с записью и последующим чтением нескольких таких последовательностей у меня не прокатил. Возможно, нужно двигать указатель, но это уже напряжно...

Как это напряжно? Лошадиных сил не хватает? А как вы можете быть уверены что запись прошла успешно и как вы это предполагаете, если прочесть не получилось? Насколько мне известно .bin файл глазками не посмотришь.

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

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

Нет, пока примеров не будет - сам ещё не делал, и когда буду делать, буду описывать в статьях. И будет ещё не скоро. Факт в том, что записывать в файл при помощи FileWriteStruct() можно только POD-структуры. Т.е. - простые структуры, не содержащие строки, динамические массивы, виртуальные функции, а также указатели на объекты и функции.

А это значит, что нужно придумывать и тестировать. Но направление я написал. Над реализацией нужно думать.

 
Artyom Trishkin:

Нет, пока примеров не будет - сам ещё не делал, и когда буду делать, буду описывать в статьях. И будет ещё не скоро. Факт в том, что записывать в файл при помощи FileWriteStruct() можно только POD-структуры. Т.е. - простые структуры, не содержащие строки, динамические массивы, виртуальные функции, а также указатели на объекты и функции.

А это значит, что нужно придумывать и тестировать. Но направление я написал. Над реализацией нужно думать.

Выходит что как ни крути, а задача не решаема. Ведь у Сергея в примере внутри три динамических массива. Хоть как выстраивай структуру в структуре, она так и останется с динамическим массивом.

А вот если создать массив структур, то проблема решается записью массива. FileWriteArray(). Это уже проверено и в документации чётко сказано о записи массива структур.

 
Alexey Viktorov:

Но читается массив от начала до конца. Как вы его разбиваете на 3 части? Как вы записали структуру и в тот-же файл умудрились записать массив? Я самоучка, много чего не знаю, но то, что это разные форматы данных, как-то подозреваю.

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

в бинарный файл можете писать любые структуры, массивы, даже отдельные переменные - и все в один файл

НО при чтении Вы должны именно в этом же порядке и читать данные

все будет работать

не смотрел дамп файла при записи с помощью FileWriteArray() , скорее всего размер массива в первых байтах будет записан - но проще просто тестовый скрипт составить, там с десяток строк кода ;)