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;
    
    	...
    }
    

  • Mod

    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 🙂

    😕 http://www.cppreference.com/wiki/keywords/break 🙄



  • 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 Typ

    prog.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!


Anmelden zum Antworten