[C++]Problème de pointeur ou de liste chainee

Messages postés
192
Date d'inscription
mercredi 26 décembre 2001
Statut
Membre
Dernière intervention
31 janvier 2007
- - Dernière réponse : you_ahmed
Messages postés
1
Date d'inscription
dimanche 28 mai 2006
Statut
Membre
Dernière intervention
28 mai 2006
- 28 mai 2006 à 16:27
Bonjour... J'essaye de convertir une liste chainée du site en une liste chainée demandant comme parametre un new par exemple ajouter(new Test);

Cela fait 2 jours que j'essaye a temps perdu de l'arranger mais cela fonctionne pas quand j'essaye de faire afficher la valeur d'une variable contenu dans la classe test.

First-chance exception at 0x77d2d231 in Spectacle Manager.exe: 0xC0000005: Access violation reading location 0x000000c8.
Unhandled exception at 0x77d2d231 in Spectacle Manager.exe: 0xC0000005: Access violation reading location 0x000000c8.

(la variable "int var" que j'essaye de lire contient 200 donc 0x000000c8 en hexadecimal mais moi je veux pas qu'il stocke une adresse !!! je veux qu'il stocke un int !)

Voici le code de mes fichiers

// -----------------/
// smMain.cpp
// -----------------/

/* Fichier à inclure. */
#include <windows.h>
#include "smListeChaine.h"

/* Prototype de la procédure qui va recevoir les messages envoyer */
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);

/* Variables Globales */
/* Handle de la fenêtre que l'on va créée */
HWND hwnd;
/* Instance du programme */
HINSTANCE _hInstance;
/* Nom de la classe que l'on va donner lors de
   l'enregistrement de la classe */

const char g_szClassName[] = "SpectacleManager";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{

/* Déclaration des variables */
/* Va contenir les messages */
MSG msg;
/* Va servir pour créé la classe */
WNDCLASSEX wc;

/* Sauvegarde l'instance du programme */
_hInstance = hInstance;

/* Création de la classe */
 	wc.hInstance = _hInstance; /* Instance du programme */
wc.lpszClassName = g_szClassName;  /* Nom de la classe */
wc.lpfnWndProc = WinProc;  /* Adresse de la procédure qui va recevoir les messages */
wc.style = CS_DBLCLKS;  /* Styles! */
wc.cbSize = sizeof(WNDCLASSEX);  /* Taille de la classe(ou struct) */
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);  /* Grande icône */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);  /* Petite icône */
wc.hCursor = LoadCursor(NULL, IDC_ARROW);  /* Curseur */
wc.lpszMenuName = NULL;  /* Menu */
wc.cbClsExtra = 0;  /* Optionnel */
wc.cbWndExtra = 0;  /* Optionnel */
wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);  /* Couleur de fond de la fenêtre */

/* Enregistre la classe */
if (!RegisterClassEx(&wc))
return 0;  /* En cas d'échec, renvoie zéro(Ferme le programme) */

/* Crée la fenêtre */
hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, g_szClassName, "Spectacle Manager - © Copyright Alexandre Langlois",\		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, HWND_DESKTOP, NULL, _hInstance,\		NULL);

/* En cas d'échec, renvoie zéro */
if (hwnd == NULL)
return 0;  /* Ferme le programme */

/* Affiche la fenêtre */
ShowWindow(hwnd, CmdShow);
/* Met à jour la fenêtre */
UpdateWindow(hwnd);

/* Tant qu'on recoi des messages, on boucle */
while (GetMessage(&msg, NULL, 0, 0))
{

TranslateMessage(&msg);
DispatchMessage(&msg);

}

/* Fin du programme */
return msg.wParam;

}

void Message()
{
smListeChaine<Test> Liste;
Liste.AjouterElement(new Test);
Liste.AjouterElement(new Test);
Liste.AjouterElement(new Test);
Liste.operator [](1)->variable();
int teste = Liste.operator [](1)->var;
MessageBox(hwnd,(LPCTSTR)teste,"rtitre",MB_OK);

}

/* Procédure qui recoie les messages */
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{

case WM_CREATE:
Message();
break;
/* Lors de la création de la fenêtre */
case WM_DESTROY:

/* Détruit la fenêtre(Optionnel) */
DestroyWindow(hwnd);
break;  /* Quitte le switch(important) */

/* Lorsque l'utilisateur ferme la fenêtre via le menu système */
case WM_CLOSE:

/* Envoie un message pour quitter(fermer) le programme */
PostQuitMessage(0);
break;  /* Quitte le switch(important) */
/* Par défaut */
default:

return DefWindowProc(hwnd, msg, wParam, lParam); /* Ne pas effacer */
break;  /* Quitte le switch(important) */

}

/* Renvoie zéro */
return 0;

}
/* smMain.cpp */

/* Fichier à inclure. */
#include <windows.h>
#include "smListeChaine.h"

/* Prototype de la procédure qui va recevoir les messages envoyer */
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);

/* Variables Globales */
/* Handle de la fenêtre que l'on va créée */
HWND hwnd;
/* Instance du programme */
HINSTANCE _hInstance;
/* Nom de la classe que l'on va donner lors de
   l'enregistrement de la classe */

const char g_szClassName[] = "SpectacleManager";
int allos = 123;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{

/* Déclaration des variables */
/* Va contenir les messages */
MSG msg;
/* Va servir pour créé la classe */
WNDCLASSEX wc;

/* Sauvegarde l'instance du programme */
_hInstance = hInstance;

/* Création de la classe */
 	wc.hInstance = _hInstance; /* Instance du programme */
wc.lpszClassName = g_szClassName;  /* Nom de la classe */
wc.lpfnWndProc = WinProc;  /* Adresse de la procédure qui va recevoir les messages */
wc.style = CS_DBLCLKS;  /* Styles! */
wc.cbSize = sizeof(WNDCLASSEX);  /* Taille de la classe(ou struct) */
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);  /* Grande icône */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);  /* Petite icône */
wc.hCursor = LoadCursor(NULL, IDC_ARROW);  /* Curseur */
wc.lpszMenuName = NULL;  /* Menu */
wc.cbClsExtra = 0;  /* Optionnel */
wc.cbWndExtra = 0;  /* Optionnel */
wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);  /* Couleur de fond de la fenêtre */

/* Enregistre la classe */
if (!RegisterClassEx(&wc))
return 0;  /* En cas d'échec, renvoie zéro(Ferme le programme) */

/* Crée la fenêtre */
hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, g_szClassName, "Spectacle Manager - © Copyright Alexandre Langlois",\		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, HWND_DESKTOP, NULL, _hInstance,\		NULL);

/* En cas d'échec, renvoie zéro */
if (hwnd == NULL)
return 0;  /* Ferme le programme */

/* Affiche la fenêtre */
ShowWindow(hwnd, CmdShow);
/* Met à jour la fenêtre */
UpdateWindow(hwnd);

/* Tant qu'on recoi des messages, on boucle */
while (GetMessage(&msg, NULL, 0, 0))
{

TranslateMessage(&msg);
DispatchMessage(&msg);

}

/* Fin du programme */
return msg.wParam;

}

void Message()
{
smListeChaine<Test> Liste;
Liste.AjouterElement(new Test);
Liste.AjouterElement(new Test);
Liste.AjouterElement(new Test);
Liste.operator [](1)->variable();
int teste = Liste.operator [](1)->var;
MessageBox(hwnd,(LPCTSTR)teste,"titre",MB_OK);

}

/* Procédure qui recoie les messages */
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{

case WM_CREATE:
Message();
break;
/* Lors de la création de la fenêtre */
case WM_DESTROY:

/* Détruit la fenêtre(Optionnel) */
DestroyWindow(hwnd);
break;  /* Quitte le switch(important) */

/* Lorsque l'utilisateur ferme la fenêtre via le menu système */
case WM_CLOSE:

/* Envoie un message pour quitter(fermer) le programme */
PostQuitMessage(0);
break;  /* Quitte le switch(important) */
/* Par défaut */
default:

return DefWindowProc(hwnd, msg, wParam, lParam); /* Ne pas effacer */
break;  /* Quitte le switch(important) */

}

