Problem mit stringstream und const char*
-
Hallo,
ich möchte gerne alle 100ms ein Label aktualisieren. Es gehört zu einem Objekt vom Typ Fl_Box und wurde mit FLTK erzeugt. Ich programmiere unter Ubuntu 10 mit einer virtuellen Maschine. Ist alles nicht so wichtig glaub ich...
// Update the lower left info frame's contents. static stringstream ssWorldState; static char buf[1024]; ssWorldState.str(""); ssWorldState.clear(); updateWorldState(); // Lock our WorldState instance while we update the GUI. lockWorldState(); // Three digites printed after decimal point ssWorldState << std::fixed << std::setprecision(3); // ... // Bischen was in den stream geben // ... // Put string with type const char* into the infoFrameL->label // DAS HIER FUNKTIONIERT sprintf(buf,ssWorldState.str().c_str()); infoFrameL->label(buf); // DAS HIER FUNKTIONIERT NICHT //infoFrameL->label(ssWorldState.str().c_str()); // ... unlockWorldState();
Alternativ muss der StringStream für die funktionierende Methode nicht static sein, aber bevor jemand meckert
Warum funktioniert das hier nicht??
infoFrameL->label(ssWorldState.str().c_str());Ich packe doch das gleiche in "buf" rein! Das Label erwartet einen const char*. Bei der nicht funktionierenden Methode steht sich ständig ändernder Müll in dem Label, wenn ich mit "buf" arbeite bleibt es Zeile für Zeile schön.
Schöne Grüße
-
Was heißt hier "funktioniert nicht"?
-
Wenn ich das benutze wo steht: "DAS HIER FUNKTIONIERT NICHT" erhalte ich alle 100ms neue Hieroglyphen und in meinem Label steht nur unsinniger Müll.
-
Funktioniert es so:
std::string str = ssWorldState.str(); infoFrameL->label(str.c_str());
-
anjohn schrieb:
Wenn ich das benutze wo steht: "DAS HIER FUNKTIONIERT NICHT" erhalte ich alle 100ms neue Hieroglyphen und in meinem Label steht nur unsinniger Müll.
Dann wird deine Funktion wohl keine Kopie von der Zeichenkette machen, sondern auf dem temporären Objekt weiterarbeiten, welches du übergeben hast. Und dieses existiert aber nach Ende des Funktionsaufrufes nicht mehr. Das ist durchaus ein gängiges Problem, wenn man C-Schnittstellen mit massiven Nebeneffekten mit C++-Konzepten mischt.
So wirklich etwas dagegen tun kann man jedoch nicht. Da muss man entweder durch oder sich einen Wrapper suchen/schreiben.
-
Danke erst mal, das hier funktioniert, wenn str als static deklariert ist:
manni66 schrieb:
Funktioniert es so:
std::string str = ssWorldState.str(); infoFrameL->label(str.c_str());
Ist wohl echt so ein internes Problem. Wollte nur das char buf[1024] nicht haben, mit dem String kann ich mich jetzt anfreunden.
-
Eine bessere Lösung wäre es wohl, wenn du Label()-Funktion auch mit std::string arbeitet anstatt sich auf char-Arrays zu verlassen.
-
FLTK kopiert das den Labeltext nicht wenn Du's nicht extra sagst. Und c_str() erzeugt nur einen temporären String.
Schreib einfach:
infoFrameL->copy_label(str.c_str());