Народ, я помню что уже задавал один раз этот вопрос, но достойного ответа я так и не нашел. Мне нужно возвращать массив строк заполненный данными, взятыми к примеру из результата запроса MySQL. Я сочинил массив указателей, но как мне каждый возращенный результат помещать по отдельному адресу?? Как это сделать оптимальнее?? Мне говорили что эта тема разбиралась уже в форуме, но где? Я не могу найти, дайте ссылку на инфу?
>Народ, я помню что уже задавал один раз этот вопрос, но достойного
>ответа я так и не нашел. Мне нужно возвращать массив строк
>заполненный данными, взятыми к примеру из результата запроса 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);Как-то так, если я правильно вопрос понял и не забыл, как на Си это все должно быть(если вообще на Си надо)
Так будет побыстрее, хотя всё равно неясно, что же хотелось получить: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);
Миллион благодарностей ВАМ!
Эээ.. На сколько я понимаю, в последнем коде есть ошибка. Инструкция
strcpy(array_lines[i], row[0]);
выкидывает программу в ошибку "Segmentation failed". Я вроде поправил на
array_lines[i] = row[0];
ошибка исчезла.. Но появился еще один важный для меня вопрос. Я передал результат работы этого кода (массив указателей на выделенную память) из функции во внешний код, но как мне теперь узнать количество элементов массива (насколько забит массив)? Ужасно не хочется вводить еще одну переменную в которой указывать количество элементов.. Блин, где бы манчик такоф почитать, про массивы и работу с ними? Мож там функции какие интересные есть, операторы... Мои поиски к хорошим результатам меня не приводили к сожалению, а по каждой загводке с массивами писать в форум не хочется
>Эээ.. На сколько я понимаю, в последнем коде есть ошибка. Инструкция
>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));
>>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 в цикле. Во-первых долго, во-вторых освобождать тоже придётся в цикле.
>Разумеется в реальной программе нужно сделать
>#define MAX_ROW_LENGTH 1000Не надо, а если строка длиной 1024? Лучше у mysql спросить длину строки и выделять динамически. А то измениться размер поляны в базе и здравствуй core dump.
>Задача была избавиться от calloc в цикле. Во-первых долго, во-вторых освобождать тоже
>придётся в цикле.+1
>>>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 строк!
Если я не прав поправте!
>Конструкции
>char *array_lines[1000];
>и
>char **array_lines;
>array_lines = calloc(1000, sizeof(*char));
>Идентичны!да, в первом случае нужно было сказать
char (*array_lines)[1000];
>>Конструкции
>>char *array_lines[1000];
>>и
>>char **array_lines;
>>array_lines = calloc(1000, sizeof(*char));
>>Идентичны!
>
>да, в первом случае нужно было сказать
>
>char (*array_lines)[1000];
А почему нельзя сделать std::vector<std::string> и т.д? Запрет на линковку с libstdc++?