{C++} Tableau de structure

{C++} Tableau de structure - C++ - Programmation

Marsh Posté le 11-11-2009 à 22:33:25    

Bonjour, je débute en C++ et je cherche à faire un tableau de structure
je procède ainsi :  
[url]corps * tableau_de_corp =new corps[N];[/url]
 
Avec corps étant composé de structures Coordonnées(x,y) definissant l'acceleration, la vitesse et la position d'un point.
 
 

Code :
  1. #include <iostream>
  2. #include <cmath>
  3. #define G 6.67e-11
  4. #define N 2
  5. using namespace std;
  6. struct Coordonnees
  7. {
  8. float x;
  9. float y;
  10. };
  11. struct corps {
  12. float masse;
  13. Coordonnees position;
  14. Coordonnees vitesse;
  15. Coordonnees acceleration;
  16. };
  17. void calcul_acceleration(corps * tableau_de_corps =new corps[2])
  18. {
  19.     Coordonnees * tableau_de_acc=new Coordonnees[N];
  20.     for(int i=0; i<(N-1); i++)
  21.     {
  22.     tableau_de_acc[i].x=(tableau_de_corps[i+1].masse)*( (tableau_de_corps[i+1].(position)).x  - (tableau_de_corps[i].(position)).x )/abs(pow(norme(tableau_de_corps[i].(position).x-tableau_de_corps[i+1].(position).x, 3));
  23.     tableau_de_acc[i].y=(tableau_de_corps[i+1].masse)*( (tableau_de_corps[i+1].(position)).y -  (tableau_de_corps[i].(position)).y )/abs(pow(norme(tableau_de_corps[i].(position).y-tableau_de_corps[i+1].(position).y, 3));
  24.     cout <<tableau_de_acc[i]<<endl;
  25.     }
  26.     tableau_de_acc[i].y*=G
  27.     tableau_de_acc[i].x*=G
  28. }
  29. float norme(Coordonnes vecteur)
  30. {
  31. float n=sqrt(pow(vecteur.x, 2)+pow(vecteur.y, 2));
  32. return n;
  33. }
  34. int main()
  35. {
  36.     corps * tableau_de_corps =new corps[N]; // creation des n corps
  37. calcul_acceleration(tableau_de_corps[]);
  38. return 0;
  39. }


 
Mon probleme se situe dans le void calcul_acceleration. Si par exemple dans la premiere case ou il y a un corps, je veux modifier l'une des coordonnées de l'acceleration, dois-je écrire :
 

Code :
  1. (tableau_de_corps[i+1].(position)).x


 
ou
 

Code :
  1. (tableau_de_corps[i+1]->(position)).x


 
ou bien autre chose ?  
 
Merci d'avance
Samuel.

Reply

Marsh Posté le 11-11-2009 à 22:33:25   

Reply

Marsh Posté le 12-11-2009 à 06:59:28    

utilise std::vector

Reply

Marsh Posté le 12-11-2009 à 10:55:19    

Qu'est ce que c'est ? je ne connais pas cette commande.
Merci.

Reply

Marsh Posté le 12-11-2009 à 11:45:12    

J'ai lu un cours sur std:vector. Ainsi, j'ai changer mes anciens tableau en vector. Cela dit, j'ai toujours le probleme avec la syntaxe de :
 
(tableau_de_corps[i+1].(position)).x
 
Merci.

Reply

Marsh Posté le 12-11-2009 à 12:57:07    

eneleve tes parentheses elles ne servent à rien

Reply

Marsh Posté le 12-11-2009 à 13:53:10    

D'accord très bien !
tout fonctionne pratiquement, je n'ai plus d'erreur au niveau des formules, par contre un truc bloque dans le main() :

 
Code :
  1. #include <vector>
  2. #include <iostream>
  3. #include <cmath>
  4. #define G 6.67e-11
  5. #define N 2
  6. using namespace std;
  7. struct Coordonnees
  8. {
  9. float x;
  10. float y;
  11. };
  12. struct corps {
  13. float masse;
  14. Coordonnees position;
  15. Coordonnees vitesse;
  16. Coordonnees acceleration;
  17. };
  18. Coordonnees operator-( Coordonnees a, Coordonnees b)
  19. {
  20. Coordonnees res;
  21. res.x=a.x-b.x;
  22. res.y=a.y-b.y;
  23. return res;
  24. }
  25. float norme(Coordonnees vecteur)
  26. {
  27. float n=sqrt(pow(vecteur.x, 2)+pow(vecteur.y, 2));
  28. return n;
  29. }
  30. void calcul_acceleraton(vector<corps> tableau_de_corps)
  31. {
  32.     Coordonnees * tableau_de_acc=new Coordonnees[N];
  33. int i=0;
  34.     for(i; i<(N-1); i++)
  35.     {
  36.  tableau_de_acc[i].x=(tableau_de_corps[i+1].masse)*( tableau_de_corps[i+1].position.x );
  37.  tableau_de_acc[i].x=(tableau_de_corps[i+1].masse)*( tableau_de_corps[i+1].position.x  - tableau_de_corps[i].position.x )/abs(pow(norme(tableau_de_corps[i].position-tableau_de_corps[i+1].position), 3));
  38.  tableau_de_acc[i].y=(tableau_de_corps[i+1].masse)*( tableau_de_corps[i+1].position.y  - tableau_de_corps[i].position.y )/abs(pow(norme(tableau_de_corps[i].position-tableau_de_corps[i+1].position), 3));  
  39.  cout <<tableau_de_acc[i].x<<endl;
  40.                                                                     
  41. }
  42. tableau_de_acc[i].y*=G;
  43. tableau_de_acc[i].x*=G;
  44. }
  45.                                                                   
  46.                                                                     
  47. int main()
  48.  {
  49.   vector<corps*> liste_corps;  // creation des n corps
  50.   calcul_acceleraton(vector liste_corps);   Missing template arguments before 'liste_corps'
  51.   return 0;
  52.  }
 

  Missing template arguments before 'liste_corps' sur la ligne appellant la fonction calcul_acceleration
Voila, merci beaucoup, je pense ( et j'espere )  que ca sera la dernière question ;).
Samuel.

 


PS : j'ai encore un second soucis, j'ai en effet essayé de faire

Code :
  1. liste_corps[1].position.x=1;


il me met l'erreur suivante :

Code :
  1. error: request for member 'position' in 'liste_corps. std::vector<_Tp, _Alloc>::operator[] [with _Tp = corps*, _Alloc = std::allocator<corps*>](1ul)', which is of non-class type 'corps*'
 



Message édité par berserendo le 12-11-2009 à 14:21:36
Reply

Marsh Posté le 12-11-2009 à 17:28:55    

ton vecteur est un vecteur de Corps*, donc tu doit faire :

 

liste_corps[1]->position.x=1;

 

et t'as pas besoin de vector ligne 59:

 

calcul_acceleraton(liste_corps);  

 

Et apres pourquoi tu passes ujn vector<corps*> à une fonction qui attend un vector<corps> ?
Accessoirement ca manque de const et de references


Message édité par Joel F le 12-11-2009 à 17:30:07
Reply

Marsh Posté le 13-11-2009 à 00:30:00    

D'accord.C'est ce que j'ai fait.  
A présent, ca compile mais j'ai une erreur dans le terminale :
 
voici le code :

Code :
  1. #include <vector>
  2. #include <iostream>
  3. #include <cmath>
  4. #define G 6.67e-11
  5. #define N 2
  6. using namespace std;
  7. struct Coordonnees
  8. {
  9. float x;
  10. float y;
  11. };
  12. struct corps {
  13. float masse;
  14. Coordonnees position;
  15. Coordonnees vitesse;
  16. Coordonnees acceleration;
  17. };
  18. Coordonnees operator-( Coordonnees a, Coordonnees b)
  19. {
  20. Coordonnees res;
  21. res.x=a.x-b.x;
  22. res.y=a.y-b.y;
  23. return res;
  24. }
  25. float norme(Coordonnees vecteur)
  26. {
  27. float n=sqrt(pow(vecteur.x, 2)+pow(vecteur.y, 2));
  28. return n;
  29. }
  30. void calcul_acceleraton(vector<corps*> tableau_de_corps ) // calcul des accelerations de tout les corps a n'importe quel instant.
  31. {
  32.     Coordonnees * tableau_de_acc=new Coordonnees[N];
  33. for(int k=1; k<N; k++)
  34. {
  35.  for(int i=1; i<(N-1)&&i!=k; i++)
  36.  {
  37.   tableau_de_acc[k].x+=(tableau_de_corps[i+1]->masse)*( tableau_de_corps[i+1]->position.x  - tableau_de_corps[i]->position.x )/abs(pow(norme(tableau_de_corps[i]->position-tableau_de_corps[i+1]->position), 3));
  38.   // tableau_de_acc[k].y+=(tableau_de_corps[i+1].masse)*( tableau_de_corps[i+1].position.y  - tableau_de_corps[i].position.y )/abs(pow(norme(tableau_de_corps[i].position-tableau_de_corps[i+1].position), 3));    
  39.   cout <<tableau_de_acc[k].x<<endl;
  40.                                                                     
  41.  }
  42.  tableau_de_acc[k].y*=G;
  43.  tableau_de_acc[k].x*=G;
  44. }
  45. }
  46.                                                                     
  47. int main()
  48.  {
  49.   vector<corps*> liste_corps(N);// corps * tableau_de_corps =new corps[N]; // creation des n corps  
  50.   liste_corps[1]->masse=50;
  51.   liste_corps[2]->masse=50;
  52.   liste_corps[1]->position.x=0;
  53.   liste_corps[1]->position.y=1;
  54.   liste_corps[2]->position.x=1;
  55.   liste_corps[2]->position.y=0;
  56.   liste_corps[2]->vitesse.y=1;
  57.   liste_corps[2]->vitesse.x=1;
  58.   liste_corps[1]->vitesse.y=1;
  59.   liste_corps[1]->vitesse.x=1;
  60.   liste_corps[2]->acceleration.y=1;
  61.   liste_corps[2]->acceleration.x=1;
  62.   liste_corps[1]->acceleration.y=1;
  63.   liste_corps[1]->acceleration.x=1;
  64.   calcul_acceleraton(liste_corps);
  65.   return 0;
  66.  }


 
 
Voici l'erreur byzzare ...  

Code :
  1. "Running…
  2. *meca(1422) malloc: *** error for object 0x2608a54: incorrect checksum for freed object - object was probably modified after being freed.*
  3. **** set a breakpoint in malloc_error_break to debug*
  4. Program received signal:  “EXC_BAD_ACCESS”.
  5. sharedlibrary apply-load-rules all
  6. *(gdb) "*


le debuggeur se manifeste quand je fais liste_corps[1]->masse=50; dès le début quoi...
 
J'espere que le problème est resolu, lol...
en tout cas merci vraiment beaucoup pour ton aide, c'est tres gentil de ta part ! :)

Reply

Marsh Posté le 13-11-2009 à 06:54:41    

oui. JE repete:
tu fais un vector<corps*> donc tu creer un tableau de POINTEUR mais rien ne les initialise. Tu a besin d'un vector<corps> (et a ce moment, remets .position).
 
Lis la doc de vector, tu as manquer des trucs

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed