qsort () из stdlib.h не сортирует специализированную структуру, содержащую почтовые индексы и соответствующий город - PullRequest
0 голосов
/ 27 апреля 2020

Я использую этот глобальный кризис для изучения C помимо своих занятий, и я изучаю немецкую книгу (Rheinwerk Computing: C von A bis Z, ANSI-C99) и, наконец, достиг функций поиска. В качестве практики я хотел реализовать функцию сортировки для обеспечения функциональности бинарного поиска.

Моя проблема в том, что всякий раз, когда я добавляю новую zip-структуру, они не сортируются. Я уже просматривал различные вопросы здесь и узнал, как построить функцию сравнения для структур и как обрабатывать структуры с помощью qsort. Но похоже, что ответы не помогли, или я, вероятно, бросил, чтобы увидеть его.

Техническая среда: я использую vim и g cc (FLAGS: -Wpedanti c -Wstrict-aliasing -Wshadow -Wcast-align -Wextra -Wfloat-equal) в 32-битной подсистеме debian для windows. Так как g cc ни на что не жалуется при компиляции кода, мне интересно, что я сделал неправильно.

Мой код:

struct zipc
{
   char place[255];
   unsigned int zip;
};

struct zipc zipcodes[100];

static int N; //Counting how many adresses are already typed in

// create new zip with city, init function creates one with N=0 and dummy values

void insertbs(unsigned int p, char *o) 
{
    zipcodes[++N].zip = p;
    strcpy(zipcodes[N].place, o);
}

int cmp_uinteger(const void *value1, const void *value2)
{
   const struct zipc *p1 = value1;
   const struct zipc *p2 = value2;

   if(p1->zip > p2->zip) 
        return 1;
   if(p2->zip > p1->zip)
        return (-1);
   else 
        return 0;
}

//usage of qsort later in main

qsort(zipcodes, N-1, sizeof(unsigned int), cmp_uinteger);

Функция cmp_uinteger вдохновлена ​​другим вопросом здесь и кажется довольно хорошим, но сортировка всегда дает сбой, но не так, как это происходит с ошибкой программы. Программа работает, но если кто-то вставляет почтовые индексы в произвольном порядке, двоичный поиск завершается неудачно, поэтому я думаю, что речь идет о qsort (), но я могу быть где-то еще. Я думаю, что я не совсем понимаю смысл функции сравнения, может быть, кто-то тоже может это объяснить.

Мне кажется странным размещать мой первый вопрос здесь, потому что переполнение стека стало моим вторым домом во время урока C: D

С наилучшими пожеланиями, Maleware

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020
qsort(zipcodes, N-1, sizeof(unsigned int), cmp_uinteger);

Третий аргумент qsort() "Размер в байтах каждого элемента в массиве" .

В вашем случае это должно быть sizeof(struct zipc) вместо sizeof(unsigned int) .

1 голос
/ 27 апреля 2020

При фиктивном значении zipcodes[0] сортируйте по zipcodes + 1 и используйте размер элемента массива - проще кодировать, проверять и поддерживать, чем пытаться кодировать размер типа (который был неправильным типом в Код ОП)

// qsort(zipcodes, N-1, sizeof(unsigned int), cmp_uinteger);
qsort(zipcodes + 1, N-1, sizeof zipcodes[0], cmp_uinteger);
...