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 

Verhalten bei Dereferenzierung von Iteratoren in der STL def

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





PostPosted: Wed Mar 21, 2007 3:22 pm    Post subject: Verhalten bei Dereferenzierung von Iteratoren in der STL def Reply with quote



Hallo,

wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?

Grüße,
Rolf
Back to top
Marcel Müller
Guest





PostPosted: Wed Mar 21, 2007 4:18 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote



Hallo,

Rolf Bode-Meyer schrieb:
Quote:
wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?

es ist undefiniert. Ein nicht dereferenzierbarer Iterator darf eben
nicht dereferenziert werden.


Marcel
Back to top
Torsten Robitzki
Guest





PostPosted: Wed Mar 21, 2007 4:29 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote



Rolf Bode-Meyer wrote:

Quote:
Hallo,

wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?

Nicht definiert. Das sollte man tunlichst lassen.
Implementierungsabhängig würde bedeuten, das es sehr wohl definiert ist,
aber nicht im Standard sondern in der Dokumentation Deines Compilers.

mfg Torsten
Back to top
Olaf Krzikalla
Guest





PostPosted: Wed Mar 21, 2007 5:02 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

Hi,

Rolf Bode-Meyer wrote:
Quote:
wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht
Hinter dem Ende kann nicht sein. Nur auf dem Ende.


Quote:
und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?
Weder noch. Das Verhalten ist undefiniert. Implementierungsabhängig im

Sinne von "unspecified" oder "implementation-defined" hieße, dass jeder
Compilerhersteller das Verhalten des eigenen Compilers dokumentieren
muß. Das ist hier nicht der Fall. Nichtsdestotrotz _kann_ ein
Compilerhersteller das Verhalten definieren und dokumentieren.

Wichtig: ein C++-Stringobjekt hat nicht per default immer eine 0 am Ende
stehen (auch wenn es wohl keine Implementierung anders macht). Gefordert
wird die abschliessende 0 nur beim Aufruf von .c_str().


MfG
Olaf Krzikalla
Back to top
Thomas Maeder
Guest





PostPosted: Wed Mar 21, 2007 5:38 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

"Rolf Bode-Meyer" <robome (AT) gmail (DOT) com> writes:

Quote:
wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?

Nein.

Es ist undefiniert.
Back to top
James Kanze
Guest





PostPosted: Wed Mar 21, 2007 7:45 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

On Mar 21, 11:22 am, "Rolf Bode-Meyer" <rob...@gmail.com> wrote:

Quote:
wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?

Undefiniertes Verhalten. Man kann nichts darüber sagen.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Rolf Magnus
Guest





PostPosted: Thu Mar 22, 2007 5:18 am    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

Olaf Krzikalla wrote:

Quote:
Implementierungsabhängig im Sinne von "unspecified"
oder "implementation-defined" hieße, dass jeder Compilerhersteller das
Verhalten des eigenen Compilers dokumentieren muß.

"unspecified" muß nicht dokumentiert werden. Es muß nur konsistent sein.
Back to top
Rolf Bode-Meyer
Guest





PostPosted: Thu Mar 22, 2007 3:15 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

Herzlichen Dank Dir, Olaf, und allen anderen für eure Antworten.

Quote:
wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht
Hinter dem Ende kann nicht sein. Nur auf dem Ende.

Ich meinte sowas wie
x = s.end();
x++;
Ob der damit wirklich weitergesetzt wird oder nicht hatte ich gar
nicht überprüft. Könnte das nicht implementierungsabhängig sein?

Quote:
und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?
Weder noch. Das Verhalten ist undefiniert. Implementierungsabhängig im
Sinne von "unspecified" oder "implementation-defined" hieße, dass jeder
Compilerhersteller das Verhalten des eigenen Compilers dokumentieren
muß.

Den Unterschied kannte ich nicht. Nachdem ihn mir fast jeder genannte
hat, wäre das dann auch behoben. Was ich meinte war durchaus, daß es
böse und ein don't do ist.

Quote:
Wichtig: ein C++-Stringobjekt hat nicht per default immer eine 0 am Ende
stehen (auch wenn es wohl keine Implementierung anders macht). Gefordert
wird die abschliessende 0 nur beim Aufruf von .c_str().

Das ist klar. Nur hätte es ja sein können, daß trotzdem die Rückgabe
von 0 definiert ist, auch wenn es nicht im String steht.

Grüße,
Rolf
Back to top
James Kanze
Guest





PostPosted: Thu Mar 22, 2007 7:14 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

On Mar 22, 11:15 am, "Rolf Bode-Meyer" <rob...@gmail.com> wrote:
Quote:
Herzlichen Dank Dir, Olaf, und allen anderen für eure Antworten.

wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht
Hinter dem Ende kann nicht sein. Nur auf dem Ende.

Ich meinte sowas wie
x = s.end();
x++;
Ob der damit wirklich weitergesetzt wird oder nicht hatte ich gar
nicht überprüft. Könnte das nicht implementierungsabhängig sein?

Könnte, ist aber nicht. Das Incrementieren, wenn der Iterator am
Ende steht (oder das Decrementieren, wenn er am Anfang steht)
ist undefiniertes Verhalten. Wenn du glück hast, bekommst du
einen sofortigen Abstürtz des Programmes.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
James Kanze
Guest





