Вызов 2D указатель / массив из 3D указатель / массив в C - PullRequest
0 голосов
/ 29 июня 2018

Для каждого временного шага у меня есть двумерная матрица a[ix][iz] с ix в диапазоне от 0 до nx-1 и iz в диапазоне от 0 до nz-1.

Чтобы собрать матрицу всех временных шагов, я определяю трехмерный указатель ***b длины nx*nz*nt. В момент времени it матрица может быть представлена ​​как b[ix][iz][it] с ix в диапазоне от 0 до nx-1 и iz в диапазоне от 0 до nz-1.

В цикле времени я должен доставить двумерный массив / указатель во время it в функцию void func(**ptr). Поскольку b является 3D-указателем / массивом, как я могу вызвать его в основном коде? Нравится func(b[it]);?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Самый простой способ - использовать b, чтобы просто хранить указатели на такие матрицы:

На каждом временном шаге копируйте матрицу a и вставляйте указатель на копию матрицы a в b. Затем вы можете передать b[i] в вашу функцию func(b[i]).

Это в основном то, что предлагает frsim. В коде:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX_TIME 5

void func(int array[2][3]) {

    for(size_t x = 0; x < 2; ++x) {

        for(size_t y = 0; y < 3; ++y) {
            printf("%i ", array[x][y]);
        }
        printf("\n");

    }
    printf("\n");

}

int main (int argc, char** argv) {

   int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

   int b[MAX_TIME][2][3] = {0};

   for(size_t time = 0; time < MAX_TIME; ++time) {

       /* Calculate your new version of `a` here */

       a[1][0] = time;

       memcpy(b[time], a, sizeof(a));
       printf("%zu ", sizeof(a));

   }

   for(size_t i = 0; i < MAX_TIME; ++i) {
       printf("time: %zu \n", i);
       func(b[i]);
   }

}

Массивы несут много ловушек, в частности, массив не указатель.

Но: если вы передадите массив функции, то случится так, что в сам массив будет передан не сам массив, а указатель на массив. То же самое произошло бы с двумерным массивом: при вызове функции с двумерным массивом в функцию передается не массив, а указатель, и этот указатель по-прежнему просто int *, а не int ** ... см. Например этот вопрос

0 голосов
/ 29 июня 2018

Вы можете реструктурировать свою матрицу как b[it][ix][iz] вместо b[ix][iz][it]. Таким образом, вы получите массив двумерных матриц, что позволит вам передавать двумерную матрицу в любой заданный момент времени, используя b[it].

В противном случае, если вы сохраните свою матрицу как есть, вам нужно будет построить 2D-массив в момент времени it, а затем передать его в func() - это дополнительные вычисления, которых вы можете избежать, перестроив свою 3D-матрицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...