Передача структуры в функцию для присвоения значений - PullRequest
0 голосов
/ 07 декабря 2018

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

Test.c

struct student{
        int rollNumber;
        unsigned char name[20];
        int marks;
};

void func(struct student devanshu);

int main(){

        struct student devanshu;

        func(&devanshu);
        printf("--------------------%d\n", devanshu.rollNumber);
        printf("--------------------%d\n", devanshu.marks);
        printf("--------------------%s\n", devanshu.name);

}

NewTest.c:

void func(struct student devanshu)
{


        devanshu.rollNumber = 1;
        devanshu.marks = 909;
        strcpy(devanshu.name, "abc.xyz");


return;
}

И это вывод, который я получаю:

In file included from test.c:6:0:
newtest.c:10:30: error: parameter 1 (‘devanshu’) has incomplete type
 void func(struct student devanshu)

test.c: In function ‘main’:
test.c:23:7: error: incompatible type for argument 1 of ‘func’
  func(&devanshu);
       ^
In file included from test.c:6:0:
newtest.c:10:6: note: expected ‘struct student’ but argument is of type ‘struct student *’
 void func(struct student devanshu)

newtest.c:10:30: error: parameter 1 (‘devanshu’) has incomplete type
 void func(struct student devanshu)

newtest.c:7:20: error: storage size of ‘devanshu’ isn’t known
 struct student devanshu;

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

Был бы благодарен, если бы кто-нибудь мог помочь мне пройти.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

ошибка: параметр 1 ('devanshu') имеет неполный тип

Это означает, что определение структуры не отображается в файле, внутри которого вы его используете.Если это не является преднамеренным, вам нужно поместить определение структуры в заголовочный файл и включать его в каждый файл .c, используя struct.

ожидаемый «struct student», но аргумент имеет тип «struct student»* '

Вы неправильно написали функции.Это должно быть void func(struct student* devanshu);, а внутри функции вы должны иметь доступ к членам с devanshu-> ....В противном случае вы просто передаете копию структуры в функцию, а затем измените локальную копию.

0 голосов
/ 07 декабря 2018

Ошибки довольно очевидны.Возьмем это:

test.c: в функции 'main':

test.c: 23: 7: ошибка: несовместимый тип для аргумента 1 аргумента 'func'

func (& devanshu);

Это означает, что вы передаете в func что-то, что отличается от того, что вы сказали компилятору, который принимает func.Вы объявили, что функция принимает struct student

void func(struct student devanshu);

, но вызов функции передает указатель на struct student.

func(&devanshu);

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

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

* 1025.* Создайте файл с именем «student.h» (или любой другой) и перенесите в него определение структуры.А также объявление функции тоже.
struct student{
        int rollNumber;
        unsigned char name[20];
        int marks;
};

void func(struct student *);

и вверху обоих файлов C вы помещаете

#include "student.h"

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

0 голосов
/ 07 декабря 2018

Хорошо, это будет работать: (Объяснение ниже)

test.h: (Новый файл!)

struct student{
        int rollNumber;
        char name[20];
        int marks;
};

test.c:

#include <stdio.h>
#include <stdlib.h>
#include "test.h"

void func(struct student *devanshu);

int main(){

        struct student devanshu;

        func(&devanshu);
        printf("--------------------%d\n", devanshu.rollNumber);
        printf("--------------------%d\n", devanshu.marks);
        printf("--------------------%s\n", devanshu.name);

}

NewTest.c:

#include <string.h>
#include "test.h"


void func(struct student *devanshu)
{


    devanshu->rollNumber = 1;
    devanshu->marks = 909;
    strcpy(devanshu->name, "abc.xyz");


    return;
}

Этот

unsigned char name[20];

позже вызовет проблемы в strcpy ().Измените на просто символ.

Это

void func(struct student devanshu);

не так, но вы попадаете в ловушку.Структуры в C всегда передаются по значению (копии) всей структуры.Итак, если вы хотите, чтобы func () изменила исходную структуру, вы должны явно указать это так:

void func(struct student *devanshu);

Затем в func вам нужно изменить синтаксис доступа на использование оператора -> вместоиз '.'

Поскольку вы используете struct student в обоих файлах, вам нужно переместить объявление struct в заголовочный файл.Вы могли бы (как я сделал в самом первом редактировании) также повторить декларацию, потому что я был ленив, но комментарии на 100% правы: это очень опасная практика, поэтому я изменил ее.

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