C - передать по ссылке многомерный массив с известным размером - PullRequest
3 голосов
/ 09 февраля 2009

В основном:

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 )
{

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 09 февраля 2009

Если бы вы переписали это так:

#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);
3 голосов
/ 09 февраля 2009

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

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

...