データは行優先順に表示されます。整数配列を読み取って内容を検証した後 (つまり、dim=4 は 32 個の値が続くことを意味し、dim=2 は 8 個の値が続くことを意味します)、何かを割り当てたりループしたりする理由がわかりません。
つまり、物理的なtest [] データをマトリックスとして使用できます。
int dim = test[0];
int (*mat1)[dim] = (int (*)[dim])(test+1);
int (*mat2)[dim] = (int (*)[dim])(test+1 + dim*dim);
C99 は、実装レベルで変数配列宣言をサポートします (つまり、コンパイラは、標準で定義されている機能をサポートできますが、必須ではありません。詳細については、C99 標準の 6.7.6.2 を参照してください)。ツールチェーンがサポートしていない場合は、定義済みのマクロを定義する必要があり、コンパイル時にテストできます (C99 標準のセクション 6.10.8.3-1 を参照)。そうは言っても、私が過去 10 年以上使用してきたすべての C99 準拠のコンパイラはそれをサポートしています。__STDC_NO_VLA__
そうである場合、mat1
上記の宣言での「dim」の使用に注意してくださいmat2
)。これは、C++ にはない CI の数少ない機能の 1 つです。だからあなたが持ってきたものと一緒に踊ってください。
最後に、コンパイラが C99 に準拠し、VLA をサポートしている (__STDC_NO_VLA__
定義されていない) と仮定すると、追加の超特別ボーナスとして、アルゴリズムがないため、2 つの行列を取得する最速のアルゴリズムであることがほぼ保証されます。1 つの配列要素を読み取ってから、2 つのポインターを割り当てます。O(3) に勝るものはありません。
例
#include <stdlib.h>
#include <stdio.h>
// main loader.
int main(int argc, char *argv[])
{
int test[] = {2,1,2,3,4,5,6,7,8};
int dim = test[0];
int (*mat1)[dim] = (int (*)[dim])(test+1);
int (*mat2)[dim] = (int (*)[dim])(test+1 + dim*dim);
// proof stuff is where it should be.
int i=0,j=0;
for (i=0;i<dim;i++)
{
for (j=0;j<dim;printf("%d ", mat1[i][j++]));
printf (" ");
for (j=0;j<dim;printf("%d ", mat2[i][j++]));
printf("\n");
}
return EXIT_SUCCESS;
}
出力
1 2 5 6
3 4 7 8
3x3 データ セットを使用した同様のテスト:
int test[] = {3,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1};
出力
1 2 3 9 8 7
4 5 6 6 5 4
7 8 9 3 2 1
最後に、4x4 データセット:
int test[] = {4,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,8,7,6,5,4,3,2,1};
出力
1 2 3 4 8 7 6 5
5 6 7 8 4 3 2 1
1 2 3 4 8 7 6 5
5 6 7 8 4 3 2 1