Глюки ? со строковым массивом.

 
#import "kernel32.dll"
   int _lopen  (string path, int of);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, string buffer, int bytes);
   int _lclose (int handle);
#import

string Symbols[5];                      // массив в котором будут хранится символы
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
   int i,size,handle;
   string symb="symbols     ",path;
//-----------------------------------------
   size=1936;
   path=StringConcatenate(TerminalPath(),"\\history\\",AccountServer(),"\\symbols.raw");
//Print(path);
   handle=_lopen(path,0);
   if(handle<0) Print("Ошибка открытия файла symbols.raw : ",GetLastError());
   for(i=0;i<5;i++){
      _llseek(handle,i*size,0);
      _lread(handle,symb,12);
      Symbols[i]=symb;
      Print("1 Symbols[",i,"]=",Symbols[i]);
   }
   _lclose(handle);
   for(i=0;i<5;i++) {
      Print("2 Symbols[",i,"]=",Symbols[i]);
   }
   Print("Ошибка : ",GetLastError());
   return;
}
//+------------------------------------------------------------------+

Не пойму как такое получается. Может кто-то объяснит.

 
Talex >>:

Не пойму как такое получается. Может кто-то объяснит.

А если в ините сделать типа такого?

   for(i=0;i<5;i++){
      Symbols[i]="";
 
В ините, тоже не помогает, да он и не причем тут.
 
string Symbols[5]=
{
  "11111111111111111111111111111"
  ,"22222222222222222222222222222"
  ,"33333333333333333333333333333"
  ,"44444444444444444444444444444"
  ,"55555555555555555555555555555"
};

..............

  int n= 0;
  for( n= 0; n< 5; n++)
  {
    Symbols[n]="Symbols_"+n;
  }//_for
  for( n= 0; n< 5; n++)
  {
    Print("+++ n=",n
      ," Symbols=",Symbols[n]);
  }//_for

.......
+++ n=0 Symbols=Symbols_0
мож так!?
 

Уважаемые разработчики, прокомментируйте, пожалуйста, что это за ошибка, у меня или у Вас?

И еще. Пустяк, но все же. В метаэдиторе следущая строка выглядит не корректно, но вроде работает нормально.


 
...
for(i=0;i<5;i++){
      _llseek(handle,i*size,0);
      _lread(handle,symb,12);
      Symbols[i]=symb;
      Print("1 Symbols[",i,"]=",Symbols[i]);
   }
...
В этом цикле происходит присвоение значения всем сразу, а не i-му, элементам массива значения переменной symb. Вот так. Кто виноват и что делать? ;)
 
Talex писал(а) >>
В этом цикле происходит присвоение значения всем сразу, а не i-му, элементам массива значения переменной symb. Вот так. Кто виноват и что делать? ;)

Наши вопросы :) Кто виноват - показал бы пальцем, но... нервно реагируют, млин :) Что делать? Открываем книжку Чернышевского "Что делать?" на стр. ..., млин забыл какой. Читаем:

Надо принудительно инициализировать массив, причем не str (тем более не ""), а int. Например, тем же самым i. Можно даже не весь массив, а поэлементно, по ходу дела.

      sSym[i] = i;
      _llseek  (iHandle, i * iSize,    0);
      _lread   (iHandle, sSym[i],     12);

Тогда без промежутков все можно загонять сразу в массив. У меня, по крайней мере, получилось.

2009.07.18 07:55:29 _s_SymList EURAUD,M1: Filled: AUDNZD
2009.07.18 07:55:29 _s_SymList EURAUD,M1: Filled: AUDJPY
2009.07.18 07:55:29 _s_SymList EURAUD,M1: Filled: AUDDKK
2009.07.18 07:55:29 _s_SymList EURAUD,M1: Filled: AUDCHF
2009.07.18 07:55:29 _s_SymList EURAUD,M1: Filled: AUDCAD

Короче, опять лечим ж... через гланды. Или наоборт :) ?

За эту байду терки уже вели 'Проблему с массивом строк не могу понять ...'

.

P.S. Спасибо за добротную заготовку. Я боюсь этих dll, как огня :)

Кстати, попробуй проинициализировать не int 1, а str "1" - интересный результат получится :)

 