/* Renvoie zéro */
return 0;

}


// -----------------/
// smListeChainee.h (ce fichier contient la liste chainee et aussi la classe test
// -----------------/

#include <tchar.h>

template <class Element>
class smListeChaine
{
public:
smListeChaine();
~smListeChaine();
BOOL AjouterElement(Element* pItem);
BOOL EffacerElement(int nPosition);
BOOL ViderListe();
Element* operator[](int nPosition);

private:
LPVOID GetPtrAt(int nPosition);
struct Liste
{
Element* pElement;
Liste* pSuivant;
};

Liste* pDebut;
Liste* pFin;
int nNbElem;

};

template <class Element>
smListeChaine<Element>::smListeChaine()
{
pDebut = NULL;
nNbElem = 0;
}

template <class Element>
smListeChaine<Element>::~smListeChaine()
{
ViderListe();
}

template <class Element>
BOOL smListeChaine<Element>::AjouterElement(Element* pItem)
{
Liste* pListe = new Liste;

pListe->pElement = pItem;

if(pDebut == NULL)
{
pDebut = pListe;
pDebut->pSuivant = pListe;
}
else
pFin->pSuivant = pListe;

pFin = pListe;
pFin->pSuivant = NULL;

nNbElem++;

return true;
}

template <class Element>
BOOL smListeChaine<Element>::EffacerElement(int nPosition)
{
Liste* pD;
Liste* pT;

if(nPosition == 0)
{
pT = pDebut;
if(pT == NULL)
return false;

pD = pT;
delete pD->pElement;
pT = pT->pSuivant;
pDebut = pT;
}
else
{
pT = (Liste*)GetPtrAt(nPosition - 1);
if(pT NULL || pT->pSuivant NULL)
return false;

pD = pT;
pD = pD->pSuivant;

delete pD->pElement;

pT->pSuivant = pD->pSuivant;
}

delete pD;
nNbElem--;

return true;
}

template <class Element>
BOOL smListeChaine<Element>::ViderListe()
{
if (pDebut != NULL)
{
delete[] pDebut;
pDebut = NULL;
nNbElem = 0;
}

return true;
}

template <class Element>
LPVOID smListeChaine<Element>::GetPtrAt(int nPosition)
{
Liste* pT = pDebut;
int i = 0;

if(nPosition < 0 || nPosition >= nNbElem)
return NULL;

while(i < nPosition && pT != NULL)
{
pT = pT->pSuivant;
i++;
}

return pT;
}

template <class Element>
Element* smListeChaine<Element>::operator[](int nPosition)
{
Liste* pT = (Liste*)GetPtrAt(nPosition);
return pT->pElement;
}

class Test
{
public:
int var;
void variable()
{
var = 200;
}
};



Merci de votre aide pour régler ce problème ...
Afficher la suite 

4 réponses

Messages postés
192
Date d'inscription
mercredi 26 décembre 2001
Statut
Membre
Dernière intervention
31 janvier 2007
0
Merci
Oups désole jai mis 2 fois le fichier main ...
Commenter la réponse de cs_Arkko
Messages postés
192
Date d'inscription
mercredi 26 décembre 2001
Statut
Membre
Dernière intervention
31 janvier 2007
0
Merci
tiens voici le projet pour vous faciliter la vie ;)
Manager.zip http://forteresserpg.free.fr/Spectacle Manager.zip
Commenter la réponse de cs_Arkko
Messages postés
192
Date d'inscription
mercredi 26 décembre 2001
Statut
Membre
Dernière intervention
31 janvier 2007
0
Merci
Aidez moa plz !
Commenter la réponse de cs_Arkko
Messages postés
1
Date d'inscription
dimanche 28 mai 2006
Statut
Membre
Dernière intervention
28 mai 2006
0
Merci
je besoin de votre aidez ...
pour l'imlementation des listes chainée (uniderectionnelle ou biderectionnelle) telque
les fonction ajouter un element au debut dela,millieu ou <gras>la finliste
les fonctions de suppresion aussi bien...ect
enfin je vous remerci.....
Commenter la réponse de you_ahmed