débordement de la mémoire

débordement de la mémoire - C++ - Programmation

Marsh Posté le 18-07-2005 à 14:24:28    

:jap: Hi,
je ne sais plus pourquoi le programme ci contre ne marche plus pour dim trés grande 60 par exemple

Code :
  1. #include<iostream>
  2. using namespace std;
  3. void main(int argc, char* argv[])
  4. { int dim=60;
  5.    float xmi=3.4,xma=115.6,ymi=3.4,yma=115.6;
  6.    srand( (unsigned)time( NULL ) );
  7.    base bas(dim,xmi,xma,ymi,yma);
  8. }
  9. vecteur::vecteur(){}
  10. vecteur::vecteur(vecteur &p){x=p.x;y=p.y;id=p.id;}
  11. void vecteur::afficher()
  12. {   //cout<<endl;  
  13. cout<<"id= "<<id<<endl;
  14. cout<<"xy: "<<x<<" "<<y<<endl;
  15. }
  16. vecteur::~vecteur(){}
  17. //==============la base===============
  18. base::base(int dim,float a,float b,float c,float d)
  19. {
  20. xmin=a;
  21. xmax=b;
  22. ymin=c;   //construire dim vecteur dans la base
  23. ymax=d;
  24. Dimbase=dim;
  25. for (int l=0;l<Dimbase;l++) vect=new vecteur();
  26. int i=0,p=0;
  27.     float value,val1,val2;
  28. ifstream Al;
  29. Al.open("fich.txt" );
  30. while (i <(Dimbase*2) )  // *2 ici car on va lire x et y  
  31. {
  32.   Al >> value;
  33.   val1=value;
  34.   Al >> value;
  35.   val2=value;
  36.  
  37.   if( (i%2)==0)
  38.   {
  39.      vect[p].x=val1;
  40.      vect[p].y=val2;
  41.      vect[p].id=compt++;
  42.      p++;
  43.    
  44.   }
  45. i=i+2;
  46. }
  47.  
  48. Al.close();
  49. }


Please help

Reply

Marsh Posté le 18-07-2005 à 14:24:28   

Reply

Marsh Posté le 18-07-2005 à 14:41:14    

Code :
  1. int i=0;
  2. // ...
  3. while (i <(Dimbase*2) )  // *2 ici car on va lire x et y   
  4. {
  5.   //...
  6.   if( (i%2)==0) 
  7.   { 
  8.     // ...
  9.   }
  10.   i=i+2;
  11. }


 
[:petrus75] explique moi comment tu comptes passer dans le if ... explique-moi plutôt à quoi sert le if, en fait :o


Message édité par theshockwave le 18-07-2005 à 14:43:32
Reply

Marsh Posté le 18-07-2005 à 14:43:58    

j'ai déjà allouer la mémoire dans la boucle  

Code :
  1. for (int l=0;l<Dimbase;l++) vect=new vecteur();


Reply

Marsh Posté le 18-07-2005 à 14:47:10    

:heink:
 
C'est pour rire, ca, non ? ... Parce que là, c'est pas une fuite, que tu fais, c'est pire que tout ...
 
 
Edit : vect, c'est quoi, comme type ? vect *, j'imagine ... pourquoi tu ne te sers pas de la STL, pour gérer ca ?


Message édité par theshockwave le 18-07-2005 à 14:48:21
Reply

Marsh Posté le 18-07-2005 à 14:49:17    

oui oui ca n'as pas de sens, merci pour la remarque, mais ce n'est pas ca le probléme..

Reply

Marsh Posté le 18-07-2005 à 14:50:26    

si, le problème est là ... vect[p], ca va partir où, pour toi ?

Reply

Marsh Posté le 18-07-2005 à 14:52:20    

ok, vect est une class de type

Code :
  1. class vecteur 
  2. {
  3.   public :
  4.  float x,y;
  5.  int id;
  6.  float reald;
  7.  vecteur();
  8.  vecteur(vecteur &p);
  9.      vecteur(float a,float b,float c, float d);
  10. void afficher();
  11. virtual ~vecteur();
  12. };


