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 :

probleme fonctions c++ -- passage de paramètres


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut probleme fonctions c++ -- passage de paramètres
    bonjour à tous ,
    voila donc mon pb:
    je travaille sur deux tableau de pointeur sur une structure ;voici le type (table) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct noeud
    {
     int num,poids;
     struct noeud *suiv;
    };
     
    typedef noeud *table;
     
    //déclaration du tableau : 
    table Pred[N];
    quand je modifie les deux tableaux dans le prog principale (main) ça marche impec, mais dés que je passe ces deux tableaux dans une fonction pour effectuer quelque opérations de modification , rien ne se passe,
    voici le prototype de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Predecesseur(table Succ[],table Pred[])

  2. #2
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Par défaut
    void Predecesseur(noeud* Succ[],noeud* Pred[])
    Et comme ca ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Il me semble que vous avez mal déclaré votre premier typedef.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct noeud
    {
        int num,poids;
        struct noeud *suiv;
    } noeud;
    (il manquait "noeud" avant le point virgule)

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Whyzix Voir le message
    Il me semble que vous avez mal déclaré votre premier typedef.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct noeud
    {
        int num,poids;
        struct noeud *suiv;
    } noeud;
    (il manquait "noeud" avant le point virgule)
    Tout ça c'est du C et pas du C++ !! Pas besoin de typedef lorsqu'on défini une structure et pas besoin de réutiliser struct !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct noeud
    {
     int num,poids;
     noeud *suiv;
    };
    Pour faire une liste en C++, il existe std::list :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct noeud
    {
    int num;
    int poids;
    };
    typedef std::list<noeud> table;
    Pour les tableaux, il existe std::vector (tableau dynamique), ou std::array.


    Pour ton passage par paramètre, montre nous la fonction.

  5. #5
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut la fonction ...
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    void Predecesseur(table Succ[],table Pred[])
    {
    	 for(l=1;l<=NbrNoeuds;l++)
          for(m=1;m<=NbrNoeuds;m++)
           {
            p=Succ[m]; trouve=false;
            while (p!=NULL && !trouve)
             {
              if (p->num==l) trouve=true ;
              if (!trouve) p=p->suiv;
             }
            if (trouve)
             {
              if (Pred[l]==NULL)
             {
              nouv=new noeud;
              nouv->num=m;
              nouv->poids=p->poids;
              nouv->suiv=NULL;
              Pred[l]=nouv;
             }
            else
             {
              h=Pred[l];
              while (h->suiv!=NULL) h=h->suiv;
              nouv=new noeud;
              nouv->num=m;
              nouv->poids=p->poids;
              nouv->suiv=NULL;
              h->suiv=nouv;
             }
           }
        }
    }
    ce n'est pas la première fois que j'utilise cette méthode, et elle a déjà marché sans pb, mais là,je ne trouve pas ou est l'erreur...

  6. #6
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Comment ça peut marcher alors que ni p, h et nouv ne sont déclarés !?

    Edit : Ni l, ni m, ni NbrNoeuds. Quel bazar, comment cette fonction peut-elle avoir la moindre chance de compiler ?

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Comment ça peut marcher alors que ni p, h et nouv ne sont déclarés !?

    Edit : Ni l, ni m, ni NbrNoeuds. Quel bazar, comment cette fonction peut-elle avoir la moindre chance de compiler ?
    Ca sent les variables globales !

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    C'est un exercice de cours? dans ce cas ça ressemble plus à du C qu'à du C++

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    Citation Envoyé par anissben Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            while (p!=NULL && !trouve)
             {
              if (p->num==l) trouve=true ;
              if (!trouve) p=p->suiv;
             }
            if (trouve)
             {
              ...
    bien compliqué tout ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            while (p!=NULL && p->num!=l)  p=p->suiv;
            if (p!=NULL)
             {
              ...

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    En plus les index de boucles commencent à 1 et vont jusqu'à NbrNoeuds inclus...

    Sérieusement, s'il ne s'agit pas d'un exercice de cours et s'il s'agit bien de C++, alors regarde std::list et std::vector.

    Enfin, si tu dis que ta fonction a marché, alors montre nous l'appel (les instructions avant et après et pourquoi ton résultat n'est pas bon).

  11. #11
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut tjr rien !!!!
    ce que je veux , c'est mettre cette partie dans une fonction car je vais l'utiliser plusieurs fois , quand elle est dans main , elle marche , les modification sont bien effectuées mais quand c'est la fonction qui est appelé elle ne marche pas..
    je ne sais pas si c'est un probleme de passage ou autre chose,
    je vais essayé de faire ça et je reviens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Predecesseur(table *Succ,table *Pred)

  12. #12
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut SA NE DONNE RIEN
    sa n'a rien donné d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Predecesseur(table *Succ,table *Pred);
    plz plz help , j'ai vraiment besoin que sa marche , et je ne peux avancer sans cette fct , merci...

  13. #13
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut nouvelle proposistion pour nouvelle demande d'aide
    >up!
    >up!
    >
    pour remettre les compteurs à zéro voici les déclarations, et ce qu'il s'en suit :
    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
     
    //les typedef : 
    typedef struct noeud
    {
     int num,poids;
     struct noeud *suiv;
    }noeud;
    typedef noeud *table;
     
    //déclaration des deux tableau : 
    std::vector <table> Succ(NbrNoeuds+1); 
    std::vector <table> Pred(NbrNoeuds+1); 
     
    //la fonction : 
    void Predecesseur(std::vecto<table> Succ,std::vector<table>& Pred);
    {
     // tjr la même chose à l'interieur ...
    }
     
    //l'appel de la fonction : 
    Predecesseur(Succ,Pred);
    la compilation se fait sans problèmes , mais tjr est-il, pas de changements ,la preuve en essayant d'afficher Pred :
    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
     
    //affichaqge des prédécesseurs :
       for (l=1;l<=NbrNoeuds;l++)
        {
         p=Pred[l];
         if (p!=NULL)
         {
          cout<<"predecesseur de "<<l<<" :->";
          while (p!=NULL)
          {
           cout<<"|"<<p->num<<"|"<<p->poids<<"|   ";
           p=p->suiv;
          }cout<<endl;
         }
        }
    il faut savoir biensur qu'en me passant de cette fonction et qu'en mettant exactement le contenue de la fonction dans main , cela marche, et la preuve est l'affichage correct du tableau Pred

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Fais un affichage à la fin de la fonction et non du main. Cela te permettra de voir si déjà tu ne t'es pas trompé dans l'écriture de la fonction.

  15. #15
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut bien bien !!
    j'ai fais comme tu m'a dis , l'affichage la la fin de la fonction ne donne rien ,
    certes , mais les instructions à l'intérieur de la fct sont les même que dans le main , c a d , en faisant un copier coller ,
    ce qu'il y a dans la fonction, c'est la même chose que dans le main ,
    mais je ne comprends pas prk sa n'affiche pas kan la partie de l'affichage est dans la fonction comme suit :
    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
     
    void Predecesseur(std::vecto<table> Succ,std::vector<table>& Pred)
    {
    	 for(l=1;l<=NbrNoeuds;l++)
          for(m=1;m<=NbrNoeuds;m++) 
           {
            p=Succ[m]; trouve=false;
            while (p!=NULL && !trouve)
             {
              if (p->num==l) trouve=true ;
              if (!trouve) p=p->suiv;
             }
            if (trouve)
             {
              if (Pred[l]==NULL)
             {cout<<"*";
              nouv=new noeud;
              nouv->num=m;
              nouv->poids=p->poids;
              nouv->suiv=NULL;
              Pred[l]=nouv;
             }
            else
             {
              h=Pred[l];
              while (h->suiv!=NULL) h=h->suiv;
              nouv=new noeud;
              nouv->num=m;
              nouv->poids=p->poids;
              nouv->suiv=NULL;
              h->suiv=nouv;
             }
           }
        }
    //affichaqge des prédécesseurs :
       for (l=1;l<=NbrNoeuds;l++)
        {
         p=Pred[l];
         if (p!=NULL)
         {
          cout<<"predecesseur de "<<l<<" :->";
          while (p!=NULL)
          {
           cout<<"|"<<p->num<<"|"<<p->poids<<"|   ";
           p=p->suiv;
          }cout<<endl;
         }
        }
     
    }
    alors , qu'est-ce que vous en pensez ,, ???

  16. #16
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Je pense :
    1. Que le code que tu présentes ne compile pas. Tu as un std::vecto, alors que c'est std::vector.
    2. Qu'il te manque aussi une référence :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      void Predecesseur(std::vector<table>& Succ,std::vector<table>& Pred)

  17. #17
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Par défaut !!
    ah dsl , ce n'était qu'une faute de frape ; mais il y a tjr rien , je suis à ce niveau :
    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
     
    // LES TYPES UTILISES :
     
    typedef struct noeud
     
    {
     
     int num,poids;
     
     noeud *suiv;
     
    };
     
     
     
    typedef noeud *table;
    //la fonction : 
    void Predecesseur(std::vector<table> Succ,std::vector<table>& Pred)
     
    {
     
      for(l=1;l<=NbrNoeuds;l++)
     
        for(m=1;m<=NbrNoeuds;m++)
     
        {
     
            p=Succ[m]; trouve=false;
     
            while (p!=NULL && !trouve)
     
             {
     
              if (p->num==l) trouve=true ;
     
              if (!trouve) p=p->suiv;
     
             }
     
            if (trouve)
     
             {
     
              if (Pred[l]==NULL)
     
             {
     
              nouv=new noeud;
     
              nouv->num=m;
     
              nouv->poids=p->poids;
     
              nouv->suiv=NULL;
     
              Pred[l]=nouv;
     
             }
     
            else
     
             {
     
              h=Pred[l];
     
              while (h->suiv!=NULL) h=h->suiv;
     
              nouv=new noeud;
     
              nouv->num=m;
     
              nouv->poids=p->poids;
     
              nouv->suiv=NULL;
     
              h->suiv=nouv;
     
             }
     
           }
     
        }
     
            //affichage des prédécesseur:
     
       for (l=1;l<=NbrNoeuds;l++)
     
        {
     
         p=Pred[l];
     
         if (p!=NULL)
     
         {
     
          cout<<"predecesseur de "<<l<<" :->";
     
          while (p!=NULL)
     
          {
     
           cout<<"|"<<p->num<<"|"<<p->poids<<"|   ";
     
           p=p->suiv;
     
          }cout<<endl;
     
         }
     
        }
     
     
     
    }
    je n'ai pas passé Succ avec le & car il ne doit pas changer , par contre , Pred doit impérativement changer, la fonction est faite pour lui , pour modifier le contenue, et donner la liste des prédécesseurs en partant de la liste des successeurs !

  18. #18
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Je quote mon collègue arzar :
    Citation Envoyé par Arzar Voir le message
    Comment ça peut marcher alors que ni p, h et nouv ne sont déclarés !?

    Edit : Ni l, ni m, ni NbrNoeuds. Quel bazar, comment cette fonction peut-elle avoir la moindre chance de compiler ?
    Pour faire court, on comprend rien.
    Donc ce qui serait bien, c'est que tu fournisses un ECM : Exemple Complet Minimal qui compile, et qui reproduise ton problème !

    Au final, tu gagneras du temps, et nous aussi !

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    Citation Envoyé par anissben Voir le message
    je n'ai pas passé Succ avec le & car il ne doit pas changer , par contre , Pred doit impérativement changer
    Met le quand même en référence mais constante :
    void Predecesseur(const std::vector<table>& Succ,std::vector<table>& Pred)

    sa évitera une recopie du vector Succ

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

Discussions similaires

  1. Appel d'une fonction et passage de paramètres
    Par rolandl dans le forum jQuery
    Réponses: 2
    Dernier message: 30/09/2012, 17h44
  2. Réponses: 0
    Dernier message: 04/07/2010, 00h52
  3. Fonction et passage de paramètres
    Par methodman225 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 25/06/2009, 13h29
  4. ActionScript : fonction et passages de paramètres
    Par gcvoiron dans le forum Flash
    Réponses: 6
    Dernier message: 12/06/2007, 13h52
  5. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15

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