Funktion mit Parameter (char* S) mit std::string aufrufen
-
Ganz streng genommen (C++98): Nein. Aber das ist so, wie sich auf ASCII oder IEEE 754 zu verlassen: Streng genommen muss es nicht gelten, aber es wird auf allen normalen Systemen funktionieren.
Ganz streng genommen (C++11): Ja, das ist in Ordnung.
Werner Salomon schrieb:
Zumal wird der String vorher und nachher 'offiziell' leer sein - man käme also gar nicht so einfach an die Zeichen ran.
Er hat resize benutzt, nicht reserve. Oder ist das eines der edits gewesen und es war vorher anders?
-
Alternative (falls C++11 verfügbar):
// Funktion liefert einen 10 Zeichen langen String in Value zurück. std::size_t Get(char* Value) { } int main(int argc, char** argv) { std::unique_ptr< char[] > s( new char[11] ); // erfordert #include <memory> Get( s.get() ); }Gruß
Werner
-
Werner Salomon schrieb:
Bitte ein Bit schrieb:
Kann man das ohne Problem so aufrufen ?
Nein - es ist nicht garantiert, dass innerhalb von string die Zeichen in einem fortlaufenden Stück Speicher stehen. Zumal wird der String vorher und nachher 'offiziell' leer sein - man käme also gar nicht so einfach an die Zeichen ran.
Doch.
-
Oder ist das eines der edits gewesen und es war vorher anders?
Nö, ich habe nichts am Quellcode geändert.
------
Ich denke ich werde es auf die altbekannte Art und Weise umschreiben, da ich jetzt nicht sicher bin ob man es machen kann oder nicht.
Ganz streng genommen (C++11): Ja, das ist in Ordnung.
Der Teufel steckt auch hier im Detail, da ja unterschiedliche Compiler C++11 unterschiedlich implementiert haben.
-
Bitte ein Bit schrieb:
Ganz streng genommen (C++11): Ja, das ist in Ordnung.
Der Teufel steckt auch hier im Detail, da ja unterschiedliche Compiler C++11 unterschiedlich implementiert haben.
Nein, das war auch in C++98 praktisch schon so, mit C++11 ist es nur offiziell geworden, weil man gemerkt hat, dass man den Standard auch so interpretieren könnte, dass es nicht gilt. Jede vernünftige Implementierung macht das so.
Das ist so wie die Klugscheißer, die festgestellt haben, dass ein vector laut altem Standard auch rückwärts im Speicher stehen könnte. Das hat zwar keine Implementierung gemacht, aber in C++11 hat man es trotzdem nochmal klargestellt.
-
Das ist so wie die Klugscheißer, die festgestellt haben, dass ein vector laut altem Standard auch rückwärts im Speicher stehen könnte. Das hat zwar keine Implementierung gemacht, aber in C++11 hat man es trotzdem nochmal klargestellt.
Eine etwas harte Ausdrucksweise.
Für Leute wie mich, die relativ nach an der Grenze zur Verifikation entwickeln, sind solche Ungereimtheiten nicht anwendbar.
-
Bitte ein Bit schrieb:
Das ist so wie die Klugscheißer, die festgestellt haben, dass ein vector laut altem Standard auch rückwärts im Speicher stehen könnte. Das hat zwar keine Implementierung gemacht, aber in C++11 hat man es trotzdem nochmal klargestellt.
Eine etwas harte Ausdrucksweise.
Für Leute wie mich, die relativ nach an der Grenze zur Verifikation entwickeln, sind solche Ungereimtheiten nicht anwendbar.
Du benutzt wirklich nie, dass Vectorspeicher vorwärts angeordnet ist?
Mein Respekt vor so viel Disziplin.
-
Du benutzt wirklich nie, dass Vectorspeicher vorwärts angeordnet ist?
Mein Respekt vor so viel Disziplin.
Wo steht das, das ein std::string ein Vectorspeicher ist ???
-

Wo steht das, das ein std::string linear angeordnet ?
Das ist doch mein Problem, das ich in der Doku nicht gefunden habe das std::string linear angeordnet sind.
-
SeppJ schrieb:
Das ist so wie die Klugscheißer, die festgestellt haben, dass ein vector laut altem Standard auch rückwärts im Speicher stehen könnte.
Bitte was? Das würde sich aber mit 23.4.2 "Class template vector" Paragraph 1 beißen:
[...] The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size()
(C++03)
-
krümelkacker schrieb:
(C++03)
Sag bloß, du wusstest nicht, dass es diesen Satz in C++98 noch nicht gab?
-
Bitte ein Bit schrieb:
Wo steht das, das ein std::string linear angeordnet?
Im C++11 Standard steht das (21.4.1/5) hier:
The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s, the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 <= n < s.size().
-
Bashar schrieb:
krümelkacker schrieb:
(C++03)
Sag bloß, du wusstest nicht, dass es diesen Satz in C++98 noch nicht gab?
Ist mir tatsächlich neu, dass das, was ich aus C++03 zitierte, nicht in C++98 stehen soll.