В попытках получить описание инструмента не смог побороть передаваемое смещение :((

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

void MarketInfoToSymbols() 
{
int      i, j, iHandle, iField[2], iRecLen, iRecQty;
string   sPath, sSym[][2];
   
   sPath       = "Symbols.raw";
   iRecLen     = 1936;  // lentgh of sym record
   iField[0]   = 12;    // sym name offset
   iField[1]   = 68;    // sym desc offset
   //iField[2]   = 0;     // sym group offset
   
   iHandle = FileOpenHistory(sPath, FILE_BIN|FILE_READ);
   iRecQty = FileSize(iHandle) / iRecLen;
   ArrayResize(sSym, iRecQty);
   
   //FileSeek(iHandle, i * iRecLen, SEEK_SET); // 4 sequential seek
   for(i = 0; i < iRecQty; i++)
      {
      FileSeek(iHandle, i * iRecLen, SEEK_SET);
      for(j = 0; j < ArrayRange(iField, 0); j++)
         {
         //sSym[i][j] = i; // playsafe
         sSym[i][j] = FileReadString(iHandle, iField[j]);
         }
      //FileSeek(iHandle, iRecLen - iField[0] - iField[1], SEEK_CUR); // 4 sequential seek
      }
   
   FileClose(iHandle);
   
   //for(i = 0; i < 5; i++) {
   for(i = 0; i < ArrayRange(sSym, 0); i++) {
      Print("Filled: ", sSym[i][0], " - ", sSym[i][1]);}
   
return(0);
}
 

to Babay. Может я чего-то не понял, но инициализируй хоть "" или "1" или int 1, результат получается один и тот же, из 1-го поста.

А по поводу "побороть смещение". можно посмотреть здесь

 
Talex писал(а) >>

to Babay. Может я чего-то не понял, но инициализируй хоть "" или "1" или int 1, результат получается один и тот же, из 1-го поста.

А по поводу "побороть смещение". можно посмотреть здесь

Вот последний, сохранившийся после экспериментов код:

#import "kernel32.dll"
   int _lopen  (string sPath, int of);
   int _llseek (int iHandle, int offset, int origin);
   int _lread  (int iHandle, string buffer, int bytes);
   int _lclose (int iHandle);
#import

//+------------------------------------------------------------------+
//| start() - script program start function
//+------------------------------------------------------------------+
int start()
{
   MarketInfoToSymbols();
return(0);
}

//--------------------------------------

void MarketInfoToSymbols() 
{

int      i, j, iHandle, iField[3], iRecLen, iRecQty, iSymQty;
string   sSym[][2], sPath; 

   sPath     = "Symbols.raw";
   iRecLen   = 1936;
   iField[0] = 12;   // offset for Symbol name
   iField[1] = 68;   // offset for Symbol description
   //iField[2] = ???;   // offset for Symbol group

   sPath = StringConcatenate(TerminalPath(), "\\history\\", AccountServer(), "\\Symbols.raw");
   
   iHandle = _lopen(sPath, 0);
   iSymQty = _llseek(iHandle, 0, 2) / iRecLen;
   ArrayResize(sSym, iSymQty);
   
   for(i = 0; i < iSymQty; i++)
      {
      sSym[i][0] = "";  // not work
      //sSym[i][0] = "1"; // not work
      //sSym[i][0] = 1;   // work 
      //sSym[i][0] = i;   // work
      
      //sSym[i][1] = i;
      
      _llseek  (iHandle, i * iRecLen, 0);
      _lread   (iHandle, sSym[i][0], iField[0]);
      
      //_llseek  (iHandle, 0,  1);
      //_lread   (iHandle, sSym[i][1],   36);
      }
   _lclose(iHandle);

   //for(i = 0; i < iSymQty; i++) {Print("Filled: ", sSym[i][0]);}
   for(i = 0; i < 5; i++) {Print("Filled: ", sSym[i][0], " - ", sSym[i][1]);}
   
   return(0);
}


Ну... При sSym[i][0] = "" результат получается, как у тебя. При str "1" - как-то странно подрезает первый символ, цепляет какую-то хрень и не пишет "Filled", что вообще странно!

2009.07.18 21:58:11 _s_SymList_Dll EURAUD,M1: ZU9 -
2009.07.18 21:58:11 _s_SymList_Dll EURAUD,M1: ZU9 -
2009.07.18 21:58:11 _s_SymList_Dll EURAUD,M1: ZU9 -
2009.07.18 21:58:11 _s_SymList_Dll EURAUD,M1: ZU9 -
2009.07.18 21:58:11 _s_SymList_Dll EURAUD,M1: ZU9 -

При интеграх - все ОК.

2009.07.18 21:54:41 _s_SymList_Dll EURAUD,M1: Filled: AUDNZD -
2009.07.18 21:54:41 _s_SymList_Dll EURAUD,M1: Filled: AUDJPY -
2009.07.18 21:54:41 _s_SymList_Dll EURAUD,M1: Filled: AUDDKK -
2009.07.18 21:54:41 _s_SymList_Dll EURAUD,M1: Filled: AUDCHF -
2009.07.18 21:54:41 _s_SymList_Dll EURAUD,M1: Filled: AUDCAD -

Извини за "почерк" - мне в венгерской нотации удобней, да и чужое я со скрипом читаю ;)

Ссылочку я поглядел, но уже не так интересно и важно, коль штатными средствами сделано (надо только еще быстродействие проверить). А коль эти длл-ы в компоте с MQL кривы, как турецкая сабля, так и фтопку их... Тем более я всегда смущаюсь при их использовании :)

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