2016-03-28 10 views
2

したがって、構造体をネストして構造体を引数として関数に渡していました。ここで構造体がパラメータとして機能するために渡されましたが、正しく機能しません。

は私の主な機能です:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct date { 
    int dd; 
    int mm; 
    int yy; 
}; 

struct employee { 
    char fn[50]; 
    char ln[50]; 
    struct date dob; 
    struct date sd; 
    int salary; 
}; 

void take_input(struct employee e); 
void give_output(struct employee e); 

int main(void) 
{ 
    struct employee a; struct employee b; struct employee c; struct employee d; struct employee f; 

    take_input(a); 
    take_input(b); 
    take_input(c); 
    take_input(d); 
    take_input(f); 

    give_output(a); 
    give_output(b); 
    give_output(c); 
    give_output(d); 
    give_output(f); 

    return 0; 
} 

そして、ここでは2つの機能は以下のとおりです。

void take_input(struct employee e) 
{ 
    printf("\nFirst name: "); 
    gets(e.fn); 
    printf("\nLast name: "); 
    gets(e.ln); 
    printf("\nDate of Birth: "); 
    scanf("%d %d %d", &e.dob.dd, &e.dob.mm, &e.dob.yy); 
    printf("\nDate of Joining: "); 
    scanf("%d %d %d", &e.sd.dd, &e.sd.mm, &e.sd.yy); 
    printf("\nSalary: "); 
    scanf("%d", &e.salary); 
} 

void give_output(struct employee e) 
{ 
    printf("%s", e.fn); 
    printf(" %s", e.ln); 
    printf("\nDate of Birth: %d/%d/%d", e.dob.dd, e.dob.mm, e.dob.yy); 
    printf("\nStarting Date: %d/%d/%d", e.sd.dd, e.sd.mm, e.sd.yy); 
    printf("\nSalary: $%d\n", e.salary); 
} 

問題は、入力を服用して動作していないデータを格納するための機能です。プログラムが実行されるたびに入力が行われますが、印刷中はいくらかのガベージ値が与えられます。しかし、(main()関数の下で)関数なしで実行すると、同じコードで正常に動作します。私はコード内の問題を把握することができないので、どんな助けにも感謝します。

答えて

3

Cは、引数の引き渡しに値渡しを使用します。あなたは

take_input(a); 

のような関数を呼び出すときに、aの一時的なコピーが関数に渡されます。呼び出された関数内の入力パラメータに加えた変更は、呼び出し元にある実際のaには何の影響も与えません。

構造変数のアドレスを渡して、呼び出された関数内のアドレスに変更する必要があります。そのときだけ、が呼び出し元関数から渡された実際の引数にを反映して反映されます。

+0

大きな構造体を値で渡すことは、重大なパフォーマンスヒットになることもあります。 – tofro

関連する問題