Проще говоря, ваш код повреждает память.Лучше всего не использовать необработанные указатели, а вместо этого использовать контейнерные классы, такие как std::vector
.
Сказав это, чтобы исправить свой текущий код, проблема заключается в том, что вы пишете за пределами памятиздесь:
for(a = 1;a<= Nv;a++)
когда a == Nv
, вы пишете одну «строку» сверх того, что было выделено.Это похоже на проявление попытки подделать массивы на основе 1.Массивы в C ++ начинаются с 0, а не с 1. Попытка подделать массивы на основе 1 неизменно может привести к ошибкам и повреждению памяти.
Исправление состоит в том, чтобы переписать функцию так, чтобы она начиналась с 0, а не с 1, и обеспечитьцикл повторяется до n-1
, где n
- общее количество строк:
for (a = 0; a < Nv; ++a)
цель приведенного выше кода состоит в том, чтобы добавить их впервый столбец и добавьте оставшиеся данные из указателя train_data в x_train
Вместо цикла, который вы написали для проверки первого столбца, вы можете упростить это, просто используя memcpy
:
for (int i = 0; i < Nv; ++i)
{
x_train[i][0] = 1;
memcpy(&x_train[i][1], &train_data[i][0], N * sizeof(float));
}
Таким образом, вся функция будет выглядеть так:
float** Input_data(float** train_data, int Nv, int N)
{
float** x_train=new float*[Nv];
for(int a = 0; a < Nv; a++)
x_train[a] = new float[N+1];
for (int a = 0; a < Nv; a++)
{
x_train[i][0] = 1;
memcpy(&x_train[i][1], &train_data[i][0], N * sizeof(float));
}
return x_train;
}