У меня есть множество указателей
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);
Однако, когда я начинаю читать из файла, я получаю тарабарщину. Я предполагаю, что я передаю массив в метод неправильно. Однако я не могу понять правильный путь.
Я также был бы признателен за хорошее руководство по указателям на указатели. Я не смог найти один
Когда вы создаете массив массивов, как вы делаете, он не является непрерывным. У вас в основном есть 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.
Других решений пока нет …