URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5244
[ Назад ]

Исходное сообщение
"Создание и занесение элементов в массив"

Отправлено psh , 16-Мрт-06 17:51 
Скажите, будет ли такая конструкция функции корректной в C?
Если нет, что нужно подправить?

function DBreturn_result (char *query) {
   const char ** v;
   const char *** result_arr;

   while (выбираем записи по одной) {
      v = "массив со значениями колонок одной записи";
      result_arr[] = v; //добавляем масиив одной записи как элемент в массив где будут хранится все записи
   }
   return result_arr; //возвращаем массив со всеми записями
}


Содержание

Сообщения в этом обсуждении
"Создание и занесение элементов в массив"
Отправлено Anonymous , 16-Мрт-06 19:43 
эта конструкция  не будет коректной почти в каждой строке( кроме
"while (выбираем записи по одной) { " потому что неизвеска суть),
нельзя это обяснить проще будет решить вашу задачу

"Создание и занесение элементов в массив"
Отправлено psh , 16-Мрт-06 22:09 
>эта конструкция  не будет коректной почти в каждой строке( кроме
>"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


"Создание и занесение элементов в массив"
Отправлено Brick , 18-Мрт-06 03:59 
тогда лучше сделать так:
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



"Создание и занесение элементов в массив"
Отправлено Сергей , 25-Мрт-06 04:06 
Последний вариант не прокатат. =) Значение указателя изменится при выделении памяти и при выходе из ф-ции это значение потеряется.. Будет 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;
}


"Создание и занесение элементов в массив"
Отправлено Сергей , 25-Мрт-06 04:09 
Сорри, путаю... Все прокатит, просто как я понимаю речь шла, как возвращать указатели на указатели на указатели на указатели и т.д. =)