c中多维数组的替代方法

Pae*_*ula 4 c multidimensional-array data-structures

我有以下代码:

 #define FIRST_COUNT 100
 #define X_COUNT 250
 #define Y_COUNT 310
 #define z_COUNT 40

struct s_tsp {

     short abc[FIRST_COUNT][X_COUNT][Y_COUNT][Z_COUNT];
};

struct s_tsp xyz;
Run Code Online (Sandbox Code Playgroud)

我需要像这样运行数据:

for (int i = 0; i < FIRST_COUNT; ++i)
    for (int j = 0; j < X_COUNT; ++j)
          for (int k = 0; k < Y_COUNT; ++k)
                for (int n = 0; n < Z_COUNT; ++n)
                      doSomething(xyz, i, j, k, n);
Run Code Online (Sandbox Code Playgroud)

我试图想出一个更优雅,更少脑死亡的方法.(我知道这种多维数组在cpu使用方面是低效的,但在这种情况下这是无关紧要的.)对于我在这里构建事物的方式,有没有更好的方法?

Dan*_*Dan 5

如果您需要4D阵列,那么这就是您所需要的.可以将它"压扁"成一个单一的malloc()"数组",但这并不是那么干净:

abc = malloc(sizeof(short)*FIRST_COUNT*X_COUNT*Y_COUNT*Z_COUNT);
Run Code Online (Sandbox Code Playgroud)

访问也更加困难:

*(abc + FIRST_COUNT*X_COUNT*Y_COUNT*i + FIRST_COUNT*X_COUNT*j + FIRST_COUNT*k + n)
Run Code Online (Sandbox Code Playgroud)

所以这显然有点痛苦.

但是你确实有这样的优势:如果你需要简单地迭代每一个元素,你可以做到:

for (int i = 0; i < FIRST_COUNT*X_COUNT*Y_COUNT*Z_COUNT; i++) {
    doWhateverWith *(abc+i);
}
Run Code Online (Sandbox Code Playgroud)

很明显,这种方法对于大多数用途来说非常难看,并且对于一种类型的访问来说有点整洁.它也有点内存保守,只需要一个指针解引用而不是4.

  • 真正.如果你是一个非常坏的人,你甚至可以用宏来做. (5认同)