Passage de tableau d'objets entre différentes classes [Résolu]

Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
- - Dernière réponse : berenger_R
Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Derniè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 << &notre_A << endl;



// je voudrais qu'il m'affiche l'adresse ou est stoké la valeur de l1a.x

cout << " &notre_A.get_L1a().x = " << &notre_A.get_L1a()->x << endl ;

cout << " &notre_B.get_L1b().x = " << &notre_B.get_L1b()->x << endl ;



// Je voudrais afficher les valeurs de l1a.x, l1a.y,..., l1b.y

cout << " notre_A.get_L1a()[1].x = " << notre_A.get_L1a()[1].x << endl ;

cout << " notre_A.get_L1a()[1].y = " << notre_A.get_L1a()[1].y << endl ;

cout << " notre_A.get_L1a()[2].x = " << notre_A.get_L1a()[2].x << endl ;

cout << " notre_A.get_L1a()[3].x = " << notre_A.get_L1a()[3].x << endl ;

cout << " notre_A.get_L1a()[3].Y = " << notre_A.get_L1a()[3].y << endl ;



notre_A.init_L1a() ; // doit pouvoir modifier les valeurs des l1a

notre_A.afficher() ; // Puis les afficher



// cette méthode doit permettre d'initialiser les objet l1b de
la classe B avec les valeurs de l1a de la classe A grace a la fonction
get_L1a()

notre_B.afficher(notre_A.get_L1a());



// Ensuite c juste pour verifier que les adresses de chaque objets n'a pas été modifié

cout << " &notre_A.get_L1a().x = " << &notre_A.get_L1a()->x << endl ;

cout << " &notre_B.get_L1b().x = " << &notre_B.get_L1b()->x << endl ;



cout << " L1a.x = " << notre_A.get_L1a()->x << endl ;



cout << " L1b.x = " << notre_B.get_L1b()->x << endl ;



cout << " &notre_A.get_L1a().x = " << &notre_A.get_L1a()->x << endl ;

cout << " &notre_B.get_L1b().x = " << &notre_B.get_L1b()->x << endl ;



delete (&notre_A) ; // comme ca, ca fait un Segmentation fault a l'execution

delete (&notre_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

&notre_A.get_L1a().x = 0x40013020

&notre_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

&notre_A.get_L1a().x = 0x40013020

&notre_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

&notre_A.get_L1a().x = 0x40013020

&notre_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
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
4
3
Merci
Deja, tu déclares ta classe de la facon suivante :

class A

{

protected :

L1 l1a[3];

int i;



public :

A();

~A();



void init_L1a();

void afficher();

L1* get_L1a(){return l1a;}

};


Ya rien d'autre de spécial à faire. Les 3 objets sont créés en meme
temps que la classe. L'utilisation de "new" est réservé a des cas
particulier.

Dans le destructeur, il n'y a donc plus rien, puisque l'allocation des variables n'utilise pas "new".

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 210 internautes nous ont dit merci ce mois-ci

Commenter la réponse de luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
4
0
Merci
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.
Commenter la réponse de luhtor
Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
0
Merci
Si je peux utiliser un tableau d'objet, mais je voix pas et sais pas comment faire.

Merci quand meme.
Commenter la réponse de berenger_R
Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
0
Merci
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 (&notre_A) ; // comme ca, ca fait un Segmentation fault a l'execution

delete (&notre_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.
Commenter la réponse de berenger_R
Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
0
Merci
G trouvé pour qu'on ne puisse pas modifier L1a en dehors de la classe A.

Il suffit de mettre :

const L1* get_L1a(){return l1a;}

void afficher(const L1 *H);



Il ne me reste plus que le probleme du destructeur.



Merci et a plus
Commenter la réponse de berenger_R
Messages postés
1
Date d'inscription
vendredi 24 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
0
Merci
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

N salsa 7 ;)
Commenter la réponse de cs_Trucutu
Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
0
Merci
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.



Merci et a plus
Commenter la réponse de berenger_R
Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
0
Merci
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.



Merci et a plus
Commenter la réponse de berenger_R
Messages postés
21
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
3 avril 2006
0
Merci
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.



Merci et a plus
Commenter la réponse de berenger_R