Скачать MetaTrader 5

Возникла проблема [при считывании из файла]!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
orb
776
orb  

Есть проблема при считывании из файла, значения в массив присваиваются равными 0, есть подозрения, что кол-во знаков после запятой не то. Код прилагаю, а так же строчку из файла, чтобы было понятно о чем речь идет.

Через Print выдает при тестировании:

Histxmas[0][0]=0; Histxmas[0][1]=0; Histxmas[0][2]=0; Histxmas[0][3]=0. А на картинке видно, что эти значения маленькие, но не равные нулю.

Массив объявлен: double Histxmas[][4];

Код:

 int qq=0;
 while (FileIsEnding(h3)==false)
 {
  Histxmas[qq][0]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",0,"]=",Histxmas[qq][0]);
  Histxmas[qq][1]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",1,"]=",Histxmas[qq][1]);
  Histxmas[qq][3]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",2,"]=",Histxmas[qq][2]);
  Histxmas[qq][4]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",3,"]=",Histxmas[qq][3]);
  qq++;
}

Файл:

Sceptic Philozoff
Модератор
17844
Sceptic Philozoff  
Не вижу, как Вы записывали данные в массив
Histxmas[qq][0]

Точнее, вижу, но почти уверен, что это все, что Вы делали.

Вы пользовались функцией ArrayResize()? Массив недостаточно просто объявить, надо еще и следить за его размером и увеличивать его когда надо (либо сразу, если знаете будущий размер, либо в цикле).

Короче, вот код, который должен работать:
int qq=0;
double Histxmas[ ][5];

 while (FileIsEnding(h3)==false)
 {
  ArrayResize[ Histxmas, qq + 1 ];
  Histxmas[qq][0]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",0,"]=",Histxmas[qq][0]);
  Histxmas[qq][1]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",1,"]=",Histxmas[qq][1]);
  Histxmas[qq][3]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",2,"]=",Histxmas[qq][2]);
  Histxmas[qq][4]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",3,"]=",Histxmas[qq][3]);
  qq++;
}
orb
776
orb  

Заполнение файла, там вроде все как надо...

void SaveSignal()
{
  //формируем предысторию
  int hd=FileOpen("history.csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
  if(hd<1)
      {
      Print("Файл history.csv не найден : ", GetLastError());
      return(false);
      }
  FileSeek(hd, 0, SEEK_END);
  FileWrite(hd,xmas[0],xmas[1],xmas[2],xmas[3]);
  FileClose(hd);
}

Сформировав файл(вроде как надо все там), теперь его надо загнать в массив...

double Histxmas[][4];//массив исторических значений индикатора 
 
 int h3=FileOpen("history.csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h3<1)
      {
       Print("Файл history.csv не найден : ", GetLastError());
       return(false);
      }
/*----------- Блок "Считывание истории из файла" -------------------------*/   
 int qq=0;
 while (FileIsEnding(h3)==false)
 {
  Histxmas[qq][0]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",0,"]=",Histxmas[qq][0]);
  Histxmas[qq][1]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",1,"]=",Histxmas[qq][1]);
  Histxmas[qq][3]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",2,"]=",Histxmas[qq][2]);
  Histxmas[qq][4]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq,"][",3,"]=",Histxmas[qq][3]);
  qq++;
}
 Print("Определили количество строк в ХистМас");
 int N=qq+1;  //Это количество строк массива Histxmas, поэтому можем переопределить его размер
 ArrayResize(Histxmas,N); //переопределяем размер массива исторических значений
 
/*----------- Коней блока "Считывание истории из файла" -------------------*/       

В конце использую функцией ArrayResize(), как в учебнике написано сделал, объявил Histxmax[][4]

Рустам
3597
Рустам  
то то и оно, объявите массив с каким нибудь размером (лучше большим), а потом уменьшайте на сколько надо. И будет вам счастье
Sceptic Philozoff
Модератор
17844
Sceptic Philozoff  

Нет, не так, orb. ArrayResize() нужно пользовать до записи данных в массив - иначе Вы выходите за пределы массива (хотя компилятор и не ругается). Или увеличивать в цикле, если неизвестно, каким будет размер массива.

Во время Вашего цикла размер массива так и остается равным нулю.

Можно делать и так, как советует FAQ, сам так нередко делаю.

orb
776
orb  
а я вроде, все делал как в учебнике)
orb
776
orb  
а все понял, вот я дебил, д эт чай на руку пролил, рассеянное внимание, черт бы его побрал=) спс)
Рустам
3597
Рустам  

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

КУРИМ ДОКУ

orb
776
orb  

вот переделал

/*----------- Блок "Считывание истории из файла" -------------------------*/   
 int qq=1;
 while (FileIsEnding(h3)==false)
 {
  ArrayResize(Histxmas,qq);
  Histxmas[qq-1][0]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq-1,"][",0,"]=",Histxmas[qq-1][0]);
  Histxmas[qq-1][1]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq-1,"][",1,"]=",Histxmas[qq-1][1]);
  Histxmas[qq-1][3]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq-1,"][",2,"]=",Histxmas[qq-1][2]);
  Histxmas[qq-1][4]=StrToDouble(FileReadString(h3));
  Print("Histxmas[",qq-1,"][",3,"]=",Histxmas[qq-1][3]);
  qq++;
}
 Print("Определили количество строк в ХистМас");
 int N=qq;  //Это количество строк массива Histxmas, поэтому можем переопределить его размер
  //переопределяем размер массива исторических значений
 
/*----------- Коней блока "Считывание истории из файла" -------------------*/   
Sceptic Philozoff
Модератор
17844
Sceptic Philozoff  
Маленькая поправка: количество строк массива будет равно qq-1.
orb
776
orb  

2 Mathemat, спс грамотный вы, все замечаете)))проблема теперь при считывании, третье значение не считывается. а третье ставится на 4ое место. плюс еще одна не нужная итерация.

12345
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий