簡體   English   中英

將struct傳遞給函數以賦值

[英]Passing struct to a function to assign values

我試圖將結構傳遞給駐留在單獨文件中的函數。 當將結構作為參數傳遞時,它將引發錯誤。

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使用該函數,則不會引發任何錯誤,並且工作正常。 但是,當將函數保存在兩個不同的文件中時,會出現這些錯誤。

如果有人可以幫助我度過難關,將不勝感激。 提前致謝。

錯誤:參數1('devanshu')的類型不完整

這意味着結構定義對於您在其中使用的文件不可見。 除非故意這樣做,否則您需要將結構定義放在頭文件中,並使用該結構在每個.c文件中都包括該定義。

預期的“結構學生”,但參數的類型為“結構學生*”

您編寫的功能不正確。 它應該是void func(struct student* devanshu); 在函數內部,您應該使用devanshu-> ...訪問成員。 否則,您只需將結構的副本傳遞給函數,然后更改本地副本。

錯誤是不言自明的。 拿這個:

test.c:在函數“ main”中:

test.c:23:7:錯誤:“ func”的參數1的類型不兼容

FUNC(&devanshu);

這意味着您要向func傳遞某種與您告訴編譯器func接受的類型不同的類型的東西。 您已聲明接受struct student的功能

void func(struct student devanshu);

但是函數調用傳遞了一個指向struct student的指針。

func(&devanshu);

函數調用是正確的,因為您希望函數可以訪問要傳遞的結構而不是副本。 因此,您需要更改功能以采用struct student *

其他錯誤是因為您沒有使用包含文件來存儲struct的定義。

創建一個名為“ student.h”(或其他名稱)的文件,並將結構的定義移入其中。 還有函數的聲明。

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

void func(struct student *);

並且放在兩個C文件的頂部

#include "student.h"

它告訴編譯器在編譯時將文件的內容復制到C文件中。 這意味着您有一個一致的定義,可以由需要它的所有文件共享。

好的,這將起作用:(下面的解釋)

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()上給您帶來問題。 更改為char。

這個

void func(struct student devanshu);

沒錯,但是您陷入了陷阱。 C語言中的結構始終按整個結構的值(副本)傳遞。 因此,如果您希望func()修改原始結構,則必須明確地告訴它:

void func(struct student *devanshu);

然后,在func中,您需要將訪問語法更改為使用->操作符代替'。

在兩個文件中都使用struct學生時,需要將struct的聲明移到頭文件中。 您可以(就像我在第一次編輯時所做的那樣)也重復聲明,因為我很懶,但是注釋100%是正確的:這是非常危險的做法,所以我更改了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM