2016-03-28 1 views
2

Je travaillais donc sur un projet avec des structures imbriquées et en passant des structures à des fonctions en tant qu'arguments.Structure passée à fonctionner comme paramètre mais ne fonctionnant pas correctement

Voici ma fonction principale:

#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; 
} 

Et voici les deux fonctions:

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); 
} 

Le problème est la fonction de la prise d'entrée et le stockage des données ne fonctionne pas. Chaque fois que le programme s'exécute, il prend une entrée, mais lors de l'impression, il donne une valeur de poubelle. Mais si je le lance sans fonctions (sous la fonction main()) cela fonctionne bien avec les mêmes codes. Je n'arrive pas à comprendre le problème dans le code, donc toute aide est appréciée.

Répondre

3

C utilise la valeur de passage pour le passage d'argument de fonction. Donc, quand vous appelez la fonction comme

take_input(a); 

une copie temporaire de a est passé à la fonction. Tout changement apporté au paramètre d'entrée à l'intérieur de la fonction appelée n'aura aucun effet sur le a présent dans l'appelant.

Vous devez transmettre l'adresse de la variable de structure et apporter des modifications à celle-ci dans la fonction appelée. Seulement alors, les modifications apportées seront reflété retour à l'argument réel passé à partir de la fonction de l'appelant.

+0

Le passage de grandes structures en valeur peut également être un sérieux problème de performance. – tofro