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 de pointeur dans une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut passage de pointeur dans une fonction
    bonjour à tous !
    alors avant de poster j'ai fais une petite recherche sur le forum mais je crois que le mal de crâne me guette alors pardonnez moi si ma question a déjà été posé.

    voilà mon problème : j'appelle la fonction suivante "SaisieGare()" (i est un compteur dans une boucle for, et les ptr... sont des pointeurs de structures)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaisieGare(ptrligne->ptrgare[i], ptrligne);
    RQ : j'ai une erreur "invalid type of argument 1"

    et je n'arrive pas à déclarer la fonction comme il se doit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SaisieGare(....????)
    {
    ...
    }
    un petit coup de main serai la bienvenu.
    merci et bon aprem

    edit : je vais détailler un peu quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct gares
    {
        char nom[41];
        int arret, position, porte, term;
    }Gares;
     
    typedef struct ligne
    {
        int nbgare, nbcanton, nbtrain, nbmission;
        Canton* ptrcanton;
        Train *ptrtrain;
        Gares* ptrgare;
        Mission *ptrmission;
    }Ligne;
    et donc ce que je voudrais faire c'est pouvoir remplir la gare i en donnant son nom etc...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il y a un problème avec le premier paramètre, il passe la structure Gare par valeur. Je conseille plutôt ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SaisieGare(&ptrligne->ptrgare[i], ptrligne);
    
    //Ou bien ceci:
    
    SaisieGare(ptrligne->ptrgare + i, ptrligne);
    Avec un tel appel, le prototype de la fonction appelée devient:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void SaisieGare(Gares *ptrgare, Line *ptrligne)
    {
     ...
    }
    PS: Pourquoi avoir mis un 's' à Gares ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    merci de ton support, effectivement cela résout pas mal de problèmes !!^^
    pour le s va savoir... faudrait demander à mon collègue qui s'est occupé des structures (je me suis demandé aussi quand je l'ai vu mais bon...)

    et donc avec ce code si j'ai bien compris, j'accède à l'élément i du tableau de structures d'éléments de type "Gares" pointé par ptrgare ????

    et si maintenant je veux utiliser ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaisieGare(Gares *ptrgare, Line *ptrligne)
    pour mettre un nom dans le champ "nomgare" comment je dois procédé ?? avec un getchar ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Eh bien, sachant qu'il s'agit d'un buffer de taille fixe, je propose un coup de fgets(), plus un fclean() juste après (cherche la fonction fclean() sur le forum).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Par défaut
    alors voilà ce que ça me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int SaisieGare(Gares* ptrgare[], Ligne* ptrligne)
    {
        fgets(ptrligne->ptrgare->nom[41], sizeof(ptrligne->ptrgare->nom[41]), stdin);
        printf("De quel cote se fait la descente ?\n0 pour le cote droit et 1 pour le cote gauche");
        scanf("%d", ptrligne->ptrgare->porte);
        printf("Temps d'arret cette gare, compris entre 20s et 120s\n");
        scnaf("%d", ptrligne->ptrgare->arret);
        printf("La gare est elle un terminus ?\n 1 si oui, 0 sinon");
        scnaf("%d", ptrligne->ptrgare->term);
        return 0;
    }
    pour le fclean() j'en ai vraiment besoin ? tout ce que je fais dans cette fonction c'est donner le nom à une gare et lui attribuer les autres champs. d'après ce que j'ai compris ça permet de se débarrasser du '\n' mais pour ma part je navigue dans plusieurs fonctions et j'ai des system("CLS") à chaque fois alors les retours chariot ne me gênent pas plus que ça... après j'ai peut être pas tout compris;..

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça débarrasse du \n et de l'excédent si on a tapé plus que 40 caractères.
    Sur ce forum, c'est obligatoire après chaque saisie.

    Aussi, tu n'appelle pas correctement fgets:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
     fgets(ptrligne->ptrgare->nom, sizeof(ptrligne->ptrgare->nom), stdin);
    Un compilateur bien réglé t'aurait mis un avertissement sur cette ligne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/01/2010, 14h01
  2. Réponses: 6
    Dernier message: 31/05/2008, 15h45
  3. Réponses: 6
    Dernier message: 24/12/2004, 16h46
  4. [langage] Passage de paramètres dans une fonction
    Par And_the_problem_is dans le forum Langage
    Réponses: 11
    Dernier message: 28/06/2004, 08h20
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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