1. Элементы массивов в функции можно передавать только по значению:
void Swap(double x, double y)
2. Проверьте тип массива f[]
void Swap(double x, double y)
2. Проверьте тип массива f[]
Спасибо за ответ.
Вот код. Он осуществляет сортировку двух массивов, 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(...,...)
Вот код. Он осуществляет сортировку двух массивов, 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;
}
Пытаюсь сделать следующее
...
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]). Помогите понять в чём ошибка.
...
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;
}
Спасибо за объяснение. Не знал о таком огрничении MQL4.
Вот код. Он осуществляет сортировку двух массивов, f[] и w[], по значениям f[] в возрастающем порядке по методу Quick Sort.
Зачем так много сложностей ? В MQL4 все это можно сделать в одну строку.
Объявляете двумерный массив double fw[][2]. Записываете fw[k][0]=f[k], fw[k][1]=w[k].
Сортируете функцией ArraySort(), считываете соответствующее значение w[] из 2-го столбца.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
...
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]). Помогите понять в чём ошибка.