Выход за пределы массива

 

В коде есть условие и
если в таком виде rSymbolsTotal накрутил > 1000, то вылетает ошибка по Symbols[i] - "выход за пределы массива"

   i=rSymbolsTotal;
   rSymbolsTotal++;

   Symbols[i]=SymbolName;

а если я верну значение к нулю, то работает корректно, но удаляет объекты и снова их восстанавливает, т.е. всё пропадает на графике и заново восстанавливается

   i=rSymbolsTotal;
   rSymbolsTotal++;
   if(rSymbolsTotal>1000) rSymbolsTotal=0;

   Symbols[i]=SymbolName;
 
В чем именно заключается вопрос?
 
Ihor Herasko:
В чем именно заключается вопрос?

Этот вызов вылетает за пределы массива. Проверка в комменте выявила что если rExtSymbolsTotal >1000 происходит вылет.

//+------------------------------------------------------------------+
//| Счёт валютных пар                                                |
//+------------------------------------------------------------------+
int rSymbolsIndex(string SymbolName){
   int i=0;

   i=rExtSymbolsTotal;
   rExtSymbolsTotal++;

   rExtSymbols[i]=SymbolName;
   rStrComOrd[i]=OrderComment();
   rExtSymbolsSummaries[i][rTICKET]=0.0;
   rExtSymbolsSummaries[i][rLOTS]=0.0;
   rExtSymbolsSummaries[i][rSWOP]=0.0;
   rExtSymbolsSummaries[i][rTIME]=0.0;
   rExtSymbolsSummaries[i][rTYPE]=0.0;
   rExtSymbolsSummaries[i][rPROFIT]=0.0;
   rExtSymbolsSummaries[i][rPIPS]=0.0;
return(i);}
 
forex2030:

Этот вызов вылетает за пределы массива. Проверка в комменте выявила что если rExtSymbolsTotal >1000 происходит вылет.

Да, вы правы. Никто не знал что такое бывает, спасибо что сообщили.

 
Aleksey Mavrin:

Да, вы правы. Никто не знал что такое бывает, спасибо что сообщили.

Сарказм просто блеск, я аж ослеп от остроумия!! Сказал бы куда идти!! Но здесь нельзя((

 
forex2030:

Сарказм просто блеск, я аж ослеп от остроумия!! Сказал бы куда идти!! Но здесь нельзя((

Код нужно показывать не огрызком!

Что это и где инициализация?

rExtSymbolsSummaries


По текущему коду видно, что вам проще использовать массив структуры

 
Vitaly Muzichenko:

Код нужно показывать не огрызком!
Что это и где инициализация?

По текущему коду видно, что вам проще использовать массив структуры

Весь код неразумно сливать, много души и средств вложено
Обращается только сюда

//+------------------------------------------------------------------+
//| Сбор данных по валютным парам                                    |
//+------------------------------------------------------------------+
int rAnalyze()
  {
   int i,index,type,total=OrdersTotal();
//----
   for(i=0; i<total; i++){
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
         type=OrderType();
      if(type!=OP_BUY && type!=OP_SELL) continue;
         index=rSymbolsIndex(OrderSymbol());
      if(index<0||index>=SYMBOLS_MAX) continue;
      //----
      rExtSymbolsSummaries[index][rORDERS]++;
      rStrComOrd[index]=OrderComment();
      rExtSymbolsSummaries[index][rTYPE]=OrderType();
      rExtSymbolsSummaries[index][rTIME]=int(OrderOpenTime()); 
      rExtSymbolsSummaries[index][rSWOP]=OrderSwap();
      rExtSymbolsSummaries[index][rPROFIT]=OrderProfit()+OrderSwap()+OrderCommission();
      rExtSymbolsSummaries[index][rTICKET]=OrderTicket();
      rExtSymbolsSummaries[index][rLOTS]=OrderLots();
      if(type==OP_BUY) 
      rExtSymbolsSummaries[index][rPIPS]=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);
      if(type==OP_SELL) 
      rExtSymbolsSummaries[index][rPIPS]=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);
      }
   total=0;
   for(i=0; i<rExtSymbolsTotal; i++){
      if(rExtSymbolsSummaries[i][rORDERS]>0) total++;}
return(total);}
 
forex2030:

Этот вызов вылетает за пределы массива. Проверка в комменте выявила что если rExtSymbolsTotal >1000 происходит вылет.

Пока все логично: массив имеет размерность 1000 элементов. Обращение к элементу с индексом 1000 или более должно приводить к подобной ошибке.

Попытайтесь все же сформулировать вопрос, если он есть, конечно.

 
Ihor Herasko:

Попытайтесь все же сформулировать вопрос, если он есть, конечно.

Вопрос единственный, как предотвратить этот вылет за пределы массива.
Цикл по всем ордерам не помогает, в итоге не вся информация объектов отображается.

 
forex2030:

Вопрос единственный, как предотвратить этот вылет за пределы массива.
Цикл по всем ордерам не помогает, в итоге не вся информация объектов отображается.

размер массива где задаете?
 
Renat Akhtyamov:
размер массива где задаете?

Только в переменных за стартом

double rExtSymbolsSummaries[SYMBOLS_MAX][8];

В init, то не принимает

int OnInit(){

   SetIndexBuffer(0,rExtSymbolsSummaries); SetIndexStyle(0,DRAW_NONE);

return(INIT_SUCCEEDED);}


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