PostPosted: Thu Mar 22, 2007 7:22 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

On Mar 22, 1:18 am, Rolf Magnus <ramag...@t-online.de> wrote:
Quote:
Olaf Krzikalla wrote:
Implementierungsabhängig im Sinne von "unspecified"
oder "implementation-defined" hieße, dass jeder Compilerhersteller das
Verhalten des eigenen Compilers dokumentieren muß.

"unspecified" muß nicht dokumentiert werden. Es muß nur konsistent sein.

Auch nicht. Es wird aber normallerweise nur eine beschrängte
Menge Möglichkeiten angeboten.

Z.B. ist es "unspecified", in welche Reihenfolge Parameter einer
Funktion berechnet wird, ist "unspecified"; bei »f(a()+b(),c())«
darf der Compiler in den Reihenfolgen a,b,c; a,c,b; b,a,c;
b,c,a; c,a,b oder c,b,a aufrufen. Er braucht sogar nicht dabei
konsistent zu sein; er kann unterschiedene Reihefolgen benutzt,
je nach dem. Er muss aber alle drei Funktionnen aufrufen (oder
mindestens so tun, als ob er alle drei aufgerufen hätte).

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Rolf Magnus
Guest





PostPosted: Thu Mar 22, 2007 7:40 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

Rolf Bode-Meyer wrote:

Quote:
Herzlichen Dank Dir, Olaf, und allen anderen für eure Antworten.

wenn ein Iterator eines C++-Stringobjekts auf oder hinter dem Ende
(end()) steht
Hinter dem Ende kann nicht sein. Nur auf dem Ende.

Ich meinte sowas wie
x = s.end();
x++;
Ob der damit wirklich weitergesetzt wird oder nicht hatte ich gar
nicht überprüft. Könnte das nicht implementierungsabhängig sein?

Es ist undefiniert. Man darf nur dereferenzierbare Iteratoren
inkrementieren. Da der von end() zurückgegebene Iterator nicht
dereferenzierbar ist, darf er also auch nicht inkrementiert werden.

Quote:
und dereferenziert wird, ist das Verhalten definiert
oder implementierungsabhängig?
Weder noch. Das Verhalten ist undefiniert. Implementierungsabhängig im
Sinne von "unspecified" oder "implementation-defined" hieße, dass jeder
Compilerhersteller das Verhalten des eigenen Compilers dokumentieren
muß.

Den Unterschied kannte ich nicht. Nachdem ihn mir fast jeder genannte
hat, wäre das dann auch behoben. Was ich meinte war durchaus, daß es
böse und ein don't do ist.

Es gibt hier drei Unterscheidungen:

Wenn etwas "implementation-defined" ist, legt die C++-Norm es nicht genau
fest. Es muß vom Compiler-Hersteller festgelet werden (in manchen Fällen
darf es frei gewählt werden, in anderen aus einer vorgegebenen Liste). Das
Verhalten muß nachvollziehbar und reproduzierbar sein, und die
Dokumentation des Compilers muß es beschreiben.

"unspecified" ist im Prinzip dasselbe, nur daß es nicht dokumentiert sein
muß.

"undefined" bedeutet, daß alles passieren kann. Das Verhalten muß nicht
dokumentiert und auch nicht reprozudierbar sein. Der Compiler-Hersteller
braucht also überhaupt nicht darüber nachzudenken, was in diesem Fall
passiert.
Back to top
Rolf Magnus
Guest





PostPosted: Thu Mar 22, 2007 10:32 pm    Post subject: Re: Verhalten bei Dereferenzierung von Iteratoren in der STL Reply with quote

James Kanze wrote:

Quote:
On Mar 22, 1:18 am, Rolf Magnus <ramag...@t-online.de> wrote:
Olaf Krzikalla wrote:
Implementierungsabhängig im Sinne von "unspecified"
oder "implementation-defined" hieße, dass jeder Compilerhersteller das
Verhalten des eigenen Compilers dokumentieren muß.

"unspecified" muß nicht dokumentiert werden. Es muß nur konsistent sein.

Auch nicht.

Zumindest ist "implementation-defined" und "unspecified" bis auf die
Vorgabe, daß ersteres dokumentiert sein muß, dasselbe. Abgesehen von diesem
Unterschied benutzen die Definitionen dieser beiden Begriffe sogar exakt
dieselben Worte.

Quote:
Es wird aber normallerweise nur eine beschrängte Menge Möglichkeiten
angeboten.

Z.B. ist es "unspecified", in welche Reihenfolge Parameter einer
Funktion berechnet wird, ist "unspecified"; bei »f(a()+b(),c())«
darf der Compiler in den Reihenfolgen a,b,c; a,c,b; b,a,c;
b,c,a; c,a,b oder c,b,a aufrufen. Er braucht sogar nicht dabei
konsistent zu sein; er kann unterschiedene Reihefolgen benutzt,
je nach dem. Er muss aber alle drei Funktionnen aufrufen (oder
mindestens so tun, als ob er alle drei aufgerufen hätte).

hmm, ok. Das leuchtet ein.
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.