The OpenNET Project / Index page

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

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

"Разбор строки и передача результа массиву указателей"  
Сообщение от ufobject email(ok) on 26-Июн-06, 14:58 
Народ, я помню что уже задавал один раз этот вопрос, но достойного ответа я так и не нашел. Мне нужно возвращать массив строк заполненный данными, взятыми к примеру из результата запроса MySQL. Я сочинил массив указателей, но как мне каждый возращенный результат помещать по отдельному адресу?? Как это сделать оптимальнее?? Мне говорили что эта тема разбиралась уже в форуме, но где? Я не могу найти, дайте ссылку на инфу?
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

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


1. "Разбор строки и передача результа массиву указателей"  
Сообщение от BsDr (ok) on 26-Июн-06, 18:41 
>Народ, я помню что уже задавал один раз этот вопрос, но достойного
>ответа я так и не нашел. Мне нужно возвращать массив строк
>заполненный данными, взятыми к примеру из результата запроса MySQL. Я сочинил
>массив указателей, но как мне каждый возращенный результат помещать по отдельному
>адресу?? Как это сделать оптимальнее?? Мне говорили что эта тема разбиралась
>уже в форуме, но где? Я не могу найти, дайте ссылку
>на инфу?

char **array_lines;

mysql_query(mysql, "SELECT necessary_parameter FROM table;");
                
result = mysql_store_result(mysql);
    
lin_count = mysql_num_rows(result);
        
array_lines = calloc(lin_count, sizeof(char*));
    
for(i = 0; i < lin_count; i++)
{
    row = mysql_fetch_row(result);
    array_lines[i] = calloc(1000, sizeof(char));
    strcpy(array_lines[i], row[0]); //row[0] или что там надо
}
    
mysql_free_result(result);

Как-то так, если я правильно вопрос понял и не забыл, как на Си это все должно быть(если вообще на Си надо)

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

2. "Разбор строки и передача результа массиву указателей"  
Сообщение от ACCA (ok) on 26-Июн-06, 23:03 
Так будет побыстрее, хотя всё равно неясно, что же хотелось получить:

char **array_lines;

mysql_query(mysql, "SELECT necessary_parameter FROM table;");
result = mysql_store_result(mysql);

lin_count = mysql_num_rows(result);

array_lines = calloc(lin_count, 1000*sizeof(char*));

for(i = 0; i < lin_count; i++)
{
   row = mysql_fetch_row(result);
   strcpy(array_lines[i], row[0]); //row[0] или что там надо
}

mysql_free_result(result);


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

3. "Разбор строки и передача результа массиву указателей"  
Сообщение от ufobject email(??) on 27-Июн-06, 11:17 
Миллион благодарностей ВАМ!
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Разбор строки и передача результа массиву указателей"  
Сообщение от ufobject email(??) on 27-Июн-06, 11:59 
Эээ.. На сколько я понимаю, в последнем коде есть ошибка. Инструкция
strcpy(array_lines[i], row[0]);
выкидывает программу в ошибку "Segmentation failed". Я вроде поправил на
array_lines[i] = row[0];
ошибка исчезла.. Но появился еще один важный для меня вопрос. Я передал результат работы этого кода (массив указателей на выделенную память) из функции во внешний код, но как мне теперь узнать количество элементов массива (насколько забит массив)? Ужасно не хочется вводить еще одну переменную в которой указывать количество элементов.. Блин, где бы манчик такоф почитать, про массивы и работу с ними? Мож там функции какие интересные есть, операторы... Мои поиски к хорошим результатам меня не приводили к сожалению, а по каждой загводке с массивами писать в форум не хочется
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Разбор строки и передача результа массиву указателей"  
Сообщение от BsDr (ok) on 27-Июн-06, 12:15 
>Эээ.. На сколько я понимаю, в последнем коде есть ошибка. Инструкция
>strcpy(array_lines[i], row[0]);
>выкидывает программу в ошибку "Segmentation failed". Я вроде поправил на
>array_lines[i] = row[0];

На Си так делать нельзя!
Здесь присвоение адресов а не содержимого!

>ошибка исчезла.. Но появился еще один важный для меня вопрос. Я передал
>результат работы этого кода (массив указателей на выделенную память) из функции
>во внешний код, но как мне теперь узнать количество элементов массива
>(насколько забит массив)? Ужасно не хочется вводить еще одну переменную в
>которой указывать количество элементов..

Только так и получится!

>Блин, где бы манчик такоф почитать, про
>массивы и работу с ними?

