Вопрос по function, c, struct – Передача структуры в функцию

44

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

Struct:

<code>struct student{
    char firstname[30];
    char surname[30];
};

struct student person;
</code>

Вызов:

<code>addStudent(person);
</code>

Прототип:

<code>void addStudent(struct student);
</code>

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

<code>void addStudent(person)
{
    return;
}
</code>

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

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

да, это в моем объеме функций Daniel Del Core
Где вы декларируете свою структуру? В вашем текущем файле реализации, где вашstruct student { /* ... */ }; код? Похоже, что он находится в неправильной области (как объявлено в вашемmain функция или любая другая функция, которую вы пытаетесь вызватьaddStudent от... Jason Coco

Ваш Ответ

5   ответов
0

Вместо:

void addStudent(person)
{
    return;
}

попробуй это:

void addStudent(student person)
{
    return;
}

Поскольку вы уже объявили структуру, называемую «студент» Вы не обязательно должны указывать это в реализации функции, как в:

void addStudent(struct student person)
{
    return;
}
Я так не думаю. Без typedef происходит ошибка.
8

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

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

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

#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's 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 структура -student *s, Вmain()мы создаем экземплярstudent структура, а затем передать ссылку на это нашемуaddStudent() функция с использованием оператора ссылки (&).

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

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

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

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

37

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

void addStudent(struct student person) {

}

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

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

Хорошей идеей является "имя" Тип структуры, чтобы избежать этой проблемы, используя typedef. Увидетьen.wikipedia.org/wiki/Struct_(C_programming_language)
@DanielDC - см редактировать
@jouniaro - абсолютно, но по одному шагу за раз :)
Вы приветствуете, не принимайте это слишком усердно, это не тривиально, когда вы начинаете с языка.
@Binyamin Sharet, я все еще получаю ту же ошибку Daniel Del Core
83

Это как пройти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;
}
Абсолютно идеально!
кратким. Довольно аккуратно.
4

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

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

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

typedef struct student{
...
} student_t;

void addStudent(student_t person) {
...
}

Похожие вопросы