IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Passage d'une structure en fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 78
    Par défaut Passage d'une structure en fonction
    Bonjour, je voudrais passer une structure dans une fonction.
    Voici mon code :
    L'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("Veuillez entrer une fonction\n");
                             scanf("%s",&fonction);
                             nombre=nbabsents(&fonction,&nombre_employes,&*personne);
    Le paramètres "personne" est une variable de type structure.

    Voici la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int nbabsents(fonction,nombre_employes, personne)
    {
        int resultat,i;
        i=0;
        resultat=0;
        while(i<=nombre_employes)
        {
          if((personne[i].fonction==fonction)&&(personne[i].present==0))
          {
            resultat=resultat+1;
          }
          i=i+1;
        }
        return(resultat);
    }
    L'erreur ce situe sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((personne[i].fonction==fonction)&&(personne[i].present==0))
    Le compilateur me dit : "subscripted value is neither array nor pointer".

    Merci de bien vouloir m'aider

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Le compilateur doit dire aussi d'autres choses, non? Parce que comme définition de fonction,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nbabsents(fonction,nombre_employes, personne) {...}
    , c'est louche. Ce n'est même pas du style K&R1 car les paramètres ne sont pas tous des entiers.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 78
    Par défaut
    Je ne comprend pas ce que vous voulez dire.
    J'ai essayé de renseigner les types des variables passés en paramètres.
    Ce qui donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nbabsents(char fonction, int nombre_employes, Employes personne)
    Sachant que "Employes" est une structure de données et "personne" la variable de type "Employes".

    De plus, je n'ai pas déclaré de prototype de cette fonction dans mon programme principal.

    As-tu une idée?

  4. #4
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Si fonction est de type char, alors le code suivant va poser problème:
    Sachant qu'une chaîne contient au moins '\0' à la fin, ça ne laisse plus beaucoup de place aux autres caractères.

  5. #5
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Ensuite, votre appel à nbabsents() ne correspond pas du tout à la définition; par exemple, le second paramètre doit être un entier mais vous passez une adresse!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 78
    Par défaut
    Comme il est difficile de comprendre avec ses bouts de code,
    je vous copie la totalité du code.
    Peut-etre comprendrais-je mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    #include <stdio.h>
    #include <stdlib.h> // bibliotèque pour traiter les fichiers
    #include <conio.h>
    /*FILE* fopen(const char* nomdufichier, const char* modeOuverture); 
    int fclose(FILE* pointeurSurFichier);
    char* fgets(char* chaine, int nombreDeCaracteresALire, FILE* pointeurSurFichier);*/
    int max=0;
    typedef struct  // Déclaration de la structure
    {
        char nom[25]; // Nom
        char prenom[25]; //Prenom
        char fonction[70]; //fonction
        int anciennete; //ancienneté
        char tel[10]; //telephone
        int present; //prend la valeur 1 si employé présent sinon prend la veleur 0 
    } Employes;
     
    /*void afficheEmployes(Employes *personne) // Fonction qui affiche les valeurs de x et y
    {
        printf("Le nom est : %s\n", personne[1].nom);
        printf("Le prenom est : %s\n",personne[1].prenom);
        getch();
    }*/ 
     
    int main(void)
    { 
        int choix, nomnbre, present,c,anciennete,rep, nombre_employes,nombre;
        char nom[25], prenom[25], fonction[70], tel[10];
        Employes personne[50];
        FILE* fichier = NULL; 
        fichier = fopen("employes1.txt","r+");
        if (fichier != NULL)
        {
            //Remplissage du fichier
            printf("Voulez vous creer le fichier? 1:oui 2:non\n");
            scanf("%d",&rep);              
            while(rep==1)
            {
                         printf("\n");
                         printf("Nom\n");
                         scanf("%s",&nom);
                         fprintf(fichier,"%s\t",nom);
                         printf("\n");
     
                         printf("\n");
                         printf("Prenom\n");  
                         scanf("%s",&prenom);
                         fprintf(fichier,"%s\t",prenom);
                         printf("\n");
     
                         printf("\n");
                         printf("Fonction\n"); 
                         scanf("%s",&fonction);
                         fprintf(fichier,"%s\t",fonction);
                         printf("\n");
     
                         printf("\n");
                         printf("Ancinnete\n"); 
                         scanf("%d",&anciennete);
                         fprintf(fichier,"%d\t",anciennete);
                         printf("\n");
     
                         printf("\n");
                         printf("Telephone\n");  
                         scanf("%s",&tel);
                         fprintf(fichier,"%s\t",tel);
                         printf("\n");
     
                         printf("\n");
                         printf("Present 1:oui 0:non\n");     
                         scanf("%d",&present);
                         fprintf(fichier,"%d\n",present);
                         printf("\n");
                         printf("Autre employe? 1:oui 0:non\n");
                         scanf("%d",&rep);
            } 
                nombre_employes=0;
                while(!feof(fichier))
                {
                   fscanf(fichier,"%s %s %s %d %s %d",&personne[nombre_employes].nom,&personne[nombre_employes].prenom,&personne[nombre_employes].fonction,&personne[nombre_employes].anciennete,&personne[nombre_employes].tel,&personne[nombre_employes].present);
                   nombre_employes=nombre_employes+1;
                }
     
            //On peut lire et écrire dans le fichier
            printf("===Bienvenue dans la gestion de la liste du personnel, voici les actions disponibles===\n\n");
            printf("0 - Voir le nombre de personnes qui ont la meme fonction\n");
            printf("1 - Nom des personnes ayant le numero de poste renseigne\n");
            printf("2 - Nombre de personnes ayant l'anciennete la plus elevee\n");
            printf("3 - Identite de la personne presente ayant la fonction renseignee\n");
            printf("4 - Numero de poste d'une personne selon son nom et son prenom\n");
            printf("5 - Gerer la liste des employes\n");
            printf("Faites votre choix\n");
            scanf("%d",&choix);
            switch(choix)
            {
     
                    case 0 : 
                             printf("Veuillez entrer une fonction\n");
                             scanf("%s",&fonction);
                             nombre=nbabsents(&fonction,&nombre_employes,&*personne);
                             printf("Il y a %d personnes qui ont la fonction %s\n",nombre,fonction);
                             break;
     
                    /*case 1 :
                             printf("Veuillez entrer un numero de poste\n");
                             scanf("%d",&tel);
                             listeposte(tel,&*personne);
                             break;
                             
                    case 2 : 
                             retraite(&*personne);         
                             break;
                             
                    case 3 :
                             printf("Veuillez entrer une fonction\n");
                             scanf("%s",&fonction);
                             identfonct(&fonction,&*personne);
                             break;
                             
                    case 4 : 
                             printf("Veuillez entrer un nom\n");
                             scanf("%s",&nom);
                             printf("Veuillez entrer un prenom\n");
                             scanf("%s",&prenom);
                             posteN(nom,prenom,&*personne);
                             break;
                             
                    case 5 :
                            ("===Ajout de nouveaux membres ou consultation de la liste du personnel===\n");
                            printf("1 - Inscrire de nouveaux employes\n");
                            printf("2 - Afficher le personnel de l'entreprise\n");
                            printf("Faites votre choix\n");
            }*/      
     
            }              
     
     
            /*fscanf(fichier,"%s %s %s %s",&personne[0].nom,&personne[0].prenom,&personne[1].nom,&personne[1].prenom);
            //printf("%s %s",personne[1].nom,personne[1].prenom);*/
            fclose(fichier);
            //afficheEmployes(&*personne); // Appel de la fonction    
            }  
        else
        {
            // On affiche un message d'erreur si on veut
            printf("Impossible d'ouvrir le fichier employes1.txt");
        }
        getch();
        return 0;
    }
     
    int nbabsents(char fonction, int nombre_employes, Employes personne)
    {
        int resultat,i;
        i=0;
        resultat=0;
        while(i<=nombre_employes)
        {
          if((personne[i].fonction==fonction)&&(personne[i].present==0))
          {
            resultat=resultat+1;
          }
          i=i+1;
        }
        return(resultat);
    }
    Merci encore

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Déjà corrige toutes les lectures de chaines :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
                         printf("Nom\n");
                         scanf("%s",&nom);
                         fprintf(fichier,"%s\t",nom);
                         printf("\n");
     
                         printf("\n");
                         printf("Prenom\n");  
                         scanf("%s",&prenom);
                         fprintf(fichier,"%s\t",prenom);
                         printf("\n");
     
                         printf("\n");
                         printf("Fonction\n"); 
                         scanf("%s",&fonction);
                         fprintf(fichier,"%s\t",fonction);
                         printf("\n");
    ....                     
                         printf("\n");
                         printf("Telephone\n");  
                         scanf("%s",&tel);
                         fprintf(fichier,"%s\t",tel);
                         printf("\n");
    Une chaîne est un tableau de char, dont le nom correspond à l'adresse du premier élement....

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                         printf("Telephone\n");  
                         scanf("%s",tel);
    De plus, scanf n'a pas de limite par défaut, sauf le \n, donc dans ton cas il faudrait soit faire une saisie propre (voir les mutiples posts sur ce sujet), soit mettre la bonne longueur dans le format.

    Ensuite, une comparaison de chaîne s'effectue avec strcmp et non pas ==.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          if((personne[i].fonction==fonction)&&(personne[i].present==0))
    est faux et effectue la comparaison de la VALEUR des pointeurs....

    Corrige ça, et on verra après...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage d'une structure en argument de fonction
    Par DDaviDD dans le forum Débuter
    Réponses: 2
    Dernier message: 19/05/2014, 07h26
  2. Passage d'une structure en paramètre
    Par NeraOne dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/05/2007, 18h16
  3. Passage d'une structure dans une fonction
    Par god_enel dans le forum C
    Réponses: 7
    Dernier message: 01/02/2007, 15h33
  4. Passage d'une structure dans une fonction
    Par god_enel dans le forum C
    Réponses: 8
    Dernier message: 22/01/2007, 15h35
  5. [MFC] Passage d'une structure dans une method
    Par KPitN dans le forum MFC
    Réponses: 5
    Dernier message: 18/06/2004, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo