Nano Hash - криптовалюты, майнинг, программирование

Использование qsort() со структурами

Я только начал изучать C, и я все еще новичок в этом. В этой программе я работаю с массивом структур. Структуры:

typedef struct {
    int day;
    int month;
    int year;
} Date;

typedef struct {
    int serial_num;
    char full_name[15];
    Date *pDate;
} Person;

Массив Person *people.

Теперь у меня есть два массива людей и дат рождения этих людей (те же индексы):

const char* names[MAX] = { "Sasson_Sassoni", "Pooh", "James_Bond", "Elvis_is_Alive", "Shilgiya", "Cleopatra", "Sissoo_VeSimmhoo" };

const int dates[MAX][COLS] = {
        { 10, 1, 1988 },
        { 12, 12, 1948 },
        { 4, 12, 1970 },
        { 11, 11, 1890 },
        { 11, 11, 1948 },
        { 1, 10, 1213 },
        { 12, 11, 1948 }
    };

При использовании switch case каждый раз, когда пользователь вводит 1, человек из списков (имя и день рождения) добавляется в список people. Затем, если пользователь вводит 3, список people должен быть отсортирован по дате (от самого старого к самому молодому). Поэтому я написал следующие две функции:

void sortList(Person **people, int index) {
    qsort(*people, index, sizeof(Person), intcmp);
}
int intcmp(const void *a, const void *b) {
    Person *one = (Person *)a;
    Person *two = (Person *)b;
    int year1 = one->pDate->year;
    int year2 = two->pDate->year;
    int month1 = one->pDate->month;
    int month2 = two->pDate->month;
    int day1 = one->pDate->day;
    int day2 = two->pDate->day;
    if (year1 > year2)
        return -1;
    else if (year2 > year1)
        return 1;
    if (month1 > month2)
        return -1;
    else if (month2 > month1)
        return 1;
    if (day1 > day2)
        return -1;
    else if (day2 > day1)
        return 1;
    return 0;
}

Но каждый раз я получаю сообщение об ошибке:

Exception thrown: read access violation.
one->pDate was nullptr.

Любая помощь? Спасибо!

РЕДАКТИРОВАТЬ: Дальнейшее объяснение: чтобы вставлять людей в массив один за другим, я создал переменную с именем index, и каждый раз, когда добавляется человек, индекс увеличивается на единицу. Итак, при вызове функции qsort() index — это количество людей в массиве. Также MAX=7, COLS=3, LEN=10. Функция, которая добавляет людей в массив:

void addToList(Person **people, int *index, const char *names[MAX], const int dates[][COLS]) {
    people[*index] = (Person *)malloc(sizeof(Person));
    people[*index]->serial_num = *index + 1;
    strcpy(people[*index]->full_name, names[*index]);
    Date *temp = (Date *)malloc(sizeof(Date));
    temp->day = dates[*index][0];
    temp->month = dates[*index][1];
    temp->year = dates[*index][2];
    people[*index]->pDate = temp;
    printf("%d %s     %d/%d/%d \n", people[*index]->serial_num, people[*index]->full_name, people[*index]->pDate->day, people[*index]->pDate->month, people[*index]->pDate->year);
    *index = *index + 1;
}
10.10.2017

  • Предоставьте минимально воспроизводимый пример. Каково значение index, например, что такое people? 10.10.2017
  • покажите нам код, который заполняет массив people 10.10.2017
  • Извините, добавил переменные и функцию, которая заполняет people. 10.10.2017
  • @Stargateur - Как-то поторопился, тебе не кажется? Это сообщение из среды выполнения. Это не имеет ничего общего с языком, на котором он компилируется. 10.10.2017
  • @Stargateur: Думаю, я должен спросить вас, а не ОП, так как вы редактировали теги. Почему С++? Мне кажется, С. 10.10.2017
  • Я сказал, почему в сообщении редактирования не стесняйтесь не соглашаться. Для меня код OP в среде С++. 10.10.2017
  • @Stargateur - Вполне может быть (может быть, даже немного вероятно). Но я думаю, что мы должны уточнить с ним. 10.10.2017
  • @eitanmayer - Чтобы помочь нам понять это раз и навсегда, char *c = malloc(1); компилируется в вашей программе как есть, или вам нужно добавить приведение? 10.10.2017
  • Я работаю в среде C++ в Visual Studios, но код должен быть языком C, потому что это то, что я изучаю. Что касается char *c = malloc(1);, то он не компилируется и приходится добавлять приведение. 10.10.2017
  • @eitanmayer - Используемый компилятор может повлиять на семантику! Используйте компилятор C, а не C++. Если вы еще этого не сделали, переключите свой проект в режим C. 10.10.2017
  • У вас должна быть функция, которая распечатывает данные в вашем массиве. Вы должны использовать эту функцию перед вызовом сортировки, чтобы убедиться, что ваши данные настроены правильно. Тогда вы можете быть более уверены в том, чем занимается ваша сортировка. 10.10.2017
  • eitanmayer Подумайте о том, чтобы встретиться с кем-то, кто 1) испытывает проблемы с кодом C и 2) сообщает, что не использует компилятор C. @StoryTeller совершенно прав. 10.10.2017

Ответы:


1

Ваш mcve не завершен, но я думаю, это потому, что вы путаете указатель и структуру:

void sortList(Person **people, int index) {
    qsort(people, index, sizeof(Person *), intcmp);
    // or qsort(people, index, sizeof *people, intcmp);
}

int intcmp(const void *a, const void *b) {
    const Person *one = *(const Person **)a;
    const Person *two = *(const Person **)b;
10.10.2017
  • Вау, это сработало! Я застрял на этом некоторое время, спасибо! 10.10.2017
  • Кстати, хорошо использовать const и не использовать Person *one = *(Person **)a; 10.10.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..