Подтвердить что ты не робот

Передача структуры в функцию

Я новый программист на C, и мне хотелось знать, как передать функцию struct на функцию. Я получаю сообщение об ошибке и не могу определить правильный синтаксис. Вот код для него....

struct:

struct student{
        char firstname[30];
        char surname[30];
    };

    struct student person;

вызов:

addStudent(person);

прототип:

void addStudent(struct student);

и фактическая функция:

void addStudent(person)
{
    return;
}

ошибки компилятора:

line 21: warning: dubious tag declaration: struct student
line 223: argument #1 is incompatible with prototype:
4b9b3361

Ответ 1

Реализация функции линии должна быть:

void addStudent(struct student person) {

}

person - это не тип, а переменная, вы не можете использовать его как тип параметра функции.

Кроме того, убедитесь, что ваша структура определена перед прототипом функции addStudent, поскольку прототип ее использует.

Ответ 2

Вот как передать struct по ссылке. Это означает, что ваша функция может получить доступ к struct вне функции и изменить ее значения. Вы делаете это, передавая указатель на структуру функции.

#include <stdio.h>
/* card structure definition */
struct card
{
    int face; // define pointer face
}; // end structure card

typedef struct card Card ;

/* prototype */
void passByReference(Card *c) ;

int main(void)
{
    Card c ;
    c.face = 1 ;
    Card *cptr = &c ; // pointer to Card c

    printf("The value of c before function passing = %d\n", c.face);
    printf("The value of cptr before function = %d\n",cptr->face);

    passByReference(cptr);

    printf("The value of c after function passing = %d\n", c.face);

    return 0 ; // successfully ran program
}

void passByReference(Card *c)
{
    c->face = 4;
}

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

#include <stdio.h>


/* global card structure definition */
struct card
{
    int face ; // define pointer face
};// end structure card

typedef struct card Card ;

/* function prototypes */
void passByValue(Card c);

int main(void)
{
    Card c ;
    c.face = 1;

    printf("c.face before passByValue() = %d\n", c.face);

    passByValue(c);

    printf("c.face after passByValue() = %d\n",c.face);
    printf("As you can see the value of c did not change\n");
    printf("\nand the Card c inside the function has been destroyed"
        "\n(no longer in memory)");
}


void passByValue(Card c)
{
    c.face = 5;
}

Ответ 3

При передаче структуры в другую функцию обычно лучше делать, как предложил Доннелл выше, и передать ее по ссылке.

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

Вот пример простейшего способа сделать это:

#include <stdio.h>

typedef struct student {
    int age;
} student;

void addStudent(student *s) {
    /* Here we can use the arrow operator (->) to dereference 
       the pointer and access any of it members: */
    s->age = 10;
}

int main(void) {

    student aStudent = {0};     /* create an instance of the student struct */
    addStudent(&aStudent);      /* pass a pointer to the instance */

    printf("%d", aStudent.age);

    return 0;
}

В этом примере аргумент для функции addStudent() является указателем на экземпляр student struct - student *s. В main() мы создаем экземпляр структуры student, а затем передаем ссылку на него нашей функции addStudent(), используя ссылочный оператор (&).

В функции addStudent() мы можем использовать оператор стрелки (->) для разыменования указателя и доступа к любому из его членов (функционально эквивалентный: (*s).age).

Любые изменения, которые мы делаем в функции addStudent(), будут отражаться, когда мы вернемся к main(), потому что указатель дал нам ссылку на то, где в памяти хранится экземпляр структуры student. Это иллюстрируется printf(), который будет выводить "10" в этом примере.

Если бы вы не передали ссылку, вы бы действительно работали с копией структуры, которую вы передали функции, что означает, что любые изменения не будут отражаться при возврате к main - если вы не внедрили способ передавая новую версию структуры обратно на главную или что-то в этом направлении!

Несмотря на то, что указатели могут казаться неактивными сначала, как только вы обдумываете, как они работают, и почему они так удобны, они становятся второй натурой, и вам интересно, как вы справлялись без них!

Ответ 4

Вам нужно указать тип для человека:

void addStudent(struct student person) {
...
}

Кроме того, вы можете напечатать вашу структуру, чтобы избежать необходимости вводить структуру каждый раз, когда вы ее используете:

typedef struct student{
...
} student_t;

void addStudent(student_t person) {
...
}

Ответ 5

Вместо:

void addStudent(person)
{
    return;
}

попробуйте следующее:

void addStudent(student person)
{
    return;
}

Поскольку вы уже объявили структуру под названием "студент", вам необязательно указывать ее в реализации функции, как в:

void addStudent(struct student person)
{
    return;
}