Wert der Variable ändert sich unerwartet.
-
doch möchte ich. Und würde mich sehr darüber freuen!
void fkt_1_(Fl_Widget*w,void*userdata) { static const char* buffer; ... buffer = fkt_2_(2, "list", button5->label(), 0); cout << "return von fkt_2_. buffer: "<< buffer << endl; fkt_3_( buffer ) ... } const char* fkt_2_(int mode, const char* listname, const char* elemname, int elemnum) { unsigned int i; int elemcount = 0; static const char* result; string buffer; vector< std::string > lines; ... //mode = 2 : hole die id des Elems (anhand des Namens) if(mode == 2) { buffer = elemname; for(i=0; i < lines.size(); i++) { if(lines[i].find(buffer, 0) != -1) { buffer = lines[i]; buffer = buffer.substr( buffer.find("$", 0)+1, buffer.length()-buffer.find("$", 0)-1); result = buffer.c_str(); goto outhere2; } } } outhere2: return result; //bis hier hin ist alles ok } void fkt_3_( const char* id ) { ... if(id != NULL) std::cout<< "##01## id: "<< id <<std::endl; else std::cout<<"id ist NULL"<< std::endl; ... }
-
const char* fkt_2_(int mode, const char* listname, const char* elemname, int elemnum) { ... string buffer; ... result = buffer.c_str(); ... return result;
-
Ich habe Dir mal ein paar Kommentarein Deinen Code geschreiben.
const char* fkt_2_(int mode, const char* listname, const char* elemname, int elemnum) { unsigned int i; int elemcount = 0; static const char* result; // das ist nur ein Zeiger, der irgendwohin zeigen soll, da steht kein! eigener Speicherplatz dahinter! string buffer; vector< std::string > lines; ... //mode = 2 : hole die id des Elems (anhand des Namens) if(mode == 2) { buffer = elemname; for(i=0; i < lines.size(); i++) { if(lines[i].find(buffer, 0) != -1) { buffer = lines[i]; buffer = buffer.substr( buffer.find("$", 0)+1, buffer.length()-buffer.find("$", 0)-1); result = buffer.c_str(); // Ok, der Zeiger zeigt auf die Zeichenkette in buffer goto outhere2; // Wozu hier goto?, hat aber nichts mit Deinem Problem zu tun. } } } outhere2: return result; //bis hier hin ist alles ok } //und ab hier gibt es buffer nicht mehr, result zeigt also ab jetzt in irgend einen undefinierten Speicherbereich
-
Danke. Und was wäre die geschickteste Problemlösung?
-
Das goto habe ich eingebaut, damit die Schleife sofort beendet wird, wenn das elem gefunden wurde, um das Programm etwas schneller zu machen

-
cpp_anfaenger schrieb:
Danke. Und was wäre die geschickteste Problemlösung?
fkt_2_ könnte einen std::string zurückgeben.
cpp_anfaenger schrieb:
Das goto habe ich eingebaut, damit die Schleife sofort beendet wird, wenn das elem gefunden wurde, um das Programm etwas schneller zu machen

-
Einfach std::string statt const char* verwenden. Dann kanst du einfach
return buffer;schreiben und std::string kümmert sich automatisch darum, wenn die Zeichenkette kopiert werden muss. Und was spricht gegen ein
return result; // bzw. buffer;anstelle des goto ?
-
das goto habe ich jetzt durch dein return ersetzt

Beim Kompilieren erhalte ich mit string oder std::string einen Fehler.
prog.h:34: Fehler: »String« bezeichnet keinen Typ
prog.h:34: Fehler: »string« in Namensbereich »std« bezeichnet keinen Typprog.h:
string getElemFromList(int mode, const char* listname, const char* elemname, int elemnum);
-
Hast du den header <string> inkludiert?
-
ok Kompilieren geht nun.
-
herzlichen Dank an alle Helfer!