Любой учебник по Си. Работа с массивами и указателями!

>Мож там функции какие интересные есть,
>операторы... Мои поиски к хорошим результатам меня не приводили к сожалению,
>а по каждой загводке с массивами писать в форум не хочется
>

И еще:

>array_lines = calloc(lin_count, 1000*sizeof(char*));
Здесь под массив выделяется lin_count количество элементов размером 1000 указателей на char! Отсюда "Segmentation failed"!
Нодо array_lines = calloc(lin_count, sizeof(char*));
А в цикле выделить память под строку:
array_lines[i] = calloc(1000, sizeof(char));

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

6. "Разбор строки и передача результа массиву указателей"  
Сообщение от ACCA (ok) on 28-Июн-06, 13:08 
>>array_lines = calloc(lin_count, 1000*sizeof(char*));
>Здесь под массив выделяется lin_count количество элементов размером 1000 указателей на char!

Это да. Следовало сделать

array_lines = calloc(lin_count, 1000*sizeof(char));

Хотя проблема не в этом, так как sizeof(char*) сильно больше sizeof(char).


>Отсюда "Segmentation failed"!

А вот здесь:

>> char **array_lines;

Нужно заменить на

char *array_lines[1000];

Разумеется в реальной программе нужно сделать
#define MAX_ROW_LENGTH 1000

и пользоваться им.


>А в цикле выделить память под строку:
>array_lines[i] = calloc(1000, sizeof(char));

Задача была избавиться от calloc в цикле. Во-первых долго, во-вторых освобождать тоже придётся в цикле.

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

7. "Разбор строки и передача результа массиву указателей"  
Сообщение от vic (??) on 28-Июн-06, 14:05 
>Разумеется в реальной программе нужно сделать
>#define MAX_ROW_LENGTH 1000

Не надо, а если строка длиной 1024? Лучше у mysql спросить длину строки и выделять динамически. А то измениться размер поляны в базе и здравствуй core dump.

>Задача была избавиться от calloc в цикле. Во-первых долго, во-вторых освобождать тоже
>придётся в цикле.

+1


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

8. "Разбор строки и передача результа массиву указателей"  
Сообщение от BsDr (ok) on 28-Июн-06, 15:09 
>>>array_lines = calloc(lin_count, 1000*sizeof(char*));
>>Здесь под массив выделяется lin_count количество элементов размером 1000 указателей на char!
>
>Это да. Следовало сделать
>
>array_lines = calloc(lin_count, 1000*sizeof(char));
>
>Хотя проблема не в этом, так как sizeof(char*) сильно больше sizeof(char).
>
>
>>Отсюда "Segmentation failed"!
>
>А вот здесь:
>
>>> char **array_lines;
>
>Нужно заменить на
>
>char *array_lines[1000];
>
>Разумеется в реальной программе нужно сделать
>#define MAX_ROW_LENGTH 1000
>
>и пользоваться им.
>
>
>>А в цикле выделить память под строку:
>>array_lines[i] = calloc(1000, sizeof(char));
>
>Задача была избавиться от calloc в цикле. Во-первых долго, во-вторых освобождать тоже
>придётся в цикле.

Конструкции
char *array_lines[1000];
и
char **array_lines;
array_lines = calloc(1000, sizeof(*char));
Идентичны!

Если сделать:

char *array_lines[1000];
array_lines = calloc(lin_count, 1000*sizeof(char));

то под первый элемент из array_lines веделится lin_count элементов размером 1000*sizeof(char), т.е. array_lines будет состоять из одной строки(в ней будет lin_count букв и под каждую букву выделено 1000*sizeof(char) байт), а не из lin_count строк!

Если я не прав поправте!

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

9. "Разбор строки и передача результа массиву указателей"  
Сообщение от ACCA (ok) on 01-Июл-06, 01:53 
>Конструкции
>char *array_lines[1000];

>char **array_lines;
>array_lines = calloc(1000, sizeof(*char));
>Идентичны!

да, в первом случае нужно было сказать

char (*array_lines)[1000];

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

10. "Разбор строки и передача результа массиву указателей"  
Сообщение от Alexander S. Salieff email on 05-Июл-06, 17:05 
>>Конструкции
>>char *array_lines[1000];
>>и
>>char **array_lines;
>>array_lines = calloc(1000, sizeof(*char));
>>Идентичны!
>
>да, в первом случае нужно было сказать
>
>char (*array_lines)[1000];


А почему нельзя сделать std::vector<std::string> и т.д? Запрет на линковку с libstdc++?

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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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