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 :

fonction, structure


Sujet :

C

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut fonction, structure
    salut tout le monde
    s'il vous plait j'ai besoin d'aide a propos des fonction en c
    je voudrais faire entrer un tableaus structuré comme parametre dans la fonction mais ca ne marche pas voila la structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct geo 
    { char ville[15]; 
    char pays[15]; 
    char continent[15]; 
    long nhab; 
    }; 
    struct geo t[200] ;
    et la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void afficher_villes(geo t) 
    {int i; 
    for(i=0;i<nb_v;i++) 
    if((strcmp(t[i].pays,"maroc"))&& (t[i].nhab>100000)) 
    printf("- %s",t[i].ville); 
    }
    merci d'avance pour votre aide.
    k.cheker@hotmail.fr

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut et bienvenue sur les forums de developpez.com


    En fait, ce que tu as fait là, c'est de mettre une simple variable du type de ta structure en argument à la fonction mais pour un tableau, il faut que ton argument soit au moins un pointeur (plusieures pratique possible mais je préfère celle là) donc, voici ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher_villes(geo * t, size_t size)
    Je t'ai mis un second argument car les tableaux en C ne connaissent pas leur propre taille, il faut donc donner l'info à la fonction qui va traiter ton tableau !

    Ici je vois que tu utilises une variable qui n'est même pas déclarée dans ta fonction, je redoute l'utilisation d'une variable globale ... à surtout éviter ce genre de pratique !

    Donc pour finir, voici une implémentation possible pour ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void afficher_villes (geo * t, size_t size)
    {
       size_t i = 0;
     
       for (i = 0; i < size; i++)
       {
          if ((strcmp (t[i].pays, "maroc")) && (t[i].nhab >100000))
          {
             printf ("- %s", t[i].ville);
          }
       }
    }
    PS: pas testé !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    t[i]->pays plutot nan?

  4. #4
    Membre averti
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Citation Envoyé par Franck.H
    Salut et bienvenue sur les forums de developpez.com


    En fait, ce que tu as fait là, c'est de mettre une simple variable du type de ta structure en argument à la fonction mais pour un tableau, il faut que ton argument soit au moins un pointeur (plusieures pratique possible mais je préfère celle là) donc, voici ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher_villes(geo * t, size_t size)
    Je t'ai mis un second argument car les tableaux en C ne connaissent pas leur propre taille, il faut donc donner l'info à la fonction qui va traiter ton tableau !

    Ici je vois que tu utilises une variable qui n'est même pas déclarée dans ta fonction, je redoute l'utilisation d'une variable globale ... à surtout éviter ce genre de pratique !

    Donc pour finir, voici une implémentation possible pour ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void afficher_villes (geo * t, size_t size)
    {
       size_t i = 0;
     
       for (i = 0; i < size; i++)
       {
          if ((strcmp (t[i].pays, "maroc")) && (t[i].nhab >100000))
          {
             printf ("- %s", t[i].ville);
          }
       }
    }
    PS: pas testé !
    salut j'ai remplacer le tableau comme pointeur mais lors de la compilation
    une erreur <improper use of typedef 'geo'>
    merci co meme

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par lun4t1k
    t[i]->pays plutot nan?
    Nan ! L'argument est certes un pointeur mais ce qu'on utilise est un tableau avant tout, tu peux toujours essayer mais en réglant ton compilateur sur au moins les options:
    tu verras bien le message qu'il va te donner:
    /home/franhec/Documents/Programmation/CodesTests/ANSI/App/main.c:14: error: invalid type argument of ‘->’
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par k.cheker
    salut j'ai remplacer le tableau comme pointeur mais lors de la compilation
    une erreur <improper use of typedef 'geo'>
    merci co meme
    Ta structure, tu en as fait un typedef ou pas ?

    Si oui alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher_villes(geo * t, size_t size)
    Si non:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher_villes(struct geo * t, size_t size)
    Le mieux serait encore que tu montre le code complet de ton programme !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre averti
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Citation Envoyé par Franck.H
    Ta structure, tu en as fait un typedef ou pas ?

    Si oui alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher_villes(geo * t, size_t size)
    Si non:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher_villes(struct geo * t, size_t size)
    Le mieux serait encore que tu montre le code complet de ton programme !
    voila le code complet du programme
    mais quel est l'utilite de size_t car le tableau est deja remplie

    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
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<stdlib.h>
    struct geo
    {    char ville[15];
         char pays[15];
         char continent[15];
         long nhab;
    };
    struct geo t[200] ;
     
    int creer(int x);
    void afficher_villes(struct geo *t);
     
     
    int nb_v;
     
     
    void main()
    {
    printf("\n\nle nombre total des villes saisies est:   %d",creer(nb_v));
    printf("\n\nliste des villes de maroc ayant un nombtre d habitant >100000 :\n");
    afficher_villes(geo *t);
     
    getch();
    }
     
     
     
    int creer(int x)
    {  int test,i;
       test=1;
       i=x=0;
       while(test==1)
       {printf("\nsaisir la ville :  ");
       scanf("%s",t[i].ville);
       printf("\nsaisir le pays :  ");
       scanf("%s",t[i].pays);
       printf("\nsaisir le continent :  ");
       scanf("%s",t[i].continent);
       printf("\nsaisir le nombre d habitant :  ");
       scanf("%l",t[i].nhab);
       x++;
       printf("\npour saisir une autre ville tapez '1':\n");
       scanf("  %d",&test);
       i++;
       };
       return x;
    }
     
    void afficher_villes(struct geo *t)
    {int i;
      for(i=0;i<nb_v;i++)
        if((strcmp(t[i].pays,"maroc"))&& (t[i].nhab>100000))
        printf("- %s",t[i].ville);
    }
    k.cheker@hotmail.fr

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par k.cheker
    mais quel est l'utilite de size_t car le tableau est deja remplie
    le type size_t est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef unsigned long size_t;
    définit dans stddef.h et autres headers également. C'est un type utilisé surtout pour les données relatives à une taille comme les indices des tableaux, les tailles transmises pour les allocations dynamique, etc... Ce n'est pas obligatoire de l'utiliser mais je préfère, question d'habitude !


    Pour ton code je vais voir ca...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    1.-
    la fonction main retourne toujours un int donc ton main:
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main (int argc, char ** argv)
    ce dernier si tu travail avec les arguments en ligne de commande. Bien entendu, il ne faut pas oublier de mettre le fameux return à la fin du main soit:
    ou
    ce dernier si tu inclus: stdlib.h

    2.-
    Ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afficher_villes(geo *t);
    c'est faux, faut revoir ton C et le passage sur les fonctions ainsi que le passage de tableau (ou autre arguments) en paramètre d'une fonction, il faut faire comme ceci:
    3.-
    conoi.h -> pas portable
    getch -> pas portable

    Si tu veux attendre une saisie pour finir le programme, tu peux utiliser la fonction getchar en l'appelant tout simplement, sans même de variable:

    Voilà, je n'ai pas regardé tout ton code mais ceci devrait résoudre au moins ton problème (cas 2)
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Membre averti
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    je vais essayer ça et merci franck.h pour votre aide.

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par k.cheker
    je vais essayer ça et merci franck.h pour votre aide.
    Pas de problème, reviens en cas de soucis
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    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
    je rajouterais juste mets plus de 15 caractères pour ville, pays, et continent....

    En France, on peut par exemple citer "La Garenne Colombes", "Villeneuve-Les-Avignon", sans parler de "Chamonix-Mont Blanc" .. Et je suis certain qu'au Maroc, tu en as aussi.

    En ce qui concerne les pays, "Grand Duché de Luxembourg", "Principauté d'Andorre", "République Populaire de Chine", etc..

    En ce qui concerne les continents, tout dépend si on considère un continent "Amérique", ou "Amérique du Nord" et "Amérique du Sud" ..

  13. #13
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut

    Et concernant le problème du passage de parametre:

    En C, le fait de définir une structure ne déclare pas un type du nom de cette structure (contrairement au C++, par exemple)

    Tu as donc deux solutions:
    • Soit, chaque fois que tu veux passer la structure (ou un pointeur sur la structure), tu précise le mot cle struct
    • Soit, tu précises que la structure doit etre considérée comme un type (avec typedef)

    quelque exemples valides
    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
     
    struct mastruct
    {
        char nom[20];
        int age;
    };
    /* seules possiblités pour passer en argument
       (le type de retour peut varier;)) et je ne présente que les prototypes
       des fonctions ;)*/
    void mafonct1(struct mastruct argument);
    /* OU---OU---OU */
    void mafonct2(struc mastruct* argument);
    struct structype
    {
        char nom[20];
        int age;
    };
    typedef struct montype;
    /* montype est connu comme étant... un type... on peut donc travailler
       aussi bien avec la structure structype qu'avec le type montype */
    void fonctstruct1(struct structype argument);
    void fonctstruct2(struct structype* argument);
    void foncttype1(montype argument);
    void foncttype2(montype* argument);
    /* une variante que j'apprécie pour la déclaration de la structure et du type
    utilisable exactement comme le deuxième cas proposé... avec l'avantage
    de faciliter la création de structures dynamiques (liste, file, arbres...)*/
    typedef struct structure /*on définit la structure */
    {
        char nom[20];
        int age;
        /* pour créer une liste */
        struct structure *suivant;
    }type2/*on définit le type */;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Création de fonction - Structure d'une trame - vb 2008
    Par hunteshiva dans le forum VB.NET
    Réponses: 7
    Dernier message: 13/04/2010, 14h28
  2. désallocation mémoire - fonction - structure - tableau dynamique
    Par Flaherty Mc Coillean dans le forum Débuter
    Réponses: 2
    Dernier message: 25/11/2009, 17h42
  3. paramètres fonction structures pointeurs
    Par tom31 dans le forum Débuter
    Réponses: 2
    Dernier message: 12/01/2008, 18h22
  4. fonction structure c
    Par k.cheker dans le forum C
    Réponses: 46
    Dernier message: 10/04/2007, 23h16
  5. Fonction, structure, pointeurs et scanf
    Par exhortae dans le forum C
    Réponses: 13
    Dernier message: 27/02/2007, 17h31

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