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

  1. #1
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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.

  7. #7
    Candidat au Club
    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
    Points : 2
    Points
    2
    Par défaut
    ok je l'ai rajoutée et j'ai corrigé mon appel.
    Cependant pour les lignes en dessous (celles avec du scanf) j'ai également des warning : "format argument is not a pointer (arg2)"

    et je n'ai aucune idée d'où cela peut bien provenir, j'ai essayé de le corriger sans succès.
    Merci pour ton aide et la rapidité des tes réponses

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il manque des &.
    NOTE: fpurge() est aussi une fonction du forum. Quand c'est bien fait, elle est appelée par fclean().
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        fgets(ptrligne->ptrgare->nom, sizeof(ptrligne->ptrgare->nom), stdin);
        fclean(stdin, ptrligne->ptrgare->nom);
        printf("De quel cote se fait la descente ?\n0 pour le cote droit et 1 pour le cote gauche");
        scanf("%d", &ptrligne->ptrgare->porte);
        fpurge(stdin); 
        printf("Temps d'arret cette gare, compris entre 20s et 120s\n");
        scanf("%d", &ptrligne->ptrgare->arret);
        fpurge(stdin);
        printf("La gare est elle un terminus ?\n 1 si oui, 0 sinon");
        scanf("%d", &ptrligne->ptrgare->term);
        fpurge(stdin);
        return 0;
    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.

  9. #9
    Candidat au Club
    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
    Points : 2
    Points
    2
    Par défaut
    arf décidément je ne m'y ferai jamais à ce passage par adresse...
    bon la fonction est clean grâce à toi seulement j'ai un warning dans mon appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaisieGare(&ptrligne->ptrgare[i], ptrligne);
    il me dit : "passing arg 1 of 'SaisieGare' from incompatible pointer type"

    je complète avec la boucle et l'allocation dyn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    case 50: printf("Nombre de gare(s) :\n");
                    scanf("%d", &nb);
                    temp=ptrligne->nbgare;
                    ptrligne->ptrgare=(Gares*)malloc(sizeof(Gares)*(ptrligne->nbgare+nb));
                    for(i=temp; i<temp+nb; i++)
                    {
                        printf("Nom de la gare %d :\n", i+1);
                        SaisieGare(&ptrligne->ptrgare[i], ptrligne);

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est parce que tu as changé le prototype de SaisieGare(), il faut donc l'appeler différemment.
    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.

  11. #11
    Candidat au Club
    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
    Points : 2
    Points
    2
    Par défaut
    bon je pense avoir trouver, je te tien au courant si je rencontre encore des problèmes
    merci pour cette précieuse aide, elle m'a permis de mieux cerner le passage par @ aux fonctions
    bonne soirée

+ 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