2012-02-09 7 views
0

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

int main(int argc, char* argv[]){ 
    char const* const fileName = argv[1]; 
    FILE* file = fopen(fileName, "r"); // should check the result 
    char line[256]; 
    uint32_t parArray[256]; 
    int compar(const void *a, const void *b){ 
    const unsigned long long *x = a, *y = b; 
    if(*x > *y) 
     return 1; 
    else 
     return(*x < *y) ? -1: 0; 
    } 
    int lineCounter = 0; // starts at 0 for the array 
    while(fgets(line, sizeof(line), file)){ 
    // parse all info here 
    uint32_t t = (uint32_t) line; 
    // build the array 
    parArray[lineCounter]=t; 
    lineCounter++; 
    printf("Original: %s, Unsigned Int: %u\n", line,t); 
    } 
    qsort(&parArray[0],lineCounter+1,sizeof(uint32_t*),compar); 
    int i; 
    for(i=0;i<lineCounter;i++){ 
    printf("%u\n",parArray[i]); 
    } 
    return 0; 
} 
+0

Определение функции внутри другой функции (здесь 'compare' внутри' main') является расширением gcc. Если вы хотите, чтобы ваш код был портативным, вы не должны его использовать. Просто переместите определение 'compare' перед' main'. –

ответ

1

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

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

3
uint32_t t = (uint32_t) line; 

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

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

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

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

+0

спасибо, что это было точно. Ваше объяснение было намного лучше, чем что-либо еще, что я читал –

+0

«Никогда не делай этого!» вы знаете, троглодиты служат далеко в шахтах GCC долго и упорно работали, чтобы вы могли уволить их расширения из рук ;-) –

+0

@SteveJessop Ты прав, я был вне линии. – cnicutar

Смежные вопросы