Индикаторы: FullSSA

 

FullSSA:

Перерисовывающийся осциллятор, построенный на основе библиотеки функций сингулярного преобразования SSA.mqh

Рис.1 Индикатор FullSSA

Рис.1 Индикатор FullSSA

Автор: Nikolay Kositsin

 
for(k=0;k<=n-2;k++)for(i=k+1;i<=n-1;i++)
     {
      if(!B[k][k])
        {
         for(i1=0;i<=n-1;i++)
           {
            w[i1]=B[i1][k];
            B[i1][k]=B[i1][k+1];
            B[i1][k+1]=w[i1];
           }
         cp++;
        }
      Print(__FUNCTION__+": i=",i);  
      c=1.0*B[i][k]/B[k][k];
      for(j=0;j<=n-1;j++) B[i][j]-=B[k][j]*c;
     }

2019.03.31 00:07:28.689  (GBPUSD,H1) array out of range in 'SSA.mqh' (147,14)


 
        for(i1=0;i1<=n-1;i1++)
           {
            w[i1]=B[i1][k];
            B[i1][k]=B[i1][k+1];
            B[i1][k+1]=w[i1];
           }

must be i1 everywhere in for() ?

 
leonerd:

must be i1 everywhere in for() ?

Сам дурак. 

 
Алексей Тарабанов:

Сам дурак. 

Горячая линия Минздрава России:8 800 550 99 03

 

Да там ошибка на ошибке. Выходы за пределы массива и деление на 0.

И я не знаю, как править, так как вообще не понимаю о чем эта библиотека...

Вот этот цикл например:

for(k=0;k<=n-2;k++)for(i=k+1;i<=n-1;i++)
     {
      if(!B[k][k])
        {
         for(i1=0;i<=n-1;i++)
           {
            w[i1]=B[i1][k];
            B[i1][k]=B[i1][k+1];
            B[i1][k+1]=w[i1];
           }
         cp++;
        }
        
      c=1.0*B[i][k]/B[k][k];
      for(j=0;j<=n-1;j++) B[i][j]-=B[k][j]*c;
     }
Если доходит до самого внутреннего цикла for (а оно доходит, т.к. B[k][k] равно нулю), то i уже выходит за пределы ограничения внешнего цикла, то есть i становится больше n-1. Ну и дальше при доступе к B[i] получаем выход за пределы массива, т.к. по удивительному совпадению его размер и равен n.
Причина обращения: