Скачать MetaTrader 5

Build 574 MT4 Работа с массивами строк?!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
alexandr
44
alexandr  
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[]); не работает, размер массива не меняется. 
Это баг или нужно теперь как то иначе работать со строковыми динамическими массивами?
Slava
Модератор
6972
Slava  

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

   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  
dken1:


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

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

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

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

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

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

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

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

например

string test[];

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

ArrayResize(test,2);

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

Barbarian

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

alexandr
44
alexandr  
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
5180
Sergey Dzyublik  
dken1:
такой код вызывает исключение с последующим завершением терминала
до 509 билда включительно такое прекрасно работало

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

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

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

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

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


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

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

Sergey Dzyublik
5180
Sergey Dzyublik  
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
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий