The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Создание и занесение элементов в массив"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Создание и занесение элементов в массив"  
Сообщение от psh email on 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; //возвращаем массив со всеми записями
}

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


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

2. "Создание и занесение элементов в массив"  
Сообщение от psh email on 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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Создание и занесение элементов в массив"  
Сообщение от Brick email(??) on 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


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Создание и занесение элементов в массив"  
Сообщение от Сергей (??) on 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;
}

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Создание и занесение элементов в массив"  
Сообщение от Сергей (??) on 25-Мрт-06, 04:09 
Сорри, путаю... Все прокатит, просто как я понимаю речь шла, как возвращать указатели на указатели на указатели на указатели и т.д. =)
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру