C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Iterator in for- oder while-Schleife

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Andreas Dunke
Guest





PostPosted: Thu Mar 23, 2006 10:06 am    Post subject: Iterator in for- oder while-Schleife Reply with quote



Hallo allerseits!

Folgendes sei gegeben:

class Camera
{
bool m_used;
...
public:
bool isUsed() const
{
return m_used;
}
};

class Test
{
std::vector< Camera > m_vecCamera;

public:
Test()
{}

~Test()
{
removeUsedCameras();
}

private:
removeUsedCameras();
}

Jetzt mein Problem:
Unten stehen zwei Implementierungen von removeUsedCameras().
Ich hätte gedacht, dass sie von der Funktion her identisch sind. Aber
dem ist wohl nicht so.
Wenn m_vecCamera keine Einträge hat, dann läuft die for()-Schleife
trotzdem an und stürzt beim if() dann ab. Warum ist das so?
Anscheinend habe ich ein Grundlagenproblem (dachte darüber wäre ich
schon Jahre hinaus...).


// Funkioniert
void removeUsedCameras()
{
std::vector< Camera >::const_iterator iter = m_vecCamera.begin();
while( iter != m_vecCamera.end() )
{
if( iter->isUsed() )
{
...
}
++iter;
}
}


// Funktioniert nicht (Absturtz)
void removeUsedCameras()
{
for( std::vector< Camera >::const_iterator iter=m_vecCamera.begin();
iter != m_vecCamera.end(); ++iter)
{
if( iter->isUsed() )
{
...
}
}
}

Andreas




--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Torsten Robitzki
Guest





PostPosted: Thu Mar 23, 2006 5:06 pm    Post subject: Re: Iterator in for- oder while-Schleife Reply with quote



Andreas Dunke wrote:

Quote:
Hallo allerseits!

Hallo Andreas,

Quote:
// Funkioniert
void removeUsedCameras()
{
std::vector< Camera >::const_iterator iter = m_vecCamera.begin();
while( iter != m_vecCamera.end() )
{
if( iter->isUsed() )
{
...
}
++iter;
}
}


// Funktioniert nicht (Absturtz)
void removeUsedCameras()
{
for( std::vector< Camera >::const_iterator iter=m_vecCamera.begin();
iter != m_vecCamera.end(); ++iter)
{
if( iter->isUsed() )
{
...
}
}
}

ich wette mal, das der wesentliche Unterschied bzw. der Grund für den
Absturz im "..." liegt. Löschst Du da Elemente aus dem Vector? Beim
Löschen mit anschließendem Inkrementieren des Iterators überspringst Du
eine Element und das ist spätestens am Ende des vectors 'ungünstig'.

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Andreas Dunke
Guest





PostPosted: Fri Mar 24, 2006 7:06 am    Post subject: Re: Iterator in for- oder while-Schleife Reply with quote



Torsten Robitzki schrieb:
Quote:
Andreas Dunke wrote:

// Funkioniert
void removeUsedCameras()
{
std::vector< Camera >::const_iterator iter = m_vecCamera.begin();
while( iter != m_vecCamera.end() )
{
if( iter->isUsed() )
{
...
}
++iter;
}
}


// Funktioniert nicht (Absturtz)
void removeUsedCameras()
{
for( std::vector< Camera >::const_iterator iter=m_vecCamera.begin();
iter != m_vecCamera.end(); ++iter)
{
if( iter->isUsed() )
{
...
}
}
}


ich wette mal, das der wesentliche Unterschied bzw. der Grund für den
Absturz im "..." liegt. Löschst Du da Elemente aus dem Vector? Beim
Löschen mit anschließendem Inkrementieren des Iterators überspringst Du
eine Element und das ist spätestens am Ende des vectors 'ungünstig'.

Nein, in vector< Camera > wird nichts gelöscht. Das wäre ja zu einfach. Smile

Der Absturtz erfolgt beim iter->isUsed(). Was aber auch logisch ist,
weil er ja da gar nicht hinkommen dürfte, wenn der vector leer ist.

Andreas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Richard
Guest





PostPosted: Sat Mar 25, 2006 6:06 am    Post subject: Re: Iterator in for- oder while-Schleife Reply with quote

Andreas Dunke wrote:
Quote:
Hallo allerseits!

Folgendes sei gegeben:

class Camera
{
bool m_used;
...
public:
bool isUsed() const
{
return m_used;
}
};

class Test
{
std::vector< Camera > m_vecCamera;

public:
Test()
{}

~Test()
{
removeUsedCameras();
}

private:
removeUsedCameras();
}

Jetzt mein Problem:
Unten stehen zwei Implementierungen von removeUsedCameras().
Ich hätte gedacht, dass sie von der Funktion her identisch sind. Aber
dem ist wohl nicht so.
Wenn m_vecCamera keine Einträge hat, dann läuft die for()-Schleife
trotzdem an und stürzt beim if() dann ab. Warum ist das so?
Anscheinend habe ich ein Grundlagenproblem (dachte darüber wäre ich
schon Jahre hinaus...).


// Funkioniert
void removeUsedCameras()
{
std::vector< Camera >::const_iterator iter = m_vecCamera.begin();
while( iter != m_vecCamera.end() )
{
if( iter->isUsed() )
{
...
}
++iter;
}
}


