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. Вот так. Кто виноват и что делать? ;)
В этом цикле происходит присвоение значения всем сразу, а не 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-го поста.
А по поводу "побороть смещение". можно посмотреть здесь
Вот последний, сохранившийся после экспериментов код:
#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 кривы, как турецкая сабля, так и фтопку их... Тем более я всегда смущаюсь при их использовании :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Не пойму как такое получается. Может кто-то объяснит.