Возможный дубликат:
Создать указатель на двумерный массив
Когда я вызываю функции 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; } }