berenger_R
Messages postés21Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 3 avril 2006
-
31 mars 2006 à 12:11
berenger_R
Messages postés21Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 3 avril 2006
-
3 avril 2006 à 15:26
Bjr,
J'ai un probleme avec un petit programme pour tester (c pour ca qu'il y
a bcp de cout) certaine fonctionalité dont g besoin pour un programme
bcp plus gros.
Je pense fortement que c un probleme de pointeur mélangé avec le tableau.
MAIN main.cpp
#include "test.hpp"
int main()
{A notre_A;
B notre_B;
cout << " Programme principal " << endl ;
cout << ¬re_A << endl;
// je voudrais qu'il m'affiche l'adresse ou est stoké la valeur de l1a.x
delete (¬re_A) ; // comme ca, ca fait un Segmentation fault a l'execution
delete (¬re_B) ; // Et si je met: delete notre_A, g cette
erreur a la compilation: main.cpp:45: type `class A' argument
given to `delete', expected pointer
return 0;
}
Déclaration des classe (test.hpp)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include
class L1
{
public :
double x;
double y;
};
class A
{
protected :
L1 *l1a[3];
int i;
public :
A();
~A();
void init_L1a();
void afficher();
L1* get_L1a(){return *l1a;}
};
class B
{
protected :
L1 *l1b[3];
int i;
public:
B();
~B();
void init_L2b();
void afficher(L1 *H);
L1* get_L1b(){return *l1b;}
};
Déclaration des méthodes (test.cpp)
#include "test.hpp"
A::A()
{
cout << "Construction de A" << endl ;
l1a[1] = new L1 ;
l1a[2] = new L1 ;
l1a[3] = new L1 ;
l1a[1]->x=100;
l1a[1]->y=100;
l1a[2]->x=200;
l1a[2]->y=200;
l1a[3]->x=300;
l1a[3]->y=300;
cout << "Construction de A bis " << endl ;
cout << " L1a[1].x = " << l1a[1]->x << endl ;
cout << " L1a[1].y = " << l1a[1]->y << endl ;
cout << " L1a[2].x = " << l1a[2]->x << endl ;
cout << " L1a[2].y = " << l1a[2]->y << endl ;
cout << " L1a[3].x = " << l1a[3]->x << endl ;
cout << " L1a[3].y = " << l1a[3]->y << endl ;
}
A::~A()
{
delete l1a[1] ;
delete l1a[2] ;
delete l1a[3] ;
}
void A::init_L1a()
{
int i=1;
for(i=1; i<4; i++)
{ cout << "initialisation de L1a" <x = i ;
l1a[i]->y = i+10 ;
}
}
void A::afficher()
{
int i=1;
for(i=1; i<4; i++)
{ cout << " L1a["<x << endl ;
cout << " L1a["<y << endl ;
}
}
B::B()
{
cout << "Construction de B" << endl ;
l1b[1] = new L1 ;
l1b[2] = new L1 ;
l1b[3] = new L1 ;
l1b[1]->x=101;
l1b[1]->y=101;
l1b[2]->x=201;
l1b[2]->y=201;
l1b[3]->x=301;
l1b[3]->y=301;
cout << "Construction de B bis " << endl ;
cout << " L1b[1].x = " << l1b[1]->x << endl ;
cout << " L1b[1].y = " << l1b[1]->y << endl ;
cout << " L1b[2].x = " << l1b[2]->x << endl ;
cout << " L1b[2].y = " << l1b[2]->y << endl ;
cout << " L1b[3].x = " << l1b[3]->x << endl ;
cout << " L1b[3].y = " << l1b[3]->y << endl ;
}
B::~B()
{
delete l1b[1] ;
delete l1b[2] ;
delete l1b[3] ;
}
void B::init_L2b(){}
void B::afficher(L1 *H)
{
// on affecte l1a a l1b
l1b[1]->x = H[1].x;
cout << " L1b.x = " << l1b[1]->x << endl ;
cout << " L1b.y = " << l1b[1]->y << endl ;
l1b[1]->x = l1b[1]->x + l1b[1]->y;
cout << " L1b.x = " << l1b[1]->x << endl ;
}
Compilation : g++ -o essai main.cpp test.cpp
Résultat de l'execution
Construction de A
Construction de A bis
L1a[1].x = 100
L1a[1].y = 100
L1a[2].x = 200
L1a[2].y = 200
L1a[3].x = 300
L1a[3].y = 300
Construction de B
Construction de B bis
L1b[1].x = 101
L1b[1].y = 101
L1b[2].x = 201
L1b[2].y = 201
L1b[3].x = 301
L1b[3].y = 301
Programme
principal
Jusque la tout
va bien
0xbfffc1c0
¬re_A.get_L1a().x = 0x40013020
¬re_B.get_L1b().x = 0xbfffc1e8
notre_A.get_L1a()[1].x =
2.81494
Je devrais avoir = 100
notre_A.get_L1a()[1].y =
2.47033e-323
Je devrais avoir = 100
notre_A.get_L1a()[2].x =
8.69169e-311
Je devrais avoir = 200
notre_A.get_L1a()[3].x =
2.122e-314
Je devrais avoir = 300
notre_A.get_L1a()[3].Y =
0
Je devrais avoir = 300
initialisation de L1a1
initialisation de L1a2
initialisation de L1a3
L1a[1].x = 1
L1a[1].y = 11
L1a[2].x =
2
L'initialisation ce passe bien
L1a[2].y = 12
L1a[3].x = 3
L1a[3].y =
13
L1b.x =
2.81494
Je
devrais avoir l1b[1].x = 1
L1b.y =
101
Je devrais avoir l1b[1].y = 11
L1b.x =
103.815
Je
devrais avoir l1b[1].x = 12
¬re_A.get_L1a().x = 0x40013020
¬re_B.get_L1b().x = 0xbfffc1e8
L1a.x = 1.11405e-313
Je devrais avoir l1a[1].x = 1
L1b.x =
4.85584e-270
Je devrais avoir l1b[1].x = 12
¬re_A.get_L1a().x = 0x40013020
¬re_B.get_L1b().x = 0xbfffc1e8
Segmentation fault
Voila, j'espère que quelqu'un pourra m'aider. Je me doute que le
probleme vient d'un probleme de pointer mais j'ai l'impression que je
n'y comprend pas grand chose.
Car j'ai reussi a faire ce transfert entre classe pour un objet seul , mais le passage au tableau d'objet chamboule tout.
Merci d'avance a ceux qui prendront le temps de le débugger
A voir également:
Passage de tableau d'objets entre différentes classes
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 31 mars 2006 à 17:08
Bas quand on voit ca L1 *l1a[3], j'ai pas le courage d'étuder le code en entier ... :-(
mais faut etre prudent quand on utilise des tableaux de pointeurs. Tu
peux pas utiliser des tableaux d'objets ? ou meme mieux un vector
d'objet ? Ca éviterait des manipulations délicates de pointeurs.
berenger_R
Messages postés21Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 3 avril 2006 3 avril 2006 à 09:37
Je te remercie bcp pour ton aide, Ca marche mille fois mieux.
Si je peux abuser, il me reste deux petits problemes :
Le premier et la destruction a la fin du main(), g tjrs la meme erreur
alors que g bien enlevé les new L1a ......... dans le constructeur et
les delete L1a ......... dans le destructeur :
delete (¬re_A) ; // comme ca, ca fait un Segmentation fault a l'execution
delete (¬re_B) ; // Et si je met : delete notre_A , g cette
erreur a la compilation: main.cpp:45: type `class A' argument given to
`delete', expected pointer
Le deuxième et que je peux modifier les valeur dans L1a lorsque je fait
un get_L1a()[1].x=22 dans le main() par exemple. Il faudrait qu'il ne
puisse etre modifier que par des méthodes de la classe A.
Voila et encore merci pour ton aide salutère.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Trucutu
Messages postés1Date d'inscriptionvendredi 24 février 2006StatutMembreDernière intervention 3 avril 2006 3 avril 2006 à 14:02
Tu confond les choses. Vu ce que tu veux faire, c'est trop d'écrire
L1 *l1a[3] ;
soit tu déclare L1 l1a[3] ; en dans un point de vue statique
ou, dans une optique plus dynamique, tu peux declarer L1 *l1a ; puis faire :
l1a = new L1[n] ;
dans le constructeur (où n est un autre attribut que tu peux initialiser à ta guise avant (choix utilisateur?))
et delete [] l1a ; dans le destructeur
berenger_R
Messages postés21Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 3 avril 2006 3 avril 2006 à 15:17
Je pense que dans un premier temps je vais éviter de le faire dynamique.
Sinon, je n'utilise plus de new, donc, faut il que je fasse un delete
ou pas car g tjrs ce probleme de segmentation fault ou type `class A'
argument given to `delete' expected pointer.
berenger_R
Messages postés21Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 3 avril 2006 3 avril 2006 à 15:26
Je pense que dans un premier temps je vais éviter de le faire dynamique.
Sinon, je n'utilise plus de new, donc, faut il que je fasse un delete
ou pas car g tjrs ce probleme de segmentation fault ou type `class A'
argument given to `delete' expected pointer.
berenger_R
Messages postés21Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 3 avril 2006 3 avril 2006 à 15:26
Je pense que dans un premier temps je vais éviter de le faire dynamique.
Sinon, je n'utilise plus de new, donc, faut il que je fasse un delete
ou pas car g tjrs ce probleme de segmentation fault ou type `class A'
argument given to `delete' expected pointer.