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 de passage par référence.


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Probleme de passage par référence.
    Bonjour a tous.

    J'ai un Td de progra sous le coude est je un peu de mal a m'en dépatouiller. Il me reste une derniere erreur lors de la compilation que je ne comprends vraiment pas. Si vous pouviez y jeter un oeil .

    Bref topo :
    On a un ensemble de particules, chacun d'entre-elle repérée par leur position OM(X, Y, Z), leur vitesse v(Vx, Vy, Vz), la force qu'elle subissent F(Fx, Fy, Fz) et leur masse m. Le systeme est donc mis dans un pointeur de Particule.
    Particule etant la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct Particule
    {
           double X;
           double Y;
           double Z;
           double Vx;
           double Vy;
           double Vz;
           double Fx;
           double Fy;
           double Fz;
           double m;
    };
    J'ai donc trois fichier dans mon projet : Fonctions.h - Fonction.cpp - Main.cpp
    Dans Fonction.cpp, je definie :
    -deux fonctions (Particule renvoieUneParticule() - Particule* saisieDistribution(int n) qui permettent de definir aléatoirement les informations sur la position, la vitesse et la masse de chaque particule de mon pointeur.
    -quatre fonctions pour calculer l'energie cinetique, potentielle, la distance entre deux particule etc...


    Reste 2 dernieres fonctions, et se sont elles qui me posent un probleme :
    -void calculeForces(int n, Particule *pts) : dans celle-ci on doit calculer la force subie par chaque particule et se sont donc les composantes F de la structure de chaque particule qui seront modifié => passage par reference du pointeur Particule *pts n'est-ce pas ?

    -void nouvelleDistribution(int n, Particule *pts) : "celle-ci doit modifier les coordonnées et les vitesses des particules. Pous cela :
    on appelle la fonction calculeForces
    ensuite, et pour chaque particule, on recalcule les coordonnées et les vitesses grace aux equa-diff :
    OM(t+dt)=OM(t)+v(t)*dt
    v(t+dt)=v(t)+(F/m)*dt avec dt=0.0001"

    Voici donc mes deux fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void calculeForces(int n, Particule*&pts)
    {
         for(int i=0; i<n; i++)
         {
                 for(int j=0&&j!=i; j<n; j++)
                 {
                         pts[i].Fx=(pts[i].X-pts[j].X)*((12.0/pow(distance2particules(pts[i], pts[j]),14))-(12.0/pow(distance2particules(pts[i],pts[j]),8)));
                         pts[i].Fy=(pts[i].X-pts[j].X)*((12.0/pow(distance2particules(pts[i], pts[j]),14))-(12.0/pow(distance2particules(pts[i],pts[j]),8)));
                         pts[i].Fz=(pts[i].X-pts[j].X)*((12.0/pow(distance2particules(pts[i], pts[j]),14))-(12.0/pow(distance2particules(pts[i],pts[j]),8)));
                 }
         }
    }
    Cette longue formule est en fait celle qui m'est donnée dans l'énoncé (et que je ne vais pas vous écrire ici ) permettant de calculer les composantes de la force F.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void nouvelleDistribution(int n, Particule*&pts)
    {
         calculeForces(n, pts);
         for(int i=0; i<n; i++)
         {
                 pts[i].X=pts[i].X+pts[i].Vx*0.0001;
                 pts[i].Y=pts[i].Y+pts[i].Vy*0.0001;
                 pts[i].Z=pts[i].Z+pts[i].Vz*0.0001;
                 pts[i].Vx=pts[i].Vx+(pts[i].Fx*0.0001)/pts[i].m;
                 pts[i].Vy=pts[i].Vy+(pts[i].Fy*0.0001)/pts[i].m;
                 pts[i].Vz=pts[i].Vz+(pts[i].Fz*0.0001)/pts[i].m;
         }
    }

    Et voici donc ce que j'obtient lors de la compilation :
    [Linker error] undefined reference to `nouvelleDistribution(int, Particule*)'
    ld returned 1 exit status
    C:\Clement\boulot\Cpp\TP6\Makefile.win [Build Error] [TP6A.exe] Error 1
    Je pense que le probleme viens du passage par reference que j'effectue deux fois de suite. Mais j'ai eu beau chercher pendant longtemps et je n'ai rien trouvé.



    Siouplé .
    Merci d'avance pour vos reponse.

  2. #2
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    Salut,

    Ils'agit d'une erreur de liens (Linker error). La référance en question n'est pas celle a proprement parlé de ta fonction, mais un probleme de visibilité lors des inclusions.
    all your base are belong to us.

  3. #3
    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
    Je dirais que la déclaration de la fonction est différente de sa définition.

    PS: Pourquoi passes-tu le pointeur par référence si tu ne le modifies pas ?
    De plus, n devrait être de type size_t plutôt que int.
    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.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Je modifie bien mon pointeur vu que je fais appelle a la fonction Force et que je change les valeurs des positions et des vitesses des particule de mon systeme dans le fonction nouvelleDistribution.
    Par contre Médinoc, en ce qui concerne le type de n je ne connais pas les size_t. On a toujours utiliser les int depuis 3mois de progra donc je pense pas qu'ils nous mettent ca .

    TheDrev : J'ai changé la place de l'inclusion de mon fichier Fonctions.h. Je l'ai passé avant le using namespace std; et apparament sa fonctionne. Juste une erreur dans mes fonctions pour les energies cinetiques etc... Et par contre si j'enleve le passage par reference de nouvelleDistribution ca marche plus. Comme quoi on en a bien besoin d'apres moi.


    Merci pour les réponses en tout cas .

  5. #5
    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
    Ta fonction calculForces() ne modifie aucun pointeur: elle ne modifie que les données pointées.
    Et nouvelleDistribution() ne modifie pas plus le pointeur.

    Le passage par référence est donc inutile, mais si tu le supprimes, fais gaffe à modifier à la fois la définition de la fonction et toutes ses déclarations séparées...
    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.

Discussions similaires

  1. Passage par référence
    Par e1lauren dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 01/09/2006, 12h59
  2. Passage par copie vs passage par référence
    Par bolhrak dans le forum C++
    Réponses: 11
    Dernier message: 20/08/2006, 23h37
  3. Réponses: 4
    Dernier message: 26/12/2005, 17h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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