Скажите, будет ли такая конструкция функции корректной в C?
Если нет, что нужно подправить?function DBreturn_result (char *query) {
const char ** v;
const char *** result_arr;while (выбираем записи по одной) {
v = "массив со значениями колонок одной записи";
result_arr[] = v; //добавляем масиив одной записи как элемент в массив где будут хранится все записи
}
return result_arr; //возвращаем массив со всеми записями
}
эта конструкция не будет коректной почти в каждой строке( кроме
"while (выбираем записи по одной) { " потому что неизвеска суть),
нельзя это обяснить проще будет решить вашу задачу
>эта конструкция не будет коректной почти в каждой строке( кроме
>"while (выбираем записи по одной) { " потому что неизвеска суть),
> нельзя это обяснить проще будет решить вашу задачуЕсть функция, кот. получает данные из базы и выводит их в цикле по одной:
int DBselect(char *query, sqlo_db_handle_t handle)
{
char sql_string[1024];
sqlo_stmt_handle_t sth;
int status;
const char ** v;
const char *** result_arr;
sprintf(sql_string, query);
// Execute the query and create a statement handle in sth.
if (0 > (sth = (sqlo_open(handle, sql_string, 0, NULL)))) {
sqlo_rollback(dbh);
sqlo_finish(dbh);
exit(EX_OSERR);
}
// Fetch the data
while (SQLO_SUCCESS == (status = (sqlo_fetch(sth, 1)))) {
// get one record
v = sqlo_values(sth, NULL, 1);
printf("---------------------------\n");
printf("User: %s\n", v[0]);
printf("Name: %s ", v[1]);
printf("%s\n", v[2]);
printf("Address: %s\n", v[3]);
printf(" %s\n", v[4]);
printf("City: %s\n", v[5]);
printf("State: %s\n", v[6]);
printf("Zip: %s\n", v[7]);
printf("Phone: %s\n", v[8]);
printf("Age: %d\n\n", atoi(v[9]));
}
return 0;
}нужно же, чтобы она возврашала массив с результатом запроса.
Заранее спасибо за помощь, nezarek
тогда лучше сделать так:
int DBselect(char *query, sqlo_db_handle_t handle, char *result)
{
...
strcmp(result, "result!!!");
...
return 0;
}
а в программе при вызове передавать туда буфер для результата:
...
char res[512];
DBselect(query, handle, res);
...
иначе придется использовать статический буфер внутри функции:
char * DBselect(char *query, sqlo_db_handle_t handle)
{
...
static char result[512];
...
strcmp(result, "result!!!");
...
return result;
}
или выделять его там динамически:
char * DBselect(char *query, sqlo_db_handle_t handle)
{
...
char *result = malloc(512);
...
strcmp(result, "result!!!");
...
return result;
}
а потом возвращать результат, что не есть хорошо, особенно статический буфер, с ним про thread-safe можешь забыть, последний тоже лучше не использовать, будет забываться про free
Последний вариант не прокатат. =) Значение указателя изменится при выделении памяти и при выходе из ф-ции это значение потеряется.. Будет memory leak.Значит, двойные указатели спасут отца русской демократии... =)
Хороший пример был в реализации LString карманной библиотечки ITCGI для написания CGI скриптов... Там что-то типа-тогоtypedef char* Lstring;
void createString(LString *value){
*value = (LString) malloc(size);
}Если уж хочешь возвращать, то тогда выделяем память динамически в ф-ции
char *initMem(void){
return (char *)malloc(size)
}Когда будешь применять двумерные массивы, доюавишь циклы при выделении памяти и будет типа
typedef mytype *char
mytype *getTable(void){
mytype *ret = (mytype *) malloc (sizeX);
for (int i = 0; i < sizeX;i++)
ret[i] = (char *)malloc (sizeY);return ret;
}
Сорри, путаю... Все прокатит, просто как я понимаю речь шла, как возвращать указатели на указатели на указатели на указатели и т.д. =)