7

行列をコピーする関数matricopyを作成しようとしていますが、コンパイラーが次のように文句を言います。

/* minmatrix.c - test rows and columns of a matrix
 * Copyright abandoned. This file is in the public domain. */

#include <stdio.h>
#define ROWCOUNT (3)
#define COLUMNCOUNT (4)

int imat[ ROWCOUNT ][ COLUMNCOUNT ]; 
char cmat[ ROWCOUNT ][ COLUMNCOUNT ];
double dmat[ ROWCOUNT ][ COLUMNCOUNT ];
int rmat[ ROWCOUNT ][ COLUMNCOUNT ]; 

void matriscopy (int * destmat, int * srcmat, int rowcount, int columncount) 
{
  int i, j;
  for (i=0; i<rowcount; i=i+1) /* rad-nr */
    for (j=0; j<columncount; j=j+1) /* kolumn-nr */
      destmat[i][j] = srcmat[i][j];
}

int main()
{
  int i; int j;
  int * ip; char * cp; double * dp;

  for( i = 0; i < ROWCOUNT; i = i + 1 )
    for( j = 0; j < COLUMNCOUNT; j = j + 1 )
    {
      imat[ i ][ j ] = 10000 + 100*i + j;
      cmat[ i ][ j ] = 10*i + j;
      dmat[ i ][ j ] = 1.0 + i/100.0 + j/10000.0;
      rmat[ i ][ j ] = 0;
    };

  printf( "\n Examining imat:\n" );
  for( ip = &imat[ 0 ][ 0 ];
       ip <= &imat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       ip = ip + 1 )
    printf( "memory at: %lx contains value: %d\n", (unsigned long) ip, *ip );

  printf( "\n Examining cmat:\n" );
  for( cp = &cmat[ 0 ][ 0 ];
       cp <= &cmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       cp = cp + 1 )
    printf( "memory at: %lx contains value: %d\n", (unsigned long) cp, *cp );

  printf( "\n Examining dmat:\n" );
  for( dp = &dmat[ 0 ][ 0 ];
       dp <= &dmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       dp = dp + 1 )
    printf( "memory at: %lx contains value: %f\n", (unsigned long) dp, *dp );

/* Add a statement here to call your matriscopy function. */

  printf( "\n Examining rmat:\n" );
  for( ip = &rmat[ 0 ][ 0 ];
       ip <= &rmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       ip = ip + 1 )
    printf( "memory at: %lx contains value: %d\n", (unsigned long) ip, *ip );

  return( 0 );
}

このエラーが発生します:

$ cc minmatrix.c
minmatrix.c: In function ‘matriscopy’:
minmatrix.c:18:17: error: subscripted value is neither array nor pointer nor vector
minmatrix.c:18:32: error: subscripted value is neither array nor pointer nor vector

理解するのを手伝ってもらえますか?

4

6 に答える 6

10

あなたは単にmemcpyを使うことができます

void matriscopy (void * destmat, void * srcmat) 
{
  memcpy(destmat,srcmat, ROWCOUNT*COLUMNCOUNT*sizeof(int));
}

destmatとはsrcmat同じサイズである必要があります。

この関数では、行列全体のみをコピーできます。

この関数は、母行列から部分行列をコピーすることはできません。

例: 7列7行の行列がある場合。上記の関数を使用して、マザーマトリックスからサブマトリックス(4行4列)をコピーすることはできません。それを行うには、セルごとにコピーを作成する必要があります

于 2012-10-01T15:24:41.857 に答える
3

関数のシグネチャmatrixcopyは次のようになります。

void matrixcopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount, int columncount) 

もちろん、columncountは冗長です。

rowcount * columncountまたは、行列を整数の1D配列として扱うこともできます。その場合、単一のループでコピーを実行するかmemcpy、標準ライブラリの関数を使用できます。

于 2012-10-01T15:02:37.777 に答える
1

関数の正しい宣言は次のとおりです。

void matriscopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount) 

だからあなたの関数は

void matriscopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount) 
{
  int i, j;
  for (i=0; i<rowcount; i=i+1) /* rad-nr */
    for (j=0; j<COLUMNCOUNT; j=j+1) /* kolumn-nr */
      destmat[i][j] = srcmat[i][j];
}

多次元配列では、最初の次元を除くすべてが関数の引数で固定されている必要があります。

于 2012-10-01T15:15:02.003 に答える
0

このバージョンを試してくださいmatriscopy

void matriscopy (int * destmat, int * srcmat, int rowcount, int columncount)
{
  int i, j;
  int (*dst)[columncount];
  int (*src)[columncount];
  dst = (int (*)[columncount])destmat;
  src = (int (*)[columncount])srcmat;
  for (i=0; i<rowcount; i=i+1) /* rad-nr */
    for (j=0; j<columncount; j=j+1) /* kolumn-nr */
      dst[i][j] = src[i][j];
}

Cは、c99標準以降、可変長配列(VLA)を許可します。

于 2012-10-01T15:06:52.863 に答える
-1

ではmatriscopy、変数destmatは整数ポインタです。つまり、のタイプはdestmat[i]整数です。整数にインデックスを付けることができないので、を持つことはできませんdestmat[i][j]。あなたはおそらくdestmatタイプではなくしたいと思うでしょint**int*

于 2012-10-01T15:04:41.567 に答える
-1

destmatとsrcmatはダブルポインタであると想定されています。いくつかint **destmat,int **srcmatの整数オブジェクトを指している整数ポインタの配列に実際にアクセスしようとしているように。a[i][j]のように、i番目の行のj番目の列にあるオブジェクトを知っています。したがって、int ** pを定義すると、pはポインタの配列のようになり、各ポインタは整数オブジェクトを指します。次に、p[i][j]のようにアクセスできます。問題が解決した場合は、これを回答としてマークしてください。

于 2012-10-01T15:12:06.200 に答える