Как передать и получить обратный указатель на массив структур? - PullRequest
0 голосов
/ 23 июня 2019

Мой предыдущий вопрос не был хорошим, поэтому я не получил хороших ответов. Поэтому я решил отредактировать весь вопрос, надеюсь, это нормально на этом форуме.

Итак, у меня есть массив структур, и структура выглядит следующим образом:

struct patient {
    int pictures[2];
    int personal_number;
    char patient_name[FILE_PATIENT_NAMES + 1];
    int num_of_matches;
};

typedef struct patient Patient;

Patient patientregister[5];

У меня есть две функции, как показано ниже:

/********* function declaration *********/

Patient *search_patient(Patient patientregister[], int num_of_patients);
Patient *search_by_personaNumber(Patient *matches[],
                                 Patient patientregister[], int num_of_patients);

Код начинается с *search_patient, а затем переходит к *search_bu_personalNumber. *search_patient имеет еще один массив структур, объявленных внутри него: Patient matches[5];, и идея состоит в том, чтобы отправить указатель с Patient matches[5]; на *search_by_personalNumber. и затем верните его на *search_patient с совпадениями, которые ищет пользователь. Мой вопрос заключается в том, как отправить указатель на массив структур в другую функцию, использовать указатель для заполнения массива структур и отправить указатель обратно на исходную функцию, в моем случае *search_patient?

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Возможно, вы путаете ваши функции с вызовами *search_by_personaNumber и *search_patient.Они на самом деле называются search_by_personaNumber и search_patient, но возвращают указатель на Patient struct

То же самое с founded_patients.Этот массив не содержит 10 Patient структур, он содержит 10 указателей на Patient структур.

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

Вместо этого не присвойте founded_patients с возвращаемым значением.Поскольку это уже указатель (массивы являются указателями на несколько значений), когда вы передаете его в search_by_personaNumber, ему уже будут присвоены значения.

1 голос
/ 23 июня 2019

Существует некоторая путаница в вашей структуре данных: член num_of_matches не имеет никакого отношения к структуре Patient. Вместо этого вы должны отслеживать количество найденных пациентов (а не основанных ), возвращая число из search_by_personaNumber.

Вот модифицированная версия вашего кода:

#include <stdio.h>

/*---- Declarations ----*/
typedef struct patient {
    int pictures[2];
    int personal_number;
    char patient_name[FILE_PATIENT_NAMES + 1];
} Patient;

/* patientregister[] is the original array of structures where the patients' data are stored */
Patient *search_patient(Patient patientregister[], int num_of_structs);
int search_by_personaNumber(Patient *found_patients[], int found_max,
                            Patient patientregister[], int num_of_structs);

/*---- Implementation ----*/
int search_by_personaNumber(Patient *found_patients[], int found_max,
                            Patient patientregister[], int num_of_patients) {
    int personal_nr,
    int matched_patients;

    printf("\nEnter personal number to search for: ");
    if (scanf("%d", &personal_nr) != 1)
        return 0;

    matched_patients = 0;
    for (int j = 0; j < num_of_patients && matched_patients < found_max; j++) {
        if (patientregister[j].personal_number == personal_nr) {
            founded_patients[matched_patients] = patientregister[j];
            matched_patients++;
        }
    }
    return matched_patients;
}

Patient *search_patient(Patient patientregister[], int num_of_patients) {

    Patient *found_patients[10];
    int found_count;
    int choice;

    printf("\nSearch by: personal number(1), name(2) of pic ref.(3)? ");
    if (scanf("%d", &choice) != 1)
        return NULL;

    switch (choice) {
      case 1:
        found_count = search_by_personaNumber(found_patients, sizeof(found_patients) / sizeof(found_patients[0]), 
                                              patientregister, num_of_patients);

        /************FOR DEBUGGING: DOWN HERE AM JUST TRYING TO SEE IF I CAN PRINT 
        THE CONTENTS IN found_patients ************/

        printf("\n");
        printf("  %-20s%-9s%-20s", "Personal number", "Name", "Picture reference\n\n");
        printf("------------------------------------------------\n");

        for (int j = 0; j < found_count; j++) {
            printf(" %7d%18s\t\t%d,%d\n",
                   found_patients[j]->personal_number,
                   found_patients[j]->patient_name);
                   found_patients[j]->pictures[0],
                   found_patients[j]->pictures[1]);
        }
        /************END DEBUGGING ************/
        break;
      case 2:
        break;
      case 3:
        break;
      default:
        printf("Invalid search choice!\n");
        break;
    }
}

Некоторые важные вопросы, на которые вы должны ответить сейчас:

  • что делать с неверным вводом?
  • как вы возвращаете результаты из search_patient?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...