[C++ .NET] Structure dynamique
Bonjour
J'ai un nouveau probl�me :-(
Le but de ce programme doit �tre la gestion d'une structure dynamique de type FIFO (First In First Out).
L'erreur que j'obtient est une exception NULL reference dans la proc�dure retraitFile � cette ligne
Code:
mazda_tete = *ptra.elemProch;
donc je suppose que ptra.elemProch est NULL et donc que ma proc�dure ajoutFile n'est pas bonne mais je ne vois pas ou (ca fait 1 semaine que je bloque la dessus).
Form1. CPP
Code:
1 2 3 4 5 6 7
|
struct bloc
{
int nombre;
struct bloc *elemProch;
};
typedef struct bloc file; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
#undef MessageBox;
using namespace file_tableau;
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
Application::Run(new Form1());
return 0;
}
System::Void Form1::Form1_Load(System::Object * sender, System::EventArgs * e)
{
file tete, queue;
ajoutFile(tete, queue, 1);
MessageBox::Show(Convert::ToString(tete.nombre));
ajoutFile(tete, queue, 2);
MessageBox::Show(Convert::ToString(queue.nombre));
ajoutFile(tete, queue, 3);
retraitFile(tete, queue);
MessageBox::Show(Convert::ToString(queue.nombre));
}
void Form1::initFile(file& mazda_tete,file& mazda_queue)
{
mazda_tete.elemProch = NULL;
mazda_queue.elemProch = NULL;
}
bool Form1::fileVide(file mazda_tete)
{
if(!(mazda_tete.elemProch))
{
return true;
}
else
{
//MessageBox::Show("File NON VIDE");
return false;
}
}
void Form1::ajoutFile(file& mazda_tete, file& mazda_queue, int donnee)
{
file* ptra;
ptra = new(file);
ptra->nombre = donnee;
if(fileVide(mazda_tete))
{
mazda_tete = *ptra;
mazda_queue.elemProch = NULL;
}
else
{
mazda_queue.elemProch = ptra;
mazda_queue = *ptra;
}
//MessageBox::Show(Convert::ToString(mazda_tete.nombre));
}
void Form1::retraitFile(file& mazda_tete, file& mazda_queue)
{
file ptra;
ptra = mazda_tete;
mazda_tete = *ptra.elemProch;
delete(&ptra);
} |
Si quelqu'un voit ou ca cloche ... merci d'avance
Re: [C++.NET] Structure dynamique
Citation:
Envoy� par tidou
Le but de ce programme doit �tre la gestion d'une structure dynamique de type FIFO (First In First Out).
Il y a quelques probl�mes avec l'algo :)
J'ai quelques questions en cours de route, parce que c'est pas super clair :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| System::Void Form1::Form1_Load(System::Object * sender, System::EventArgs * e)
{
file tete, queue;
ajoutFile(tete, queue, 1);
MessageBox::Show(Convert::ToString(tete.nombre));
ajoutFile(tete, queue, 2);
MessageBox::Show(Convert::ToString(queue.nombre));
ajoutFile(tete, queue, 3);
retraitFile(tete, queue);
MessageBox::Show(Convert::ToString(queue.nombre));
} |
'queue' c'est cens� �tre quoi ? Le dernier �l�ment de la liste ?
Code:
1 2 3 4 5
| void Form1::initFile(file& mazda_tete,file& mazda_queue)
{
mazda_tete.elemProch = NULL;
mazda_queue.elemProch = NULL;
} |
Cette m�thode n'est jamais appel�e, et j'ai toujours du mal � voir la relation entre tete et queue.
Code:
1 2 3 4
| void Form1::ajoutFile(file& mazda_tete, file& mazda_queue, int donnee)
{
file* ptra;
ptra = new(file); |
Probl�me potentiel ici, le pointeur vers elemProch n'est pas initialis�. Et il ne vaut pas null (plus pr�cis�ment, il vaut 0xcdcdcdcd d'apr�s mon debuggueur :)
Code:
1 2 3 4 5 6
| ptra->nombre = donnee;
if(fileVide(mazda_tete))
{
mazda_tete = *ptra;
mazda_queue.elemProch = NULL; |
L� tu �crases le contenu de tete, avec donc un pointeur vers elemProch. Et je ne vois toujours pas ce que vient faire queue l�-dedans :)
Code:
1 2 3 4 5 6
| }
else
{
mazda_queue.elemProch = ptra;
mazda_queue = *ptra;
} |
L� si je suis le principe de fonctionnement hypoth�tique, tu veux faire pointer le dernier �l�ment de la liste vers celui que tu viens de cr�er, et ensuite tu veux d�caler ta variable queue qui serait cens�e pointer sur le nouveau dernier �l�ment. J'ai bon ?
Parce que l� ce que tu fais, c'est que tu changes le pointeur vers elemProch dans ta variable queue, et ensuite tu �crases le contenu de cette m�me variable (dont le pointeur vers elemProch) avec le contenu de ptra. Autrement dit tu remets un elemProch invalide, et c'est toujours la m�me variable queue.
Code:
1 2 3 4 5 6 7
| void Form1::retraitFile(file& mazda_tete, file& mazda_queue)
{
file ptra;
ptra = mazda_tete;
mazda_tete = *ptra.elemProch;
delete(&ptra);
} |
Et donc le probl�me de ton post (les probl�mes ci-dessus vont t'arriver juste apr�s :).
Toujours en suivant le fonctionnement th�orique, tu veux r�cup�rer le premier �l�ment, remplacer la t�te par le 2� puis supprimer l'ancien premier �l�ment ?
C'est pas ce que tu fais ici.
Tu cr�es ptra, initialis� avec elemProch � null et valeur � 0. Tu y copies les donn�es de mazda_tete (qui s'�tait retrouv� avec un elemProch invalide, cf plus haut). Ensuite, tu �crases le contenu de mazda_tete par le contenu de ce qui se trouve � l'autre bout de son elemProch (qui est donc toujours aussi invalide).
Forc�ment, �a plante.
Citation:
Envoy� par tidou
Si quelqu'un voit ou ca cloche ... merci d'avance
� plusieurs endroits donc :)
Tu as apparemment un probl�me avec les notions de passage par valeur, par r�f�rence et par pointeurs.
Le gros de ton traitement devrait se faire via des pointeurs. L� vu que tu passes des r�f�rences, les affectations copient le contenu au lieu des �l�ments de la liste eux-m�mes.
Actuellement par exemple, ta variable queue cr��e dans Form1_Load est toujours la m�me. Si elle est cens�e pointer sur le dernier �l�ment, c'est rat�. Tout ce que tu fais avec, c'est y stocker un elemProch invalide et la valeur du dernier �l�ment 'ajout�'. Mais rien n'est ajout� en fait.
Bref, commence par transformer ta structure en classe, et (surtout), transmets-lui les op�rations ajout/retrait/init/vide. C'est � elle de les g�rer, pas au code qui l'utilise.
Aussi, devoir transmettre un pointeur/une r�f�rence au dernier �l�ment de la liste pour chaque op�ration, c'est pas une bonne id�e (mais �a se r�gle tout seul une fois que tu isoles le traitement dans sa propre classe :)