Правильное обращение с указателями на указатели

У меня есть множество указателей

float** data = new float*[NX];
for(int i = 0; i < NX; ++i)
{
data[i] = new float[NY];
}

Я объявил multiarray таким образом, затем я поместил в него некоторые значения таким образом (и подтвердил, что значения правильны с cout —

Loop{
data[i][j] = someValue;
cout << data[i][j];
}

У меня есть довольно сложные значения, такие как 10663.3, 11140.6 и т. Д., Которые должны быть в правильном положении, поэтому я не думаю, что могу получить ложные срабатывания там

Наконец я пытаюсь записать данные в файл NetCDF

Метод выглядит так

NcBool put(const float* vals, long c0, long c1, long c2, long c3, long c4)

Взятый из этого примера: http://www.unidata.ucar.edu/software/netcdf/examples/programs/simple_xy_wr.cpp

Я сделал это так

fileData->put(&data[0][0], NX, NY);

Однако, когда я начинаю читать из файла, я получаю тарабарщину. Я предполагаю, что я передаю массив в метод неправильно. Однако я не могу понять правильный путь.

Я также был бы признателен за хорошее руководство по указателям на указатели. Я не смог найти один

0

Решение

Когда вы создаете массив массивов, как вы делаете, он не является непрерывным. У вас в основном есть NX массивы в NX разные места где-то в памяти. Я не знаю что put Функция делает, но на основании своей подписи, она, вероятно, ожидает непрерывный массив с плавающей точкой. Но что бы он ни ожидал, он не может иметь доступ к вашим данным, кроме первого массива, потому что информация о расположении этих других массивов не доступна из &data[0][0],

Вместо этого вы можете создать одномерный массив и рассматривать его как двухмерный с помощью простой математики.

float * data = new float[NX * NY];

Вот как вы будете обращаться к массиву в позиции (x, y):

data[x * NY + y] = 1.234;

Затем передайте его put функционировать так:

fileData->put(data, NX, NY);

Возможно, вы захотите инкапсулировать это в класс, который обрабатывает арифметику для вас, или вы можете использовать библиотеку, где это уже было сделано, например, Boost.MultiArray.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]