копирование массива изменяет поведение функции с использованием исходного массива

0

Изменение: я отредактировал свой код, чтобы добавить часть "extern" C "(не уверен, что это имеет значение)

Поэтому у меня есть этот небольшой код:

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 уже не тот!

Мой вопрос, конечно, почему?

Теги:
arrays

1 ответ

1
Лучший ответ

Нет никакой разницы между этими двумя фрагментами кода относительно результата копирования.

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

  • 0
    Большое спасибо! Так что это (ваше второе предложение) работает, и я буду его использовать.
  • 0
    @ user189035 Вы должны проверить функцию other_foo. Возможно это имеет неопределенное поведение.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню