Поэтому у меня есть этот небольшой код:
extern "C"{
void foo(int* nR,int* mR,float* x,float* out){ //&&
const int n=*nR,m=*mR;
other_foo(n,m,x,out);
}
}
это прекрасно работает. Но теперь я хочу скопировать n-array
float
x
прежде чем передавать его функции other_foo
(так как other_foo
будет изменять x
и я хочу сохранить копию).
если я так делаю, все работает нормально:
extern "C"{
void foo(int* nR,int* mR,float* x,float* out){ //&&
const int n=*nR,m=*mR;
float y[n];
for(int i=0;i<n;i++) y[i]=x[i];
other_foo(n,m,x,out);
}
}
но если я сделаю так:
extern "C"{
void foo(int* nR,int* mR,float* x,float* out){ //&&
const int n=*nR,m=*mR;
float y[n];
std::copy(x,x+n,y);
other_foo(n,m,x,out);
}
}
все адские промахи проиграют: результат other_foo
уже не тот!
Мой вопрос, конечно, почему?
Нет никакой разницы между этими двумя фрагментами кода относительно результата копирования.
void foo(int* nR,int* mR,float* x,float* out){ //&&
const int n=*nR,m=*mR;
float y[n];
for(int i=0;i<n;i++) y[i]=x[i];
other_foo(n,m,x,out);
}
void foo(int* nR,int* mR,float* x,float* out){ //&&
const int n=*nR,m=*mR;
float y[n];
std::copy(x,x+n,y);
other_foo(n,m,x,out);
}
Оба копируют n элементов из x в y.
Однако этот код не соответствует C++. Размер массива должен быть постоянным выражением, известным во время компиляции. Поэтому было бы правильнее распределить массив динамически.
Например
void foo(int* nR,int* mR,float* x,float* out){ //&&
int n = *nR, m = *mR;
float *y = new float[n];
std::copy( x, x+n, y );
other_foo( n, m, x, out );
// other code maybe including delete [] y
}
Я думаю, что проблема не в этой функции. Похоже, что проблема в вызываемой функции other_foo