0

このように宣言された大きな1次元配列がある場合

1darray = malloc(N*sizeof(double))

そして、私はこのように宣言された別の構造を持っています

for j:A

  2dstructure[j] = malloc(C[j]*sizeof(double*))     

  for i:B

    2dstructure[j][i] = malloc(D*sizeof(double))

  end
end

A*B = N のサイズ、つまり sizeof(1darray) == sizeof(2dstructure)

ループを使用せずに、1 次元配列にあるものを 2 次元構造にコピーする方法はありますか?

4

3 に答える 3

3

はい、次のようにして、2D インデックスを線形 1D インデックスにマッピングできます。

int idx = j*B + i;

その時点で、1darray[idx]は と同等2dstructure[j][i]です。

于 2013-05-29T18:14:06.780 に答える
1

割り当てパターンでは、2 番目のループで複数の割り当てが行われるため、単純なコピーを行うことはできません。それはあなたが本当に何を求めているかによります。現在の 1D 配列にポインターを設定して、2D 配列としてアクセスできるようにすることで、一連のポインターの割り当てを 1 つだけ行うように調整できます。または、1D 配列のコピーを作成してから、ポインターを設定することもできます (2 つの割り当て、1 つのコピー、1 つの初期化ループ)。唯一の問題は元の割り当てをコピーするかどうかであるため、主な答えは元のデータで機能します。

あなたが持っている:

int N, A, B;
A = ...;
B = ...;
N = A * B;

double *a_1d = malloc(N * sizeof(double));

...check and load a_1d...

これで、次の方法で 2D '配列' を作成できます。

double **a_2d = malloc(A * sizeof(double *));

...check that allocation succeeded...

for (int i = 0; i < A; i++)
    a_2d[i] = &a_1d[i * B];

この初期化が完了すると、次を使用できるようになります。

for (int i = 0; i < A; i++)
    for (int j = 0; j < B; j++)
        a_2d[i][j] = ...;

元の配列を複製する必要がある場合はa_1d、次を追加します。

double *a_1d_copy = malloc(N * sizeof(double));
...check that the allocation succeeded...
memmove(a_1d_copy, a_1d, N * sizeof(double));

設定a_1d_copyの代わりに参照できます。a_1da_2d

何かを解放するときが来たら、両方を解放する必要があることを忘れないでくださいa_1d(a_2dそしてa_2d_copy、それを使用している場合)。

于 2013-05-29T20:51:26.087 に答える