Wie einen char* richtig returnen?
-
Hm... Da muss ich erstma überlegen, wie ich das in meinem fall anwenden soll, aber trotzdem danke, werde mal in der dokumentation n bisschen blättern

-
Nur dass Du Dich nicht zu Tode blätterst: Ich kann schonmal vorwegnehmen, dass auto_ptr nicht für Arrays (und damit auch nicht für C-Strings) geeignet ist.
-

-
eine andere relativ gute möglichkeit, wie ich finde ist noch diese:
char* ToString(int nummer, char* buffer) { sprintf(buffer, "%d", nummer); return buffer; }So musst du zwar trotzdem einen Buffer erstellen, allerdings kannst du die Funktion trotzdem direkt in Ausdrücken verwenden. Programmiert sich um einiges leichter.
-
jojo, hab ich natürlich gemacht, erspart echt ne menge schreibarbeit

-
LordJaxom schrieb:
Entweder der C++-Weg:
string toString() { ostringstream ss; ss << "Values: a=" << a << ...; return ss.str(); }da wird aber der ganze string kopiert
-
Jaja, und allokiert, und....
Bleibt aber trotzdem der sauberste C++-Weg

Vom nötigen Aufwand her ähnlich und trotzdem sicher wäre wohl in diesem Fall nur ein boost::shared_array oder ein noch zu entwerfender auto_array, was wohl (gerade für den OP) etwas Overkill wäre.
-
Habe jetzt eine recht komfortable und für mich durchaus akzeptable(was die fehleranfälligkeit angeht) lösung gefunden. Die lautet: singelton klasse, die für alle toString()-methode bereitstellenden objekte erreichbar ist, und einen ziemlich großen char-buffer verwaltet, und dafür sorgt, dass die einzelnen funktionen sich nicht in die quere kommen(solang's nicht zu viele sind).
Klappt ganz gut, das lass ich auch so, ausser ihr erklärt mir, warum man sowas nicht machen darf/warum es keine elegante lösung ist

thx @ all für die vielen ideen

-
Singleton-Klasse?
Versteh ich in dem Zusammenhang absolut nicht...
Ganz schlechte Lösung...
-
und einen ziemlich großen char-buffer verwaltet, und dafür sorgt, dass die einzelnen funktionen sich nicht in die quere kommen(solang's nicht zu viele sind).
AUA aua aua aua autsch weh.
Das nicht gut.
Auf der einen Seite kannst du zwar nix garantieren ("solang's nicht zu viele sind"), auf der anderen Seite versuchst dus trotzdem. Das kann nicht gut gehen. Das üble daran ist dass du so von Anfang an einen Fehler in dein Programm reinprogrammierst, und noch übler wird es durch die Tatsache dass "solang's nicht zu viele sind" alles zu funktionieren scheint. Wenns dann aber "zuviele sind" wird es boom machen. Und ob das in einer Art und Weise passiert dass du sofort draufkommst woran es liegt ist fraglich.Anders ausgedrückt: die Fehleranfälligkeit ist nicht akzeptabel solange sie nicht 0 ist.
-
so, bevor ich hier komplett zur sau gemacht werde
, zeig ich ma lieber, was ich da eigentlich gemacht habe:#include "UC_Singleton.hpp" #define MAX_BUFFER_LENGTH 5120 class UC_StringBuffer:public UC_Singleton<UC_StringBuffer> { private: //char-buffer char buffer[MAX_BUFFER_LENGTH]; //offset to an empty segment int emptySegmentOffset; public: //constructor destructor UC_StringBuffer(){ emptySegmentOffset=0; } ~UC_StringBuffer(){} char* GetBuffer(int bufferLength){ //required buffer is too long if(bufferLength>MAX_BUFFER_LENGTH){ //not enough space, returning nullpointer return NULL; } //pointer to a free(?) segment of the buffer char* pFreeSegment; if(emptySegmentOffset+bufferLength>MAX_BUFFER_LENGTH){ //overwrite the start of the buffer pFreeSegment=&buffer[0]; //update the emptySegmentOffset-offset emptySegmentOffset=bufferLength; }else{ //append the segment pFreeSegment=&buffer[emptySegmentOffset]; //update the emptySegmentOffset-offset emptySegmentOffset+=bufferLength; } return pFreeSegment; } };und jezt zu den genannten problemen:
Wenns dann aber "zuviele sind" wird es boom machen.
Eben nicht! zwar wird der buffer vollgemüllt, aber es kommt nicht zum absturz

Und ob das in einer Art und Weise passiert dass du sofort draufkommst woran es liegt ist fraglich.
Ich finde, es ist eigentlich einfacher, nur in dieser einen funktion nach fehlern zu suchen. Ansonsten müsste ich ja vor jedem aufruf der toString() funktion einen buffer anlegen, wo die funktion dann was reinschreiben kann. Wäre ein buffer nicht groß genug, würde alles abstürzen, und ich müsste den ganzen code nach diesem buffer absuchen.

die Fehleranfälligkeit ist nicht akzeptabel solange sie nicht 0 ist.
c++ programme sind doch immer bei char-arrays fehleranfällig, wenn man zu wenig speicherplatz reserviert, dann krachts halt... :p Soll ich jetzt deswegen auf java umsteigen?

aber danke schön schonma für die konstruktive kritik
