我以前的问题不是一个好问题,因为我没有得到很好的答案。因此,我决定编辑整个问题,希望可以在此论坛中进行编辑。
所以我有一个结构数组,其结构如下:
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
?
答案 0 :(得分:2)
您可能会因为使用*search_by_personaNumber
和*search_patient
而感到困惑。它们实际上称为search_by_personaNumber
和search_patient
,但返回指向Patient
结构的指针
与founded_patients
相同。此数组不包含10个Patient
结构,它包含10个指向Patient
结构的指针。
主要问题是您不能从函数返回数组。当您尝试使用founded_patients
的返回指针分配search_by_personaNumber
时,您将无法获得期望的结果。
请不要为founded_patients
分配返回值。由于它已经是一个指针(数组是指向多个值的指针),当您在search_by_personaNumber
中传递它时,它将已经被分配了值。
答案 1 :(得分:1)
您的数据结构中有些混乱:成员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
返回结果?