C – Передача по эталонному многомерному массиву с известным размером

В основном:

char *myData[500][9]; //dynamic rows?? char **tableData[500]={NULL}; //dynamic rows?? int r; newCallBack(db, &myData, &tableData, &r); 

и переходит в функцию:

 void newCallBack(sqlite3 *db, char** mdat, char*** tdat, int* r ) { 

Кажется, это не нравится? Какие-либо предложения? Множество примеров онлайн, когда вы не знаете размер, пробовав их прямо сейчас …

Благодарю.

    Прежде всего, проблема с myData заключается в том, что это неправильный тип. char * [] [] потребует прототип char *** (двумерный массив строк) в вызываемой функции. Функция хочет список строк, который является char * [], или альтернативно char [] [], если вы не возражаете ограничивать размер строк.

    Чтобы получить полностью динамические размеры массива, вам придется вручную выделять (и выпускать!) Память с помощью malloc () и free () и изменять типы переменных в char ** myData и char *** tableData.

    Если вы должны переписать это как таковое:

     #define NUM_ROWS 500; #define NUM_COLS 9; char **myData = NULL; char *tableData = NULL; int i; int r; myData = malloc(sizeof(char *) * NUM_ROWS); if (!myData) return; /*bad return from malloc*/ tableData = malloc(sizeof(char) * NUM_ROWS); if (!tableData) return; /*bad return from malloc*/ for (i = 0; i < NUM_ROWS; i++) { myData[i] = malloc(sizeof(char) * NUM_COLS); if (!myData[i]) return; /*bad return from malloc*/ } 

    Затем вы вызываете newCallBack (), если хотите получить доступ к данным ( myData , tableData и r ):

     /*prototype*/ void newCallBack(sqlite3 *db, char** mdat, char* tdat, int r); /*call*/ newCallBack(db, myData, tableData, r); 

    Или это, если вы хотите иметь возможность изменять то, на что указывают мои данные myData и tableData, и значение r :

     /*prototype*/ void newCallBack(sqlite3 *db, char ***mdat, char **tdat, int *r); /*call*/ newCallBack(db, &myData, &tableData, &r);