sizeof() вернет количество байт, соответствующих указанному типу данных. Для строки это всегда будет одно и то же значение, т. к. определяется только размер указателя на строку, а не длина строки:
Результат:
Да, только FileWrite. Но тогда придется позаботиться о сериализации строк и их массивов. Наиболее простой вариант - StringToShortArray(). Но это не универсально. Нужно осторожно походить к таким моментам.
Ясно! Спасибо!
Поробовал просто записать, без StringToShortArray()... Вроде пишет int и string без проблем
Что-то какая-то муть. Код должен писать string и int (инты из массива):
int fileHandle=FileOpen("report.txt",FILE_READ|FILE_WRITE|FILE_TXT);
if(fileHandle!=INVALID_HANDLE){
for (int i=0; i<500; i++){
ResetLastError();
int writeErr= FileWrite(fileHandle, " модель: ",i," количество: ",statInfo[i][0][0]," позитивных исходов: ", statInfo[i][1][0], " негативных: ", statInfo[i][2][0]);
if (writeErr!=sizeof(statInfo)& writeErr!=12)
PrintFormat("Ошибка во время записи. Строка: %d Записано байт: %d Код ошибки: %d",i,writeErr, GetLastError());
if (i%100==0){
FileFlush(fileHandle);
PrintFormat("i = %d, OK",i);
}
}
FileClose(fileHandle);
Comment("Данные успешно записаны");
}elsePrintFormat("Не удалось открыть файл, Код ошибки = %d",GetLastError());
Сначала в массиве в первом измерении было 1000.
int statInfo[1000][3][4];
Во время записи постоянно, где-то после половины массива (итерации, приблизительно после 500) скрипт начинал заходить в:
if (writeErr!=sizeof(statInfo)& writeErr!=12)
PrintFormat("Ошибка во время записи. Строка: %d Записано байт: %d Код ошибки: %d",i,writeErr, GetLastError());
Ошибки не печатает (ноль постоянно). Зато печатает байты, непонятно откуда взявшиеся. Типа:
2019.08.05 17:46:31.895 Report EURUSD,H1: Ошибка во время записи. Строка: 553 Записано байт: 64 Код ошибки: 0
2019.08.0517:29:19.096 Report EURUSD,H1: Ошибка во время записи. Строка: 766 Записано байт: 79 Код ошибки: 02019.08.0517:29:19.096 Report EURUSD,H1: Ошибка во время записи. Строка: 765 Записано байт: 71 Код ошибки: 02019.08.0517:29:19.096 Report EURUSD,H1: Ошибка во время записи. Строка: 764 Записано байт: 64 Код ошибки: 0
Решил уменьшить в двое первое измерение, до 500. Не помогло. С половины (приблизительно после 250 шага) итерации ( в данном случае
откуда и покуда не сильно важно - всегда после половины где-то начинается) пишет, что записано 64 байт(иногда - 56), хотя в ячейках массива
стоят нули. Нули так же в отчете:
Далее, ближе к концу итерации, идет в разнобой. В журнале пишет, что записано 79 (или 71,80,84...) байтов (как в примере ранее). В отчете
какие-то циферки появиляются тож:
Так же, в качестве решения, в справке нашел функцию
FileFlush. И поставил чтобы скрипт скидал все на диск после каждой сотой итерации.
if (i%100==0){
FileFlush(fileHandle);
PrintFormat("i = %d, OK",i);
Ну это я так, пальцем в небо. Все равно не помогло.
Последнее что делал: после расчетов, перед записью данных в отчет, все ячейки массива после 230 измерения заполнил нулями :
for (int i=230; i<500; i++){
for (int j=1; j<3; j++){
for (int k=1; k<4; k++){
statInfo[i][j][k]=0;
}}}
Скрипт перестал лить дичь в отчет. Всякие непонятные большие циферки исчезли. Решение грубое и неполноценное, потому как журнал все равно
пишет ошибки. Хотя теперь все данные занимают 64 байта.
2019.08.0518:05:43.560 Report EURUSD,H1: Ошибка во время записи. Строка: 302 Записано байт: 64 Код ошибки: 0
Я пробовал перед расчетами заполнять массив - не помогало.
Хотя при расчетах, мне кажется, дикие циферки не могли появиться. Умножения нет, только простое инкрементирование и запись в массив (при
итерационном цикле от 0 до 6336, число 386005568 не может появится же). Кроме того, большие циферки в отчете не появляются в какой-то
определенной ячейке(согласно массиву) - в разнобой все происходит. То есть, в двух идентичных отчетах, при совершенно одинаковых
параметрах, большие циферки в отчетах появляются в разных местах и с разными значениями. Посмотрите сами в прикрепленных репортах в
конце....
sizeof() вернет количество байт, соответствующих указанному типу данных. Для строки это всегда будет одно и то же значение, т. к. определяется
только размер указателя на строку, а не длина строки:
Результат:
Да, только FileWrite. Но тогда придется позаботиться о сериализации строк и их массивов. Наиболее простой вариант -
StringToShortArray(). Но это не универсально. Нужно осторожно походить к таким моментам.
sizeof() вернет количество байт, соответствующих указанному типу данных. Для строки это всегда будет одно и то же значение, т. к. определяется только размер указателя на строку, а не длина строки:
Результат:
Да, только FileWrite. Но тогда придется позаботиться о сериализации строк и их массивов. Наиболее простой вариант - StringToShortArray(). Но это не универсально. Нужно осторожно походить к таким моментам.
Ясно! Спасибо!
Поробовал просто записать, без StringToShortArray()... Вроде пишет int и string без проблем
Что-то какая-то муть. Код должен писать string и int (инты из массива):
Сначала в массиве в первом измерении было 1000.
Во время записи постоянно, где-то после половины массива (итерации, приблизительно после 500) скрипт начинал заходить в:
Ошибки не печатает (ноль постоянно). Зато печатает байты, непонятно откуда взявшиеся. Типа:
Решил уменьшить в двое первое измерение, до 500. Не помогло. С половины (приблизительно после 250 шага) итерации ( в данном случае откуда и покуда не сильно важно - всегда после половины где-то начинается) пишет, что записано 64 байт(иногда - 56), хотя в ячейках массива стоят нули. Нули так же в отчете:
Далее, ближе к концу итерации, идет в разнобой. В журнале пишет, что записано 79 (или 71,80,84...) байтов (как в примере ранее). В отчете какие-то циферки появиляются тож:
Так же, в качестве решения, в справке нашел функцию FileFlush. И поставил чтобы скрипт скидал все на диск после каждой сотой итерации.
Ну это я так, пальцем в небо. Все равно не помогло.
Последнее что делал: после расчетов, перед записью данных в отчет, все ячейки массива после 230 измерения заполнил нулями :
Скрипт перестал лить дичь в отчет. Всякие непонятные большие циферки исчезли. Решение грубое и неполноценное, потому как журнал все равно пишет ошибки. Хотя теперь все данные занимают 64 байта.
Я пробовал перед расчетами заполнять массив - не помогало.
Хотя при расчетах, мне кажется, дикие циферки не могли появиться. Умножения нет, только простое инкрементирование и запись в массив (при итерационном цикле от 0 до 6336, число 386005568 не может появится же). Кроме того, большие циферки в отчете не появляются в какой-то определенной ячейке(согласно массиву) - в разнобой все происходит. То есть, в двух идентичных отчетах, при совершенно одинаковых параметрах, большие циферки в отчетах появляются в разных местах и с разными значениями. Посмотрите сами в прикрепленных репортах в конце....
Что это может быть?
sizeof() вернет количество байт, соответствующих указанному типу данных. Для строки это всегда будет одно и то же значение, т. к. определяется только размер указателя на строку, а не длина строки:
Результат:
Да, только FileWrite. Но тогда придется позаботиться о сериализации строк и их массивов. Наиболее простой вариант - StringToShortArray(). Но это не универсально. Нужно осторожно походить к таким моментам.
Николай Казанцев в mql4 справочнике очень мало про это ...