C++ LinkList

Pagina: 1
Acties:

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:48
Ik ben bezig om in c++ een eigen mail programma te maken. Nu wil ik telkens als er een nieuw mailtje opgehaald wordt die in een linklist zetten. Volgens mij heb ik alles goed staan zo(heb wel meerdere gemaakt)

Toch krijg ik als ik iets uit de list wil halen een Action Violation. Wat kan dit wezen. Dit is mijn Class
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
class listelem{
public:
      String Subject;
      String Sender;
      TStringList * Body;
      listelem *next;
};


class list {
public:
      list():h(0){}
      ~list(){ release();}
      void prepend(String subject, String sender,TStringList* body);
      void del();
      void setNext(){h = h->next;}
      String getSubject();
      String getSender();
      TStringList * getBody();
      listelem *first() const { return (h); }
      void print() const;
      void release();
private:
      listelem *h;
};

Dit is de uitwerking ervan (nog niet helemaal af)
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
void list::prepend(String subject, String sender,TStringList* body){
listelem *temp = new listelem;
temp -> next = h;
temp -> Subject = subject;
temp -> Subject = sender;
temp -> Body = body;
h = temp;
}

void list::del(){
listelem * temp = h;
h = h->next;
delete temp;
}

String list::getSubject(){
listelem * temp = h;
return temp->Subject;

}

String list::getSender(){
listelem * temp = h;
return temp->Sender;

}

TStringList * list::getBody(){
listelem * temp = h;
return temp->Body;

}

void list::release(){
while (h != 0)
  del();
}

Ik zet het er zo in (gebeurt in ene while van nieuwe mails vandaar die setNext()
code:
1
2
w.prepend(POP->MailMessage->Subject,POP->MailMessage->From,POP->MailMessage->Body);
    w.setNext();

en ik probeer het zo uit te lezen
code:
1
frmToon->mMail->Lines->Add("From: " + w.getSender());

Verwijderd

Gebruik std::list.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07-07 21:10
Mijn C++ kennis is vrij beperkt, maar wordt 'h' wel geïnitialiseerd? Of gebeurd dat in de constructor ('list():h(0){}')? Verder ZIET de code er wel goed uit. Om dit soort fouten te vinden bestaan er natuurlijk debuggers, zodat je PRECIES kan zien welke datastructuren opgebouwd worden en waar het voor 't eerst fout gaat.

  • whoami
  • Registratie: December 2000
  • Laatst online: 08-07 15:38
Een access violation krijg je oa als je naar een geheugenlocatie wilt schrijven of van een geheugenlocatie wilt lezen die niet gealloceerd is. Je leest een pointer uit die naar NULL wijst.

Wat je best doet is eens met de debugger door uw programma stappen en dan kun je zien welke lijn er uw fout veroorzaakt. Je kunt dan zien welke variable er niet gealloceerd is.

https://fgheysels.github.io/


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:48
H wordt wel geinitiliseerd, ik zal eens effe gaan kijken met die debugger.

Dit is echt kut namelijk

Verwijderd

Ik zou even geheugen vrijmaken met new...

h = new listelem();

Die Access Violation geeft aan dat je op een geheugenplek wilt schrijven waar het niet mogelijk is..(Zie ook bericht whoami)

Even geheugen voor reserveren dus.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 02-06 09:44

curry684

left part of the evil twins

Waarom gebruik je wel de VCL TStringList voor de mailbody en dan vervolgens niet gewoon de TList voor de maillist? :?

Beetje moeilijk doen terwijl het ook makkelijk kan....

Ennuh doe eens fatsoenlijke error-checking inbouwen, exceptions gooien als de lijst leeg is en zo.

Professionele website nodig?


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 08:52

Reptile209

- gers -

Op zondag 17 maart 2002 12:55 schreef GAEvakYD het volgende:
code:
1
2
3
4
5
6
7
8
void list::prepend(String subject, String sender,TStringList* body){
listelem *temp = new listelem;
temp -> next = h;
temp -> Subject = subject;
temp -> Subject = sender;
temp -> Body = body;
h = temp;
}
Moet die tweede temp -> Subject niet temp -> Sender zijn? Nu blijft Sender een wilde pointer, et voila: een access violation... ;)

edit:
BDX heeft ook wel een punt trouwens... *D

Zo scherp als een voetbal!


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:48
Zal het eens even proberen, dat punt van BDX heb ik er al uit gehaald. Sins dien heb ik geen acces violation meer maar staat er niets in.

  • Quorton
  • Registratie: Januari 2001
  • Laatst online: 31-05 14:12
Volgens mij klopt je First functie ook niet, je haalt daarmee de H pointer op, terwijl die door setnext steeds wijzigt. Je moet dus een extra listelem toevoegen om het 1e item te bewaren.
Het punt van BDX is volgens mij ook niet van toepassing, omdat de eerste H op 0 geinitialisserd word (en dus niet gealloceerd hoeft te worden), waarna met prepend wordt toegevoegd waarin al new wordt gedaan.

Quadcore 6600 @ 3,3Ghz, 4 GB, 2 TB raid 5, GF 8400GS
P4 2.8G, 2 GB, 500GB diskspace, GF FX5200

Pagina: 1