Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

File dynamique problème de pointeurs

2 réponses
Avatar
nico
Bonjour

Il s'agit d'une file dynamique (FIFO) gérer avec un pointeur sur la tête de
la file et un pointeur sur la queue de la file. (le sujet est ainsi je ne
peut pas utiliser d'autres méthodes plus "faciles").

Si je lance le programme sans appel à la procédure retraitFile, mon
messagebox m'affiche bien la valeur 1 correspondant à la tête, MAIS si
j'appel retraitFile, ma tête devrait être égal à 2 mais j'obtient une "NULL
EXCEPTION" donc je pense que c'est parce que mazda_tete->elemProch est NULL
mais je ne vois pas pourquoi.

je débute en C++ et j'aimerai savoir qu'est-ce qui cloche dans mon
programme. Je pense que la procédure AjoutFile ou RetraitFile est la cause
de mon problème mais je ne trouve pas ou.

Merci d'avance à ceux qui m'aideront.

Bonne journée à vous

Code de Form1.h

struct bloc
{
int nombre;
struct bloc *elemProch;
};
typedef struct bloc file;


Form1.cpp

#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;
file* queue;

initFile(tete, queue);

ajoutFile(tete, queue, 1);
ajoutFile(tete, queue, 2);
ajoutFile(tete, queue, 3);
ajoutFile(tete, queue, 4);

retraitFile(tete, queue);
//retraitFile(queue, tete);
MessageBox::Show(Convert::ToString(tete->nombre)); // n imp
}

void Form1::initFile(file*& mazda_tete,file*& mazda_queue)
{
mazda_tete = NULL;
mazda_queue = NULL;
}

bool Form1::fileVide(file* mazda_tete)
{
if(mazda_tete == NULL)
{
return true;
}
else
{
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))
{
ptra->elemProch = mazda_queue;
mazda_queue = ptra;
}
else
{
mazda_tete = ptra;
mazda_queue = ptra;
}
}

void Form1::retraitFile(file*& mazda_tete, file*& mazda_queue)
{
file* ptra;
ptra = mazda_tete;
mazda_tete = ptra->elemProch;
delete(ptra);
}

2 réponses

Avatar
Jean-Marc Bourguet
"nico" writes:

Il s'agit d'une file dynamique (FIFO) gérer avec un
pointeur sur la tête de la file et un pointeur sur la
queue de la file. (le sujet est ainsi je ne peut pas
utiliser d'autres méthodes plus "faciles").


Ok, un exercice.

Si je lance le programme sans appel à la procédure
retraitFile, mon messagebox m'affiche bien la valeur 1
correspondant à la tête, MAIS si j'appel retraitFile, ma
tête devrait être égal à 2 mais j'obtient une "NULL
EXCEPTION" donc je pense que c'est parce que
mazda_tete->elemProch est NULL mais je ne vois pas
pourquoi.

je débute en C++ et j'aimerai savoir qu'est-ce qui cloche
dans mon programme. Je pense que la procédure AjoutFile ou
RetraitFile est la cause de mon problème mais je ne trouve
pas ou.

Merci d'avance à ceux qui m'aideront.

Bonne journée à vous

Code de Form1.h

struct bloc
{
int nombre;
struct bloc *elemProch;
};
typedef struct bloc file;


C'est du C ou du C++? En C++ le tag est aussi un type et
l'utilisation de "struct tag" n'est vraiment pas
idiomatique. Avec ce que tu as écrit ci-dessus, tu as deux
types disponibles et synonyme: bloc et file.
En C il est idiomatique de faire

Form1.cpp


Oui, ça a l'air d'être du C++.

#include "stdafx.h"


MS-Windows, j'espère que ça ne sert à rien parce qu'on sort
de mon domaine de compétance.

#include "Form1.h"
#include <windows.h>

#undef MessageBox;


Ouille, je ne connais pas windows mais ça me semble un
mauvais signe.

[...]
System::Void Form1::Form1_Load(System::Object * sender, System::EventArgs *
e)
{
file* tete;
file* queue;

initFile(tete, queue);

ajoutFile(tete, queue, 1);
ajoutFile(tete, queue, 2);
ajoutFile(tete, queue, 3);
ajoutFile(tete, queue, 4);

retraitFile(tete, queue);
//retraitFile(queue, tete);


C'est du C ou du C++? En C++, tu aurais encapsulé ta fifo
dans une classe dont initFile serait le constructeur,
ajoutFile un fonction membre publique, tete et queue des
membres privés. (En fait en C tu aurais aussi mis tete et
queue dans une struct.)

MessageBox::Show(Convert::ToString(tete->nombre)); // n imp
}

void Form1::initFile(file*& mazda_tete,file*& mazda_queue)
{
mazda_tete = NULL;
mazda_queue = NULL;
}


Ok.

bool Form1::fileVide(file* mazda_tete)
{
if(mazda_tete == NULL)
{
return true;
}
else
{
return false;
}
}


Ok. Aussi un membre de la classe fifo.

void Form1::ajoutFile(file*& mazda_tete, file*& mazda_queue, int donnee)
{
file* ptra;
ptra = new(file);
ptra->nombre = donnee;

if(!fileVide(mazda_tete))
{
ptra->elemProch = mazda_queue;
mazda_queue = ptra;
}
else
{
mazda_tete = ptra;
mazda_queue = ptra;
}
}


Le problème se situe ici. Fais un dessin avec des petits
rectangles pour représenter les file et des flèches pour
représenter les pointeurs, tu devrais trouver ton erreur.

void Form1::retraitFile(file*& mazda_tete, file*& mazda_queue)
{
file* ptra;
ptra = mazda_tete;
mazda_tete = ptra->elemProch;
delete(ptra);
}


Ça me semble correct.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
nico
merci problème résolu :-)