当我调用函数func4()和func5()时,我得到followinfg错误:
func4()错误:无法将'short int(*)[3]'转换为'short int **' 参数'1'到'int func4(short int **)'| func5()错误:不能 将'short int(*)[3]'转换为'short int **',将参数'1'转换为'int func5(短整数**)'|
如何更正调用函数func4()和func5()时的错误?这是我的代码:
#include <cstdio>
int func1(short mat[][3]);
int func2(short (*mat)[3]);
int func3(short *mat);
int func4(short **mat);
int func5(short *mat[3]);
int main()
{
short mat[3][3],i,j;
for(i = 0 ; i < 3 ; i++)
for(j = 0 ; j < 3 ; j++)
{
mat[i][j] = i*10 + j;
}
printf(" Initialized data to: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", mat[i][j]);
}
}
printf("\n");
func1(mat);
func2(mat);
func3(&mat[0][0]);
func4(mat); //error: cannot convert ‘short int (*)[3]’ to
//‘short int**’ for argument ‘1’ to ‘int func4(short int**)’|
func5(mat); //error: cannot convert ‘short int (*)[3]’ to
//‘short int**’ for argument ‘1’ to ‘int func5(short int**)’|
return 0;
}
/*
Method #1 (No tricks, just an array with empty first dimension)
===============================================================
You don't have to specify the first dimension!
*/
int func1(short mat[][3])
{
register short i, j;
printf(" Declare as matrix, explicitly specify second dimension: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", mat[i][j]);
}
}
printf("\n");
return 0;
}
/*
Method #2 (pointer to array, second dimension is explicitly specified)
======================================================================
*/
int func2(short (*mat)[3])
{
register short i, j;
printf(" Declare as pointer to column, explicitly specify 2nd dim: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", mat[i][j]);
}
}
printf("\n");
return 0;
}
/*
Method #3 (Using a single pointer, the array is "flattened")
============================================================
With this method you can create general-purpose routines.
The dimensions doesn't appear in any declaration, so you
can add them to the formal argument list.
The manual array indexing will probably slow down execution.
*/
int func3(short *mat)
{
register short i, j;
printf(" Declare as single-pointer, manual offset computation: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", *(mat + 3*i + j));
}
}
printf("\n");
return 0;
}
/*
Method #4 (double pointer, using an auxiliary array of pointers)
================================================================
With this method you can create general-purpose routines,
if you allocate "index" at run-time.
Add the dimensions to the formal argument list.
*/
int func4(short **mat)
{
short i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
index[i] = (short *)mat + 3*i;
printf(" Declare as double-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", index[i][j]);
}
}
printf("\n");
return 0;
}
/*
Method #5 (single pointer, using an auxiliary array of pointers)
================================================================
*/
int func5(short *mat[3])
{
short i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
index[i] = (short *)mat + 3*i;
printf(" Declare as single-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", index[i][j]);
}
}
printf("\n");
return 0;
}
答案 0 :(得分:1)
你can't
发送一个二维数组来运行而不指定数组的length or size of second dimension
。这是导致错误的原因。
试试这个:
int func4(short mat[][3])
{
short i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
index[i] = (short *)mat + 3*i;
printf(" Declare as double-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", index[i][j]);
}
}
printf("\n");
return 0;
}
int func5(short mat[][3])
{
short i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
index[i] = (short *)mat + 3*i;
printf(" Declare as single-pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", index[i][j]);
}
}
printf("\n");
return 0;
}
Remember
如果可以通过一种方式轻松而干净地完成某些事情,请不要尝试通过肮脏和困难的方式来完成,因为当您修改或更新代码时,它会让您自己感到困惑。将来
答案 1 :(得分:1)
1.他们是一样的:
int func(short **mat);
int func(short *mat[]);
int func(short *mat[3]);
short **
与short (*)[3]
不兼容,因为它们指向的类型不同。当short **
指向short *
时,short (*)[3]
指向short[3]
。
2.也许你可以试试这个:
int funcMy(void *mat) // OK! -added by Justme0 2012/12/31
{
short i, j, *index[3];
for (i = 0 ; i < 3 ; i++)
index[i] = (short *)mat + 3*i;
printf(" Declare as (void *) pointer, use auxiliary pointer array: ");
for(i = 0 ; i < 3 ; i++)
{
printf("\n");
for(j = 0 ; j < 3 ; j++)
{
printf("%5.2d", index[i][j]);
}
}
printf("\n");
return 0;
}
3.我认为第三个功能是最好的!它使用了一个名为“展平数组”的技巧,我在 POINTERS ON C 中读到了这个技巧。
方法#3(使用单个指针,数组被“展平”) ================================================== ==========使用此方法,您可以创建通用例程。尺寸没有 出现在任何声明中,因此您可以将它们添加到正式参数中 列表。
手动数组索引可能会减慢执行速度。
答案 2 :(得分:0)
问题在于func4()
和func5()
的矩阵定义不正确。
您将其定义为short mat[3][3]
,但在这种情况下,您实际上并未分配指向矩阵行的指针数组。你得到一个连续内存块的指针。
如果您希望将参数矩阵设为short int**
,则应将其定义如下:
#include <stdlib.h>
short int** mat;
for(int i = 0; i < 3; i++) {
mat[i] = (short int*)malloc (3*sizeof(short int));
for(int j = 0; j < 3; i++) {
mat[i][j] = i*10 + j;
}
}