Скачать MetaTrader 5

Передача элементов массивов в функции

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай, как установить MetaTrader на Linux
Forex Trader
114255
Forex Trader 2006.11.18 23:53 
Пытаюсь сделать следующее
...
Swap(f[k],f[k+1]);
...
void Swap(double& x, double& y)
{
double temp=x;
x=y;
y=temp;
return;
}

но получаю сообщение об ошибке "'f-incompatible types" на строке Swap(f[k],f[k+1]). Помогите понять в чём ошибка.
Forex Trader
114255
Forex Trader 2006.11.19 00:29  
1. Элементы массивов в функции можно передавать только по значению:
void Swap(double x, double y)

2. Проверьте тип массива f[]
Forex Trader
114255
Forex Trader 2006.11.19 01:09  
Спасибо за ответ.
Вот код. Он осуществляет сортировку двух массивов, f[] и w[], по значениям f[] в возрастающем порядке по методу Quick Sort. Код скопирован из книги Numerical Recipes in C++. Массивы f[] и w[] описаны в основной программе следующим образом

...
double f[],w[];
int num=0;
while(...)
{
calculations
f[num]=...;
w[num]=...;
num++;
}
Sort(f,w);
...

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

//Sort function-------------------------------------------------+
void Sort(double& f[], double& w[])
{
   int M=7, NSTACK=50;
   int i,ir,j,k,jstack=-1,l=0,istack[];
   double F,W,temp;
   int n=ArraySize(w);
   ArrayResize(istack,NSTACK);
   ir=n-1;
   for(;;)
   {
      if(ir-l<M)
      {
         for(j=l+1;j<=ir;j++)
         {
            F=f[j];
            W=w[j];
            for(i=j-1;i>=l;i--)
            {
               if(f[i]<=F) break;
               f[i+1]=f[i];
               w[i+1]=w[i];
            }
            f[i+1]=f[i];
            w[i+1]=w[i];
         }
         if(jstack<0) break;
         ir=istack[jstack];
         l=istack[jstack-1];
         jstack=jstack-2;
      }
      else
      k=(l+ir)/2;
      Swap(f[k],f[l+1]);
      Swap(w[k],w[l+1]);
      if(f[l]>f[ir])
      {
         Swap(f[l],f[ir]);
         Swap(w[l],w[ir]);
      }
      if(f[l+1]>f[ir])
      {
         Swap(f[l+1],f[ir]);
         Swap(w[l+1],w[ir]);
      }
      if(f[l]>f[l+1])
      {
         Swap(f[l],f[l+1]);
         Swap(w[l],w[l+1]);
      }
      i=l+1;
      j=ir;
      F=f[l+1];
      W=w[l+1];
      for(;;)
      {
         i++;
         while(f[i]<F)i++;
         j++;
         while(f[j]>F)j++;
         if(j<i) break;
         Swap(f[i],f[j]);
         Swap(w[i],w[j]);
      }
      f[l+1]=f[j];
      f[j]=F;
      w[l+1]=w[j];
      w[j]=W;
      jstack+=2;
      if(jstack>=NSTACK) Print("NSTACK too small in Sort");
      if(ir-i+1>=j-l)
      {
         istack[jstack]=ir;
         istack[jstack-1]=i;
         ir=j-1;
      }
      else
      {
         istack[jstack]=j-1;
         istack[jstack-1]=l;
         l=i;
      }
   }
   return;
}

//Swap function-------------------------------------------------+
void Swap(double& x, double& y)
{
   double temp=x;
   x=y;
   y=temp;
   return;
}







Forex Trader
114255
Forex Trader 2006.11.19 02:08  
Пытаюсь сделать следующее
...
Swap(f[k],f[k+1]);
...
void Swap(double& x, double& y)
{
double temp=x;
x=y;
y=temp;
return;
}

но получаю сообщение об ошибке "'f-incompatible types" на строке Swap(f[k],f[k+1]). Помогите понять в чём ошибка.

При таком описании компилятор должен вычислить и подставить адреса f[k] и f[k+1]. Но он этому не обучен, ну и, как часто в жизни бывает, отвечает агрессией :). Выход может состоять в том, чтобы передавать по ссылке адрес массива и отдельно индексы. Типа
void Swap(double& Arr[], int ind1, int ind2) {
   double temp=Arr[ind1];
   Arr[ind1]=Arr[ind2];
   Arr[ind2]=temp;
   return;
}
Forex Trader
114255
Forex Trader 2006.11.19 04:35  
Спасибо за объяснение. Не знал о таком огрничении MQL4.
Forex Trader
114255
Forex Trader 2006.11.19 14:36  
Вот код. Он осуществляет сортировку двух массивов, f[] и w[], по значениям f[] в возрастающем порядке по методу Quick Sort.


Зачем так много сложностей ? В MQL4 все это можно сделать в одну строку.
Объявляете двумерный массив double fw[][2]. Записываете fw[k][0]=f[k], fw[k][1]=w[k].
Сортируете функцией ArraySort(), считываете соответствующее значение w[] из 2-го столбца.
Forex Trader
114255
Forex Trader 2006.11.20 19:41  
Действительно, зачем? Буду пробовать ArraySort. Спасибо за совет.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий