[c] 2D配列を1D配列にマップする



Answers

例:SIZE_XとSIZE_Yサイズの2D配列を表現したい。 これは、MAXXサイズのMAXY連続行を持つことを意味します。 したがって、集合関数は

void set_array( int x, int y, int val ) { array[ x * SIZE_Y + y ] = val; }

getは次のようになります。

int get_array( int x, int y ) { return array[ x * SIZE_Y + y ]; }
Question

私は、1次元配列を持つ2次元配列を表現したい。 関数は2つの記号(x、y)と値をストアに渡します。 これらの2つの記号は、1D配列の単一の要素を表し、それに応じてそれを設定します。 私は1D配列はarrayWidth×arrayHeightのサイズを持つ必要があることを知っていますが、各要素の設定方法はわかりません。

たとえば、(2,4,3)と(4,2,3)を区別するにはどうすればよいですか? 私はx * yとして配列を設定しようとしましたが、2 * 4と4 * 2は配列内の同じ場所になり、それらが異なっている必要があります。




使用する言語でデータを検索できるようにデータを保存することが重要です。 C言語ストアは行優先順序で格納されます(すべての最初の行が最初に、次に2番目の行がすべて...)、各索引が0から次元-1まで実行されます。 配列x [2] [3]の順序はx [0] [0]、x [0] [1]、x [0] [2]、x [1] [0]、x [ 1]、x [1] [2]となる。 したがって、C言語では、x [i] [j]は1次元配列エントリx1dim [i * 3 + j]と同じ場所に格納されます。 このようにデータが格納されていれば、C言語で簡単に取得できます。

FortranとMATLABは異なります。 それらは列の主要な順序で格納されます(最初の列がすべて最初、次に2番目の行がすべて...)、すべての索引が1からその次元まで実行されます。 したがって、インデックスの順序はCの逆であり、すべてのインデックスは1より大きい。 データをC言語の順序で格納すると、FORTRANはX_FORTRAN(j + 1、i + 1)を使用してX_C_language [i] [j]を検索できます。 例えば、X_C_language [1] [2]はX_FORTRAN(3,2)に等しい。 1次元配列では、そのデータ値はX1dim_C_language [2 * Cdim2 + 3]にあり、X1dim_FORTRAN(2 * Fdim1 + 3 + 1)と同じ位置になります。 インデックスの順序が逆転するので、Cdim2 = Fdim1であることを忘れないでください。

MATLABはFORTRANと同じです。 AdaはCと同じですが、インデックスは通常1から始まります。いずれの言語もCまたはFORTRAN命令のいずれかにインデックスを持ち、インデックスは0または1で始まり、格納されたデータに応じて調整することができます。

この説明が混乱する場合は申し訳ありませんが、プログラマが知ることが正確で重要であると思います。




他の人がCの地図を行順

   #include <stdio.h>

   int main(int argc, char **argv) {
   int i, j, k;
   int arr[5][3];
   int *arr2 = (int*)arr;

       for (k=0; k<15; k++) {
          arr2[k] = k;
          printf("arr[%d] = %2d\n", k, arr2[k]);
       }

       for (i=0; i<5; i++) {
         for (j=0; j< 3; j++) {
            printf("arr2[%d][%d] = %2d\n", i, j ,arr[i][j]);
         }
       } 
    } 

出力:

arr[0] =  0
arr[1] =  1
arr[2] =  2
arr[3] =  3
arr[4] =  4
arr[5] =  5
arr[6] =  6
arr[7] =  7
arr[8] =  8
arr[9] =  9
arr[10] = 10
arr[11] = 11
arr[12] = 12
arr[13] = 13
arr[14] = 14
arr2[0][0] =  0
arr2[0][1] =  1
arr2[0][2] =  2
arr2[1][0] =  3
arr2[1][1] =  4
arr2[1][2] =  5
arr2[2][0] =  6
arr2[2][1] =  7
arr2[2][2] =  8
arr2[3][0] =  9
arr2[3][1] = 10
arr2[3][2] = 11
arr2[4][0] = 12
arr2[4][1] = 13
arr2[4][2] = 14



Links