c'est quoi le STL?

Reply

Marsh Posté le 18-07-2005 à 14:55:00    

et bas est de type

Code :
  1. #include"vecteur.h"
  2. class base
  3. {
  4. public:
  5. float xmin,xmax,ymin,ymax;
  6. int Dimbase;
  7. vecteur *vect;
  8. base(int dim,float a,float b,float c,float d);
  9. void WriteRealDataFile();
  10. void ReaDataFile();
  11. void afficher();
  12. virtual ~base();
  13. };

Reply

Marsh Posté le 18-07-2005 à 14:58:07    

STL = Standard Template Library :o
 
il va falloir que tu apprennes à t'en servir si tu veux faire du C++
 
On se fiche de ta classe vecteur, là, en l'occurrence ... Ce que tu fais, au final, c'est ca :
 

Code :
  1. vecteur * vect = new vecteur;
  2. vect[p].x; // accès aléatoire dans la mémoire


vect[p] te fait pointer sur une zone mémoire dont tu ne connais rien, si p est différent de 0 ...
 
D'où le renvoi à la STL, tu pourras y trouver de quoi gérer des listes, avec, par exemple : std::vector<vecteur>, qui t'évitera ce genre de problèmes :
 

Code :
  1. std::vector<vecteur> vect(dim);
  2. for(size_t i = 0; i<vect.size(); ++i)
  3.     vect[p].x; // accès tout à fait légal


Reply

Marsh Posté le 18-07-2005 à 15:45:55    

l'utilisation de

Code :
  1. std::vector<vecteur> vect(dim);


 me sort le message error C2039: 'vector' : is not a member of 'std'

Reply

Marsh Posté le 18-07-2005 à 15:45:55   

Reply

Marsh Posté le 18-07-2005 à 15:49:55    

Code :
  1. #include <vector>


 
...
jette un oeil aux divers sites / livres proposés ici même parce qu'on ne répondra pas toujours à ce genre de questions triviales :/

Reply

Marsh Posté le 18-07-2005 à 16:20:08    

je suis débutante en c++, je vias prendre en compte ta remarque.
si j'ai bien compris  

Code :
  1. std::vector<vecteur> vect(dim);


defini un tableau de vect de type vecteur de dimension dim, si c'est bien ca je dois définir le constructeur par recopie, si je me trompe corrige moi stp.
j'ai le message d'erreur:class 'vecteur' : no copy constructor available

Reply

Marsh Posté le 18-07-2005 à 16:34:03    

si tu fais ca :

Code :
  1. std::vector<vecteur> vect(dim);


 
alors vect est un "tableau" de dim "vecteur"s, pour que ca fonctionne, il te faut un constructeur par défaut (sans paramètre, quoi) ou alors tu peux donner un vecteur qui représentera la valeur par défaut, auquel cas, oui, il te faut un constructeur par recopie.
 
par exemple :

Code :
  1. class vecteur 
  2. {
  3. public :
  4.   float x,y;
  5.   vecteur() : x(.0f), y(.0f) {};
  6.   vecteur(const vecteur &p) : x(p.x), y(p.y) {};
  7.   vecteur(float _x,float _y) : x(_x), y(_y) {};
  8.   virtual ~vecteur() {};
  9. };


 
te permettra de faire :

Code :
  1. std::vector<vecteur> vect(dim);


 
qui va te créer "dim" "vecteur"s par défaut (donc initialisés à (0.0f, 0.0f) ) ou encore
 

Code :
  1. std::vector<vecteur> vect(dim, vecteur(1.0f, -1.0f));


 
qui crée donc un tableau de "dim" "vecteur"s initialisés avec leur x à 1.0 et leur y à -1.0
 
Edit : j'imagine que le problème que tu as vient du manque de "const" dans ta version


Message édité par theshockwave le 18-07-2005 à 16:35:07
Reply

Marsh Posté le 18-07-2005 à 16:51:29    

Youuuuuupi, ca maaaaaaaaaarche!!
je te remercie infiniment.

Reply

Sujets relatifs:

Leave a Replay

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