// Funktioniert nicht (Absturtz)
void removeUsedCameras()
{
for( std::vector< Camera >::const_iterator iter=m_vecCamera.begin();
iter != m_vecCamera.end(); ++iter)
{
if( iter->isUsed() )
{
...
}
}
}

Andreas

Ich bin ja auch noch ein C++ Anfänger, aber vielleicht sehe ich den
Fehler daher:-)

Oben schreibst du zuerst if( iter->isUsed() ) und inkrementierst danach
(iter) ++iter.
Unten wird ja ++iter schon erhöht und du checkst erst danach:
if( iter->isUsed() ), also bist du schon am Ende vorbei.




Quote:





--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Jakob Bieling
Guest





PostPosted: Sun Mar 26, 2006 1:06 am    Post subject: Re: Iterator in for- oder while-Schleife Reply with quote

Andreas Dunke <NO_SPAM_adunke (AT) maku (DOT) de> wrote:

Quote:
// Funkioniert
void removeUsedCameras()
{
std::vector< Camera >::const_iterator iter = m_vecCamera.begin();
while( iter != m_vecCamera.end() )
{
if( iter->isUsed() )
{
...
}
++iter;
}
}


// Funktioniert nicht (Absturtz)
void removeUsedCameras()
{
for( std::vector< Camera >::const_iterator iter=m_vecCamera.begin();
iter != m_vecCamera.end(); ++iter)
{
if( iter->isUsed() )
{
...
}
}
}

Die beiden Funktionen sind semantisch identisch. Am besten is, du
erstellst ein minimales aber kompilierbares (also keine "...") Programm,
wo der Fehler auftritt. Vielleicht findest du beim Erstellen dieses
Programms ja schon den Fehler.

hth
--
jb

(reply address in rot13, unscramble first)


--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Sun Mar 26, 2006 12:06 pm    Post subject: Re: Iterator in for- oder while-Schleife Reply with quote

Jakob Bieling wrote:

Quote:
Andreas Dunke <NO_SPAM_adunke (AT) maku (DOT) de> wrote:

// Funkioniert
void removeUsedCameras()
{
std::vector< Camera >::const_iterator iter = m_vecCamera.begin();
while( iter != m_vecCamera.end() )
{
if( iter->isUsed() )
{
...
}
++iter;
}
}


// Funktioniert nicht (Absturtz)
void removeUsedCameras()
{
for( std::vector< Camera >::const_iterator iter=m_vecCamera.begin();
iter != m_vecCamera.end(); ++iter)
{
if( iter->isUsed() )
{
...
}
}
}

Die beiden Funktionen sind semantisch identisch. Am besten is, du
erstellst ein minimales aber kompilierbares (also keine "...") Programm,
wo der Fehler auftritt. Vielleicht findest du beim Erstellen dieses
Programms ja schon den Fehler.

Es ist meistens einfacher, es umgekehrt zu machen. Also das vorhandene
Programm solange zu reduzieren, bis man entweder den Fehler gefunden hat
oder das Programm kurz genug ist, um es hier zu posten.
Wenn man ein neues Programm schreibt, kann es durchaus sein, daß man es
nicht hinbekommt, daß dieses Programm denselben Fehler enthält.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Jakob Bieling
Guest





PostPosted: Sun Mar 26, 2006 1:06 pm    Post subject: Re: Iterator in for- oder while-Schleife Reply with quote

Rolf Magnus <ramagnus@t-online.de> wrote:

Quote:
Jakob Bieling wrote:

Die beiden Funktionen sind semantisch identisch. Am besten is, du
erstellst ein minimales aber kompilierbares (also keine "...")
Programm, wo der Fehler auftritt. Vielleicht findest du beim
Erstellen dieses Programms ja schon den Fehler.

Es ist meistens einfacher, es umgekehrt zu machen. Also das vorhandene
Programm solange zu reduzieren, bis man entweder den Fehler gefunden
hat oder das Programm kurz genug ist, um es hier zu posten.

Richtig, ich war da wohl etwas undeutlich. Wichtig fand ich nur,
dass mans dann wirklich kompilieren und den Fehler nachvollziehen kann.
Auf dem "Papier" ist sowas ja schwerer zu sehen, als dann im Debugger.

regards
--
jb

(reply address in rot13, unscramble first)


--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Tibor Pausz
Guest





PostPosted: Mon Mar 27, 2006 6:06 pm    Post subject: Re: Iterator in for- oder while-Schleife Reply with quote

Andreas Dunke <NO_SPAM_adunke (AT) maku (DOT) de> wrote:

Quote:
// Funkioniert
void removeUsedCameras()
{
std::vector< Camera >::const_iterator iter = m_vecCamera.begin();
while( iter != m_vecCamera.end() )
{
if( iter->isUsed() )
{
...
}
^^^^^^^^
++iter;
^^^^^^^^

Wenn Du löschst darfst Du den Iterator nicht mehr benutzen, er ist
ungültig, da das Element auf das er verwiesen hat nicht mehr existiert.
Wahrscheinlich werden hier Elemente übersprungen und es knallt dann
später beim Zugriff.
Quote:
}
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.