Violation d'accès lors de la lecture de l'emplacement 0x00000000.

Résolu
d0jones Messages postés 10 Date d'inscription vendredi 29 décembre 2000 Statut Membre Dernière intervention 15 janvier 2013 - 6 nov. 2011 à 12:16
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 - 7 nov. 2011 à 16:52
bonjour,
j'ai un petit souci, quand j'essai d'accéder à la donnée de ma struct j'ai le message suivant :
Exception non gérée à 0x01202029 dans ListTemplate.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.
Liste.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include 
#ifndef _LIST_
#define _LIST_

using namespace std;
template <typename T>
struct cell 
{	
public:
T data;
cell<T>* next;
};


template <class T>
class Liste
{
public:
Liste(void)
{
this->first=NULL;
this->last=NULL;
this->size=0;
}

Liste(const Liste<T>& list)
{
if (list.size != 0 && list.first != NULL)
{
const  cell<T> *temp = list.first;
while (temp->next != NULL)
{
this->AddInQueue(temp->data);
temp = temp->next;
}
}
}

virtual ~Liste(void)
{
delete(this->first);
delete(this->last);
}

int GetSize()
{
return this->size;
}

void AddInHead(T t)
{
cell<T>* c = new cell<T>();
c->data = t;
c->next = this->first;
this->first = c;
this->size++;
}

void AddInQueue(T t)
{
cell<T>* c = new cell<T>();
c->data = t;
c->next = NULL;
this->last = c;
this->size++;
}

void Concat(const Liste<T>& list)
{
if (list.first != NULL)
{
const  cell<T> *temp = list.first;
while (temp->next != NULL)
{
this->AddInQueue(temp->data);
temp = temp->next;
}
}
}

T ElementAt(int pos)
{
if (pos > this->size)
{
return NULL;
}
else 
{
const cell<T> *temp = this->first;
int cpt = 0;
for (int i=0; i<=pos; i++)
{
if (i == pos)
{
T data = temp->data;
return data;
}
else
{
temp = temp->next;
}
}
/*while (temp->next != NULL)
{
if (cpt == pos)
{
return temp->data;
}
cpt++;
temp = temp->next;
}*/
return -1;
}
}

inline const std::ostream & operator <<(std::ostream & out)
{
if (this->first != NULL)
{
const  cell *temp = this->first;
for (int i = 0; i < this->size; i++)
{
out << (int)temp->data << " - " ; 
temp = temp->next;
} 
}
return out;
}

private:
int size;
cell<T>* first;
cell<T>* last;
};
#endif


le fichier Liste.cpp est vide

le main :

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include 
#include "liste.h"

using namespace std;


int main (int argc, char** argv)
{
Liste* list = new Liste();
cout << "constructeur par defaut : longueur de la liste : " << list->GetSize() <<endl;

list->AddInHead(1);
cout << "ajout en tete de '1' : longueur de la liste : " << list->GetSize() <<endl;
cout << " contenu de la liste : " << list << endl;

list->AddInQueue(2);
cout << "ajout en queue de '2' : longueur de la liste : " << list->GetSize() <<endl;
cout << " contenu de la liste : " << list << endl;

cout << "element a la position 1 : " << list->ElementAt(1) << endl;

Liste* list1 = new Liste();
list1->AddInQueue(3);
list1->AddInQueue(4);
list1->AddInQueue(5);
cout << "creation de la liste 1 contenant les elements '3,4,5'" <<endl;
cout << " contenu de la liste : " << list1 << endl;

list->Concat(*list1);
cout << "concat de list(2) et list1(3) : longeur de la la liste : " << list->GetSize() << endl;
cout << " contenu de la liste : " << list << endl;

Liste* list2 = new Liste(*list);
cout << "constructeur par recopie : longueur de la liste : " << list2->GetSize() << endl;
cout << " contenu de la liste : " << list2 << endl;


char n;
scanf ("%c",&n);
return 0;
}


pourquoi n'y ai je pas accès?
Merci d'avance

9 réponses

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
6 nov. 2011 à 14:31
En fait j'en arrive à çeci :
    friend std::ostream& operator <<(std::ostream& out, Liste<T>*& list) //(pour pouvoir faire std::cout << list)
    {
          if (list->ElementAt(0) != NULL)
        {
            const cell<T> *temp = list->GetFirst(); // ici il manque un <T>
            for (int i = 0; i < list->GetSize(); i++)
            {
                out << (T)temp->data << " - " ;
                temp = temp->next;
            }
        }

        return out;
    }


Mais il reste une erreur dans AddInQueue: last pointe sur la dernière cellule, lui affecte sa valeur, et indique que la suivante ne pointera sur rien. Mais à quelle moment la variable next de l'avant-dernière cellule pointe sur la nouvelle
Jamais, donc la liste contient bien le nombre d'éléments voulu, mais ils ne sont pas reliés entre eux... Contrairement à la fonction AddInHead, qui elle fonctionne correctement, et du coup fait planter l'affichage.


C++dialement,

Pop70
3