Wert der Variable ändert sich unerwartet.
-
Du willst also, dass wir raten.
Okay, ich tippe darauf, dass es um mehr als nur
const char*geht und ein Objekt beim Verlassen des Scopes ungültig wird.Spekuliert auch mit! Wer dem Problem am nähesten kommt, gewinnt!

-
laut Debugger ist alles gut.
Nur dann an bei der Übergabe an fkt_2 hat Y plötzlich einen anderen Wert.
Ich habe keine Ahnung warum.Bin am überlegen eine globale static Variable anzulegen.
Aber ne globale Variable wäre sehr unschön.
-
Es kann zu viele Gründe haben, daß eine Chance bestünde, den richtigen zu erraten, fürchte ich.
Zum Beispielint main( ) { const char* x; char* foo[10]; x = fkt_1(); foo[10]="bar";//patsch fkt_2(x); return 0; }
-
Poste doch wenigstens einen Teil, sonst müssen wir ewig weiterraten...
-
x = fkt_1();
fkt_2(x);hier muss das Problem liegen.
y enthält nicht "xyz"
-
cpp_anfaenger schrieb:
x = fkt_1();
fkt_2(x);hier muss das Problem liegen.
y enthält nicht "xyz"Poste mehr Code und du postest noch weniger...
Versuch es in deinem Kontext so weit zu reduzieren, dass der Fehler noch auftritt, aber dann hast du das Problem wohl eh schon gefunden.Alternativ bau das obere Programm, das ja funktioniert, Stück für Stück so weit aus, bis der Fehler auftritt.
Die Fehlerursachen können so weit gefächert sein, dass man nicht mal mit Raten ansatweise eine Chance hat, den Fehler zu finden.
Wenn dein Programm soooo viel komplexer ist (was ich irgendwie bezweifle) dann pack es in ein zip und lad es irgendwo hoch. Aber eigentlich sollte das die letzte Alternative sein...
-
Ich wette damit geht's
const char* fkt_1() { char* test = malloc(256* sizeof(char)); strcpy(test, "xyz"); return test; }Oder damit
char* fkt_1() { static char* test = "xyz"; return test; }
-
leider nicht.
Das Problem mit dem gesamten Code ist, dass da Webservice-Anfragen mit dabei sind und qt.
-
-
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!
