/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Problem med at slette et objekt fra en STL~
Fra : Carsten Lindsten


Dato : 27-11-01 00:23

Jeg håber du kan hjælpe mig videre.
Når jeg afvikler nedenstående metode tilføjSpiller(...) push'es spilleren
rigtignok på enden af vectoren,
men når jeg afvikler metoden afmeldSpiller(...). slettes spilleren ikke fra
vectoren, istedet stoppes
programmet af en page_fault. .

'/*Klassen Felt */
....
#include <vector>
#include "Spiller.h"
using namespace std;

class Felt {
private:
vector<Spiller*> spillerliste;
......
public:
...
void tilfojSpiller(Spiller *p_spiller) {
spillerliste.push_back(p_spiller);
}


void afmeldSpiller(Spiller *p_spiller) {
for(vector<Spiller*>::iterator i=spillerliste.begin(); i !=
spillerliste.end() ; ++i) {
if((*i)->getNr() = = p_spiller->getNr())
spillerliste.erase(i);
}
}

På forhånd tak

Carsten



 
 
Mogens Hansen (27-11-2001)
Kommentar
Fra : Mogens Hansen


Dato : 27-11-01 06:46


"Carsten Lindsten" <lindsten@get2net.dk> wrote in message
news:9tuijs$o99$1@sunsite.dk...

> men når jeg afvikler metoden afmeldSpiller(...). slettes spilleren ikke
fra
> vectoren, istedet stoppes
> programmet af en page_fault. .

Hvilken del af funktion udføres, når der kommer en page fault ?

> void afmeldSpiller(Spiller *p_spiller) {
> for(vector<Spiller*>::iterator i=spillerliste.begin(); i !=
> spillerliste.end() ; ++i) {
> if((*i)->getNr() = = p_spiller->getNr())

Peger *i på et gyldigt objekt ?
Peger p_spiller på et gyldigt objekt ?

> spillerliste.erase(i);

Læs i bogen, hvad der gælder om iteratorens gyldighed efter erase.
Skriv enten
i = spillerliste.erase(i);
eller
spillerliste.erase(i);
return;

Generelt kan det kraftigt anbefales at benytte produkter som Borland
CodeGuard, NuMega BoundsChecker eller Rational Purify. De vil typisk pege
direkte på hvor problemet er, og samtidig finde fejl i programmet som man
har overset og som ikke umiddelbart ser ud til at have konsekvenser.

Venlig hilsen

Mogens Hansen



Carsten Lindsten (27-11-2001)
Kommentar
Fra : Carsten Lindsten


Dato : 27-11-01 15:49


Mogens Hansen <mogens_h@dk-online.dk> wrote in message
news:9tv96s$t8t$1@news.cybercity.dk...

Tak for hjælpen - begge løsninger er en succes.
Jeg ved desvære ikke hvorfor det løser problemet. De bøger jeg har læst,
fortæller ikke noget om iteratorens gyldighed efter erase.

Jeg håber du kan anbefale en bog eller et web-sted, der beskriver
problemstillingen.

Venlig hilsen
Carsten Lindsten




Mogens Hansen (27-11-2001)
Kommentar
Fra : Mogens Hansen


Dato : 27-11-01 16:26


"Carsten Lindsten" <lindsten@get2net.dk> wrote in message
news:9u08pg$1q0$1@sunsite.dk...
>
>
> Jeg håber du kan anbefale en bog eller et web-sted, der beskriver
> problemstillingen.
>

Der er mange gode bud.
F.eks.:

STL Tuturial and Reference Guide, Second Edition
David R. Musser, Gillmre J. Derge, Atul Saini
ISBN 0-201-37923-6
Det er den jeg bruger. Det er lidt tilfældigt. Første edition var den første
bog om STL. Den er udemærket.

Jeg vil også forvente at følgende er gode

Generic Programming and the STL: Using and Extending the C++ Standard
Template Library
Matthew H. Austern
ISBN: 0-201-30956-4

Effective STL: 50 Specific Ways to Improve Your Use of the Standard
Template Library
Scott Meyers
ISBN: 0-201-74962-9

The C++ Standard Template Library
P. J. Plauger (Editor), Alexander A. Stepanov, Meng Lee, David R. Musser
ISBN: 0-134-37633-1

Der findes sikkert mange andre gode, men kig på hvem forfatteren er og se
også www.accu.org for boganmeldelser.

Venlig hilsen

Mogens Hansen



Ivan Johansen (28-11-2001)
Kommentar
Fra : Ivan Johansen


Dato : 28-11-01 00:19

Carsten Lindsten wrote:

> Jeg håber du kan anbefale en bog eller et web-sted, der beskriver
> problemstillingen.

Jeg kan anbefale Thinking in C++, som kan downloades gratis fra:
http://www.mindview.net/Books

Ivan Johansen


Jakob Møbjerg Nielse~ (28-11-2001)
Kommentar
Fra : Jakob Møbjerg Nielse~


Dato : 28-11-01 01:11

> Tak for hjælpen - begge løsninger er en succes.
> Jeg ved desvære ikke hvorfor det løser problemet.

Det er fordi erase() er en funktion der returnerer positionen på det
næste element. Hvis du ikke tildeler denne værdi til iteratoren, så
peger den på et ugyldigt element (du har jo lige slettet det).

Grunden til at det virker når du skriver

spillerliste.erase(i);
return;

er at return afslutter funktionen, og du prøver derfor ikke at tilgå det
ugyldige element i næste gennemløb.

En anden ting: Hvis det ikke er nødvendigt at kunne benytte random acces
iteratorer, så brug en list i stedet for en vector. Det er hurtigere at
insætte/slette elementer (i gennemsnit), og lister frigør altid
hukommelsen når et element er blevet slettet, hvilket vectors aldrig
gør. Det har sikkert ikke noget mærkbart at sige i dit tilfælde, men det
er pænere

--
Jakob Møbjerg Nielsen
jakob@dataloger.dk
"Hey! He reminds me of someone who looks just like him. - Me"



Jesper Wolf Jesperse~ (28-11-2001)
Kommentar
Fra : Jesper Wolf Jesperse~


Dato : 28-11-01 23:49

Hej Carsten.

> Tak for hjælpen - begge løsninger er en succes.
> Jeg ved desvære ikke hvorfor det løser problemet. De bøger jeg har læst,
> fortæller ikke noget om iteratorens gyldighed efter erase.
>
> Jeg håber du kan anbefale en bog eller et web-sted, der beskriver
> problemstillingen.

Jeg har lige anskaffet Meyers bog om STL hvor der netop står en del om
iteratorer der bliver invalideret i forbindelse med de forskellige
modifikationer på containere.
Bogen ligger selvf på jobbet så jeg kan ikke se om vector er en af dem han
advarer om, men mon ikke. Internt er en vektor jo organiseret som et C array
og der vil du ved sletning komme til at flytte alle elementerne så en
iterator kan vel sagtens komme til at pege ud i den blå luft efter den
forestilling.

Jeg har ikke læst bogen færdig (fik den i mandags og vi er tre der deler den
, men det er mit indtryk at der kommer en masse interessante ting frem i
teksten.
Men bogen er faktisk ikke en introduktion til STL, den taler meget om
forskellige implementeringer og hvad de betyder for bibliotekets egenskaber.

Det er for eksempel ikke nogen selvfølge at string objekter er thread safe,
jeg skal til at kigge i dokumentationen for at se om jeg risikerer problemer
med reference counting i Borland C++ og Visual Studio 6.

Nå ikke mere snak.

Her er informationen fra Amazon.
1 "Effective STL"
Scott Meyers;
Paperback; @ GBP 27.11 each
Usually available in 24 hours
Paperback - 240 pages (4 July, 2001)
Addison Wesley; ISBN: 0201749629

Med venlig hilsen
Jesper Wolf Jespersen


Mogens Hansen (28-11-2001)
Kommentar
Fra : Mogens Hansen


Dato : 28-11-01 09:50


"Mogens Hansen" <mogens_h@dk-online.dk> wrote
>
> Skriv enten
> i = spillerliste.erase(i);

Strengt tager er det ikke tilstrækkeligt - løkken skal også laves om til
noget i retningen af


void afmeldSpiller(Spiller *p_spiller) {
for(vector<Spiller*>::iterator i=spillerliste.begin(); i
!=spillerliste.end() ;) {
if((*i)->getNr() = = p_spiller->getNr())
i = spillerliste.erase(i);
else
++i;
}
}


Venlig hilsen

Mogens Hansen



Anders Melchiorsen (30-11-2001)
Kommentar
Fra : Anders Melchiorsen


Dato : 30-11-01 22:04

"Mogens Hansen" <mogens_h@dk-online.dk> skrev den 28-Nov-01:

> for(vector<Spiller*>::iterator i=spillerliste.begin(); i

Er det på nogen måde muligt at skrive noget lignende
spillerliste.iterator i stedet for vector<Spiller*>::iterator? I
værste fald vha. g++ extensions?

Problemet opstår naturligvis når jeg erkender, at spillerliste kun
behøvede være en list<Spiller*>, og så skal til at ændre iteratorer i
en masse anvendelser.


> i = spillerliste.erase(i);

Nu ligger min Bjarnebog ikke her, men kan det passe, at ovenstående
egenskab (returværdien) ved erase() ikke er nævnt i den? Nej, vel? Jeg
mener bare at have ledt efter det uden at finde det.

--
Regards, Anders

....if a Microsoft product fails, who do you sue?

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste