2012-04-29 21 views
36

私は新しいCプログラマです。structを関数に渡す方法を知りたがっています。私はエラーが発生しているし、正しい構文を理解することができません。ここでのコードは....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: 
+1

ここで構造体を宣言していますか?あなたの実際の実装ファイルでは、 'struct student {/ * ... * /};' code?それは間違ったスコープにあるようです(あなたの 'main'関数で宣言されているか、' addStudent'を呼び出そうとしている関数のように)... –

+0

ええ、それは私の関数スコープです –

答えて

34

ライン機能の実装は次のようになります。

void addStudent(struct student person) { 

} 

personあなたは、関数の型として使用することはできません、種類が、可変ではありませんパラメータ。

また、プロトタイプが使用するように構造体addStudentのプロトタイプの前に構造体が定義されていることを確認してください。

+5

良いアイデアは、この問題を回避するには、typedefを使用してください。http://en.wikipedia.org/wiki/Struct_(C_programming_language) –

+0

@Binyamin sharet、まだ同じエラーが発生しています –

+0

@DanielDC - 編集を参照してください – MByD

3

あなたは人のタイプを指定する必要があります。

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

また、あなたは構造体、あなたがそれを使用するたびに入力することを避けるために、あなたの構造体をtypedefをすることができます

typedef struct student{ 
... 
} student_t; 

void addStudent(student_t person) { 
... 
} 
75

どのようにこれがあります参考として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; 
} 
+0

簡潔でかわいいです。 –

+0

絶対完璧です! – StrawHara

6

構造体を別の関数に渡すときは、通常Donnellが上記のようにして、代わりに参照渡しする方がよいでしょう。

非常に良い理由は、インスタンスを作成した関数に戻ったときに反映される変更を加えたい場合は、それが簡単になるということです。ここ

これを行う最も簡単な方法の例である: - student *sこの例で

#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構造体のインスタンスへのポインタです。main()では、student構造体のインスタンスを作成し、その参照を参照演算子(&)を使用してaddStudent()関数に渡します。

addStudent()関数では、矢印演算子(->)を使用してポインタを逆参照し、そのメンバーにアクセスすることができます(機能的には(*s).ageに相当)。

我々はmain()に戻ったときにポインタが私たちのメモリにstudent構造体のインスタンスが格納されている場所への参照を与えたので、我々はaddStudent()機能に加えた変更が反映されます。これはprintf()で示され、この例では「10」が出力されます。

参照を渡さなかった場合は、関数に渡した構造体のコピーを実際に使用しています。つまり、渡し方を実装していない限り、mainに戻るときに変更が反映されません新しいバージョンの構造体をmainまたはその行に沿って何かに戻します!

ポインタが最初に外れているように見えるかもしれませんが、いったん動作していることを頭に浮かべれば、とても便利な理由で第二の性質になります。

0

の代わりに:

void addStudent(person) 
{ 
    return; 
} 

この試してください:あなたはすでに「学生」と呼ばれる構造を宣言しているので、あなたは必ずのように関数の実装でそう指定する必要はありません

void addStudent(student person) 
{ 
    return; 
} 

を:

void addStudent(struct student person) 
{ 
    return; 
} 
+0

typedefなしで間違っています。 – Abdillah

関連する問題