0

私のインストラクターは、「行列のコピー」のためにこのスライドを提示します:

#define ROWSIZ 17
#define COLSIZ 27
int enamatrisen[ROWSIZ][COLSIZ];
int andramatrisen[ROWSIZ][COLSIZ];

void matcpy (int* dst, int* src)
{
  int i, j;
  for (i=0; i<ROWSIZ, i=i+1)   /* rad-nr */
   for (j=0; j<COLSIZ, j=j+1)  /* kolumn-nr */
    dst[i][j] = src[i][j];
}

しかし

,1)あるべきだと言っているところにバグがあり;

2) コードがコンパイルされません。gcc は、ポインターが配列などとして使用されていると文句を言います。正しいコードとは?この取り組みはどのように近いですか?代わりにこれに memcpy を使用すべきではありませんか、それとも memcpy のようなものを実装するための努力ですか?

4

3 に答える 3

3

関数パラメータの定義が間違っています。

多次元配列の受け渡しに関する詳細: http://www.eskimo.com/~scs/cclass/int/sx9a.html

また、forループ内のカンマはセミコロンにする必要があります。

void matcpy(int dst[][COLSIZ], int src[][COLSIZ])
{
    int i, j;
    for (i = 0; i < ROWSIZ; i = i + 1)   /* rad-nr */
        for (j = 0; j < COLSIZ; j = j + 1)  /* kolumn-nr */
            dst[i][j] = src[i][j];
}

また

void matcpy(int (*dst)[COLSIZ], int (*src)[COLSIZ])
{ 
    int i, j;
    for (i = 0; i < ROWSIZ; i = i + 1)   /* rad-nr */
       for (j = 0; j < COLSIZ; j = j + 1)  /* kolumn-nr */
           dst[i][j] = src[i][j];
}
于 2012-10-10T06:36:19.983 に答える
3

はい、間違っています。

必要なもの:

int matcpy( int (*dst)[ COLSIZ ], int (*src)[ COLSIZ ]

また

void matcpy(int dst[][ COLSIZ ], int src[][ COLSIZ ])

memcpyを使用することもできますが、これは演習であるため、ポイントは 2D 配列を反復処理する方法とその要素にアクセスする方法を確認することです。


forループでは、 は である必要, があります;。他の回答/コメントは正しいです-式にコンマを使用でき;、にのみ追加できますfor。次に例を示します。

//------------------------v
for (i=0; i<ROWSIZ, i=i+1 ; )

ただし、次の理由により、これは未定義の動作になります。

  • コンマ演算子の評価がシーケンスの最後の値であるi<ROWSIZ, i=i+1限り、条件は true になります。i != 0
  • そのままiではint、オーバーフローにより未定義の動作が発生します

つまり、無限ループに陥る可能性があります。

于 2012-10-10T06:24:48.613 に答える
-1

関数宣言が次のとおりであるため、機能しません。

void matcpy (int* dst, int* src)

戻り値は次のとおりです。

return dst[i][j] = src[i][j]

関数宣言を次のように変更する必要があります。

void matcpy (int** dst, int** src)
于 2012-10-10T06:26:32.653 に答える