2-мерный массив и двойной указатель

Возможный дубликат:
Создать указатель на двумерный массив

Когда я вызываю функции func4 () и func5 (), я получаю следующие ошибки:

func4 () error: не может преобразовать ‘short int (*) [3]’ в ‘short int **’ для аргумента ‘1’ в ‘int func4 (short int **)’ | Ошибка func5 (): не может преобразовать ‘short int (*) [3]’ в ‘short int **’ для аргумента ‘1’ в ‘int func5 (short int **)’ |

Как исправить ошибку при вызове функций func4 () и func5 ()? Вот мой код:

#include  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; } 

Вы 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. Они одинаковы:

 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.I думаю, что 3-й func лучший! Он использует трюк с именем «flattening the array», который я читаю в POINTERS ON C.

Метод № 3 (с использованием одного указателя массив «сплющен») ================================== ========================== С помощью этого метода вы можете создавать универсальные подпрограммы. Размеры не отображаются в любом объявлении, поэтому вы можете добавить их в список формальных аргументов.

Индекс ручного массива, вероятно, замедлит выполнение.

Проблема заключается в некорректном определении матрицы для func4() и func5() .

Вы определяете его как short mat[3][3] , но в этом случае вы фактически не выделяете массив указателей на строки матрицы. Вы получаете один указатель на один непрерывный блок памяти.

Если вам нужна matrix аргументов pass как short int** , вы должны определить ее следующим образом:

 #include  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; } }