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

Исходное сообщение
"Разбор строки и передача результа массиву указателей"

Отправлено ufobject , 26-Июн-06 14:58 
Народ, я помню что уже задавал один раз этот вопрос, но достойного ответа я так и не нашел. Мне нужно возвращать массив строк заполненный данными, взятыми к примеру из результата запроса MySQL. Я сочинил массив указателей, но как мне каждый возращенный результат помещать по отдельному адресу?? Как это сделать оптимальнее?? Мне говорили что эта тема разбиралась уже в форуме, но где? Я не могу найти, дайте ссылку на инфу?

Содержание

Сообщения в этом обсуждении
"Разбор строки и передача результа массиву указателей"
Отправлено BsDr , 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);

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


"Разбор строки и передача результа массиву указателей"
Отправлено ACCA , 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);



"Разбор строки и передача результа массиву указателей"
Отправлено ufobject , 27-Июн-06 11:17 
Миллион благодарностей ВАМ!

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

"Разбор строки и передача результа массиву указателей"
Отправлено BsDr , 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));


"Разбор строки и передача результа массиву указателей"
Отправлено ACCA , 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 в цикле. Во-первых долго, во-вторых освобождать тоже придётся в цикле.


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

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

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

+1



"Разбор строки и передача результа массиву указателей"
Отправлено BsDr , 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 строк!

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


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

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

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

char (*array_lines)[1000];


"Разбор строки и передача результа массиву указателей"
Отправлено Alexander S. Salieff , 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++?