我试图编写应复制矩阵的函数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
你能帮我理解吗?
答案 0 :(得分:9)
您只需使用memcpy
即可void matriscopy (void * destmat, void * srcmat)
{
memcpy(destmat,srcmat, ROWCOUNT*COLUMNCOUNT*sizeof(int));
}
destmat
和srcmat
应该具有相同的尺寸。
此功能仅允许复制整个矩阵。
此函数无法从母矩阵复制子矩阵。
示例:如果我有一个包含7列和7行的矩阵。我不能用上述函数从母矩阵复制子矩阵(4行和4列)。要做到这一点,我们必须逐个细胞复制
答案 1 :(得分:3)
您的matrixcopy
功能签名应如下所示:
void matrixcopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount, int columncount)
当然,列数是多余的。
或者,您可以将矩阵视为rowcount * columncount
整数的一维数组。在这种情况下,您可以在单个循环中执行复制,或使用标准库中的函数memcpy
。
答案 2 :(得分: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];
}
在multidimensinal数组中,必须在函数参数中修复第一个维度的所有ax。
答案 3 :(得分: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)。
答案 4 :(得分:-1)
在matriscopy
中,变量destmat
是一个整数指针。这意味着destmat[i]
的类型是整数。由于您无法索引到整数,因此不能使用destmat[i][j]
。您可能希望destmat
的类型为int**
,而不是int*
。
答案 5 :(得分:-1)
destmat和srcmat应该是双指针。就像int **destmat,int **srcmat
因为你实际上正在尝试访问指向某些整数对象的整数指针数组。就像[i] [j]一样,你知道第i行的第j个对象。因此,当你定义int ** p时,它就像p是一个指针数组,每个指针指向一个整数对象。然后你可以像p [i] [j]一样访问它。
如果它解决了您的问题,请将此标记为答案。