2012-12-31 89 views
0

Possible Duplicate:
Create a pointer to two-dimensional array2維數組和雙指針

當我調用函數FUNC4()和func5()我得到的followinfg錯誤:

func4() error: cannot convert ‘short int (*)[3]’ to ‘short int**’ for argument ‘1’ to ‘int func4(short int**)’| func5() error: cannot convert ‘short int (*)[3]’ to ‘short int**’ for argument ‘1’ to ‘int func5(short int**)’|

我怎樣才能糾正調用函數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

我有一個建議你:不要寫多語言源文件。例如:頭文件「」不是C頭; 'printf()'的寫法通常在C語言中(也許'cout'在C++中更常見)。 – pmg

回答

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; 
    } 
} 
+0

謝謝你的回答。不改變函數func4()和func5()的解決方案是從main:func4((short **)mat)調用函數; func5((short **)mat); –

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此,如果事情可以通過一種方式容易且乾淨完成後,不要試圖通過骯髒的和困難的方式,因爲它會做到這一點在將來修改或更新代碼時會讓自己感到迷惑。

+0

爲清潔和簡單的答案+1的好建議 – Naruto

1

1.They是相同的:

int func(short **mat); 
int func(short *mat[]); 
int func(short *mat[3]); 

而且short **是不兼容short (*)[3],因爲它們指向的類型是不同的。 short **指向short *short (*)[3]指向short[3]

2.Maybe你可以試試這個:

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.我認爲第三FUNC是最好的!它使用了一個名爲「flattening the array」的技巧,我在指針上讀取了C

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.