Как вызвать функцию void с указателем структуры в качестве параметра в C? - PullRequest
2 голосов
/ 29 февраля 2020

Все, что мне действительно нужно, это просто примеры того, как вернуть функции такого рода вызывающей стороне. Не нужно даже иметь отношение к моему коду, кроме типа функции и параметра.

Я написал эту функцию ниже, которая должна считывать имя и возраст трех пользователей, определенных пользователем.

void readData(Person *p) 
{
    char name1[20], name2[20], name3[20];
    int age1, age2, age3;
    printf("Enter person 1: \n");
    scanf("%s %d", &name1, &age1);
    printf("Enter person 2: \n");
    scanf("%s %d", &name2, &age2);
    printf("Enter person 3: \n");
    scanf("%s %d", &name3, &age3);
    struct person1 {char name1[20]; int age1};
    struct person2 {char name2[20]; int age2};
    struct person3 {char name3[20]; int age3};
    struct Person {struct person1; struct person2; struct person3};
    struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
    p = &man;
}

Я хотел бы повторно использовать переменные вышеупомянутой функции, чтобы я мог использовать ее в функции ниже. Как я должен это сделать, поскольку я не могу «повторно объявить» переменные, потому что они определены пользователем? Должен ли я позвонить по ссылке или по значению, и если да, то как мне это сделать? Мне нужно return что-нибудь? Я не могу найти примеры для такого рода функций, любая помощь действительно приветствуется.

Person findMiddleAge(Person *p) 
{
    int middle;
    if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
        middle = age2;
        struct Person man[1] = {name2, age2};
        }
    else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
            middle = age1; 
            struct Person man[1] = {name1, age1};
            }
    else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
        middle = age3;
        struct Person man[1] = {name3, age3};
        }
    printf("%d \n", middle);
}

Блок кода ниже показывает весь мой код на всякий случай, если это имеет значение. Ничего нельзя изменить, кроме строк кода в функциях readData(Person *p) и Person findMiddleAge(Person *p).

typedef struct {
   char name[20]; 
   int age;
} Person; 

void readData(Person *p);
Person findMiddleAge(Person *p);
int main() 
{
   Person man[3], middle;   

   readData(man);
   middle = findMiddleAge(man);
   printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
   return 0;
}

void readData(Person *p) 
{
    char name1[20], name2[20], name3[20];
    int age1, age2, age3;
    printf("Enter person 1: \n");
    scanf("%s %d", &name1, &age1);
    printf("Enter person 2: \n");
    scanf("%s %d", &name2, &age2);
    printf("Enter person 3: \n");
    scanf("%s %d", &name3, &age3);
    struct person1 {char name1[20]; int age1};
    struct person2 {char name2[20]; int age2};
    struct person3 {char name3[20]; int age3};
    struct Person {struct person1; struct person2; struct person3};
    struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
    p = &man;
}

Person findMiddleAge(Person *p) 
{
    int middle;
    if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
        middle = age2;
        struct Person man[1] = {name2, age2};
        }
    else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
            middle = age1; 
            struct Person man[1] = {name1, age1};
            }
    else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
        middle = age3;
        struct Person man[1] = {name3, age3};
        }
    printf("%d \n", middle);
}

И да, это домашняя работа, но я действительно старался изо всех сил (я более 6 часов пытался получить желаемый результат, но я все еще не могу, C мне очень трудно понять). Я должен найти человека, чей возраст составляет середину трех человек, и вернуть имя и возраст этого человека звонившему. Я иду обо всем неправильно? На самом деле я просто хочу знать, как вернуть функции такого рода вызывающей стороне. Нужно ли ставить какие-либо заявления return? Я не могу найти примеры на нем (если у кого-то есть примеры, я думаю, что могу сам разобраться в коде с этими примерами)

Спасибо за любую помощь заранее, я действительно ценю это.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

В одной строке у вас есть две проблемы:

p = &man
  1. Вы назначаете указатель на локальную переменную (и разыменовываете ее после возврата функции), которая является UB.
  2. Вы присваиваете локальный указатель p, и это назначение не оказывает никакого влияния (так как p перестает существовать, когда функция возвращается). Чтобы изменить сам указатель, нужно передать указатель на указатель.
void readData(Person **p) 
{
    /* ... */
    *p = newpvalue;
}

Я считаю, что в вашем коде гораздо больше подобных проблем. Я советую сосредоточиться на C основах (объемы, переменные, указатели и т. Д. c.)

0 голосов
/ 29 февраля 2020

In readData и findMiddleAge p указывает на man[3] в main.
В readData массив может быть заполнен напрямую. Хорошая привычка проверять возврат scanf. Если имя и возраст отсканированы, возвращается 2. Значение 1, 0 или EOF указывает на проблему.
В findMiddleAge определяют, какое среднее значение равно p[0].age, p[1].age или p[2].age и верните правильный.

#include <stdio.h>

typedef struct {
    char name[20];
    int age;
} Person;

void readData(Person *p);
Person findMiddleAge(Person *p);

int main()
{
    Person man[3] = { { "", 0}}, middle = { "", 0};

    readData(man);
    middle = findMiddleAge(man);
    printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
    return 0;
}

void readData(Person *p)
{
    printf("Enter person 1: \n");
    scanf("%19s %d", p[0].name, &p[0].age);
    printf("Enter person 2: \n");
    scanf("%19s %d", p[1].name, &p[1].age);
    printf("Enter person 3: \n");
    scanf("%19s %d", p[2].name, &p[2].age);
}

Person findMiddleAge(Person *p)
{
    //figure out which is the middle value of
    //p[0].age
    //p[1].age
    //p[2].age
    return p[1];//or p[0] or p[2]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...