Использование qsort для сортировки целых чисел без знака - PullRequest
0 голосов
/ 09 февраля 2012

Программа, над которой я работаю, берет файл и анализирует его построчно, затем меняет каждую строку на uint32_t и добавляет его в массив.Оттуда я должен отсортировать массив с помощью qsort ().Я написал свою программу так, как мне показалось, но когда я тестирую код, он говорит, что все новые uint32_ts имеют одинаковое значение.Это из-за ошибки, когда я изменяю строку в uint32_t?Было бы лучше использовать strtoul?Последний вопрос: правильна ли реализация моего qsort?(он компилирует и говорит, что отсортировал что-то, но я не уверен, поскольку мое преобразование в uint_32, очевидно, неверно.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012
uint32_t t = (uint32_t) line;

Это неправильный способ преобразования строки в число в C. Возможно, вы захотите использовать strtoul вместо этого. И ваш qsort также неверен (неправильное количество элементов, неправильный размер элемента).

parArray[lineCounter] = strtoul(line, NULL, 10);

/* ... */
qsort(parArray, lineCounter, sizeof(uint32_t), compar);

Вы определяете свою функцию compar внутри другой функции. Это расширение GCC, и вы не должны его использовать, если не планируете переносимость.

1 голос
/ 09 февраля 2012

Вы не анализируете строки, когда читаете их. Приведение line к uint32_t просто берет адрес этого массива в памяти. Это объясняет, почему каждая строка вывода одинакова. Вы, вероятно, хотите позвонить strtoul(line, NULL, 10) или аналогичный.

Кроме того, ваш второй параметр qsort отключен на единицу. lineCounter имеет правильное значение в момент окончания цикла: количество строк в файле. Добавляя один, вы вводите неопределенное поведение, читая заполненные значения в массиве.

...