四次元配列の一次元化

#include <stdio.h>

#define O 2
#define P 3
#define Q 4
#define R 5

int main() {
  int i, j, k, l;
  int nums4[O][P][Q][R];
  int nums1[O*P*Q*R];
  
  for (i = 0; i < O; i++) {
    for (j = 0; j < P; j++) {
      for (k = 0; k < Q; k++) {
        for (l = 0; l < R; l++) {
          nums4[i][j][k][l] = i*P*Q*R + j*Q*R + k*R + l;
          printf("i:%d j:%d k:%d l:%d nums4:%d\n", i, j, k, l,  nums4[i][j][k][l]);
        }
      }
    }
  }
  puts("");
  
  for (i = 0; i < O; i++) {
    for (j = 0; j < P; j++) {
      for (k = 0; k < Q; k++) {
        for (l = 0; l < R; l++) {
          nums1[i*P*Q*R + j*Q*R + k*R + l] = nums4[i][j][k][l];
          printf("i:%d j:%d k:%d l:%d nums1:%d\n", i, j, k, l, nums1[i*P*Q*R + j*Q*R + k*R + l]);
        }
      }
    }
  }
  puts("");
  
  for (i = 0; i < O*P*Q*R; i++) {
    printf("i:%d nums1:%d\n", i, nums1[i]);
  }
  puts("");
  
  printf("sizeof(nums4):%d sizeof(nums1):%d\n", sizeof(nums4)/sizeof(int), sizeof(nums1)/sizeof(int));
  
  return 0;
}

多分、あってる。
ソースコードに全然自信ないし、配列関係は間違いやすいから、扱いには十分注意してね。


世の中には、一次元配列が扱いやすい状況があったりするはず。


ていうか、一次元配列アクセスするときはfor文も一重化すれば見やすくなる。

追記
蛇足だけど、for文一重化してアクセスしたコードを追加した。