Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Миллионы трейдеров качают коды из библиотеки MQL5. Поделись своей программой!
alexandr
44
alexandr 2014.01.15 06:10 
int myGetAllSymbols(string &Symbols[], bool Selected,double maxspread)
{  
   string SymbolsFileName;  
   int SymbolsNumber,Offset; 
   
   if(Selected) SymbolsFileName = "symbols.sel";
   else         SymbolsFileName = "symbols.raw";
   
   int hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ);
   
   if(hFile < 0) return(-1);
   
   if(Selected) { SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116;  }
   else         { SymbolsNumber = FileSize(hFile) / 1936;      Offset = 1924; }
   
   //ArrayResize(Symbols, SymbolsNumber);
   
   if(Selected) FileSeek(hFile, 4, SEEK_SET);
   int j=0;   
   for(int i = 0; i < SymbolsNumber; i++){ 
         
      string smb = FileReadString(hFile, 12);
      
      if(smb!=""){
         if(MarketInfo(smb,MODE_ASK)-MarketInfo(smb,MODE_BID)<maxspread*p(smb) || maxspread==0){
            ArrayResize(Symbols, j+1);
            Symbols[j]=smb;
            j++;
         }
      }
      
      FileSeek(hFile, Offset, SEEK_CUR);   
   }
   
   FileClose(hFile);
   
   return(SymbolsNumber);
}  
как теперь передать динамический массив строк? не работает вышеуказанная функция, в мт4 работала, в отладчике данные получаю, но массив размер не изменяет и размер остается 0м у массива строк Symbols
и все функции, которые передавали в массив строк данные теперь не работают в новой версии языка. т.е. любая функция которая объявлена как void test(string &t[]); не работает, размер массива не меняется. 
Это баг или нужно теперь как то иначе работать со строковыми динамическими массивами?
Slawa
Модератор
6748
Slawa 2014.01.15 06:53  

Оппа. Жалобы на то, что некий хак перестал работать...

   if(Selected) SymbolsFileName = "symbols.sel";
   else         SymbolsFileName = "symbols.raw";
   
   int hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ);
   
   if(hFile < 0) return(-1);
   
   if(Selected) { SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116;  }
   else         { SymbolsNumber = FileSize(hFile) / 1936;      Offset = 1924; }
barbarian
339
barbarian 2014.01.15 07:15  
dken1:


Тип string это массив char. Попробуй перевести свой string в char[]. Структуры так же тебе в помощь, внутри MQL4 структура включающая данные типа string можно передавать в качестве параметров, сам это использую.
Slawa
Модератор
6748
Slawa 2014.01.15 09:02  
Barbarian:

Тип string это массив char.

Откуда такой вывод?
barbarian
339
barbarian 2014.01.15 10:44  
stringo:

Откуда такой вывод?
Пардон опечатался, нужно ushort. Мысль такая, что string можно представить в виде массива ushort (теперь ведь используется unicode). Можно использовать к примеру StringToShortArray().
alexandr
44
alexandr 2014.01.15 14:49  

проблема как вы выразились не с хаком :-) он то какраз как работал так и рабоатет)

а проблема с МАССИВАМИ СТРОК

поэтому char[] не подходит для этого т.к. это массив символов.

попробуйте создать динамический массив строк в мт4 новом

например

string test[];

и затем его размер изменить

ArrayResize(test,2);

и затем использовать его ) будите очень удивлены, что это перестало работать.

Barbarian

вариант с ushort попробую, однако юникод теперь сильно усложняет работу со строками и их обработкой(

alexandr
44
alexandr 2014.01.15 15:01  
void OnTick()
  {
//---
    string test[];
    ArrayResize(test,2);
    test[0]="tester 1";
    test[1]="tester 2";
    
    for(int i=0;i<ArraySize(test);i++) Print(test[i]);
  }
такой код вызывает исключение с последующим завершением терминала
до 509 билда включительно такое прекрасно работало
Sergey Dzyublik
4705
Sergey Dzyublik 2014.01.15 15:13  
dken1:
такой код вызывает исключение с последующим завершением терминала
до 509 билда включительно такое прекрасно работало

а вы скрипт запускаете??? (в скрипте не OnTick(), а OnStart())

п.с. в скрипте код работает верно ( у меня по крайней мере).

alexandr
44
alexandr 2014.01.15 15:16  
string test[1];
    ArrayResize(test,2);
    test[0]="tester 1";
    test[1]="tester 2";	
так заработало, однако теперь тайна как использовать это в функция которая передает массив по ссылке
alexandr
44
alexandr 2014.01.15 15:19  
ALXIMIKS:

а вы скрипт запускаете??? (в скрипте не OnTick(), а OnStart())

п.с. в скрипте код работает верно ( у меня по крайней мере).


почему скрипт, советник у меня. создал Советник (шаблон)

отписал в сервис деск, может чего скажут понятное.

Sergey Dzyublik
4705
Sergey Dzyublik 2014.01.15 15:24  
dken1:


почему скрипт, советник у меня. создал Советник (шаблон)

отписал в сервис деск, может чего скажут понятное.

void OnTick(){
   string test[];
   F(test);
   for(int i=0;i<ArraySize(test);i++) Print(test[i]);
}

void F(string &test[]){
   ArrayResize(test,2);
   test[0]="tester 2";
   test[1]="tester 3";
}
В чем проблема?
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий