Problem mit basic_string vector!!! HILFE!



  • Ok hast Recht.
    Aber das hier:

    void* getText() 
    { 
        if(gText == (void*)NULL) return (char*)""; 
        return gText; 
    }
    

    müsste doch Schwierigkeiten machen wenn gText NULL ist. Immerhin gibt er hier einen Pointer auf ein lokales konstantes Stringliteral zurück. Oder wird bei einem Leerstring ein NULL-Pointer übergeben?


  • Mod

    Braunstein schrieb:

    Ok hast Recht.
    Aber das hier:

    void* getText() 
    { 
        if(gText == (void*)NULL) return (char*)""; 
        return gText; 
    }
    

    müsste doch Schwierigkeiten machen wenn gText NULL ist. Immerhin gibt er hier einen Pointer auf ein lokales konstantes Stringliteral zurück. Oder wird bei einem Leerstring ein NULL-Pointer übergeben?

    stringliterale existieren auch nach dem verlassen einer funktion. das verursacht hier also keine probleme.



  • Hallo!

    Hmmm ich bin dem Problem etwas näher gekommen: Es sieht so aus, als ob der String-Vector ganz einfach sich Speicher reserviert, der schon einem anderen Pointer "gehört". Ich weis auch nicht WIE der da hinkommt, nur steht bei mir in einem völlig anderem char-Pointer (nich im obigen Beispiel erkennbar!) auf einmal genau 600 Byte aus dem Text (3560 Byte insgesamt, es werden aber nur 2960 Byte verwendet, der Rest steht auf einmal da wo er nicht stehen soll!!!).

    Dazu sei noch zu sagen, dass ich genau 3560 + 1 Byte zuvor für diesen Text reserviere, und in dann mit strcpy() in den Speicher reinschreibe...

    Ich verwende zur Allokierung immer malloc(). Liegt's vielleicht daran?
    Und wenn ich versuche, meine "myOtherFunc()" als static void* zu deklarieren, meckern mein Compiler rum, er würde die Funktion nirgendwo finden. 😕 Warscheinlich weil sie dann static ist.

    Aber das kann's ja auch nicht sein.

    Gruss,
    cp



  • ssm schrieb:

    string gText;
    
    void letText(const std::string &text) 
    { 
    	gText = text;
    } 
    
    const string &getTextValue() 
    { 
    	return gText; 
    }
    

    Was bezweckt denn das genau??
    Weil der C++Builder bisher nie gemecker hat. Brauche ich evtl auch dieses "namespace std;" ??

    Aber ich denke mal nicht das es daran liegen wird.

    Gruss,
    ~code_pilot 😞



  • code_pilot schrieb:

    Was bezweckt denn das genau??
    Weil der C++Builder bisher nie gemecker hat. Brauche ich evtl auch dieses "namespace std;" ??

    [cpp]

    **#include <string>

    using std::string;**

    string gText;

    void letText(const string &text)
    {
    gText = text;
    }

    const string &getTextValue()
    {
    return gText;
    } [/cpp]



  • jo wie gesagt: Es bringt nix 😡 😡 😡 😡.



  • code_pilot schrieb:

    jo wie gesagt: Es bringt nix 😡 😡 😡 😡.

    😮

    Fehler?


  • Mod

    hast du schon mal versucht, die exception abzufangen, um herauszubekommen, worum es sich handelt? durch einsatz eines debuggers kommt man dem problem in der regel auch auf die spur, wenn es reproduzierbar ist.



  • wenn du auf C++ schreiben will, wieso nicht einfach so:

    #include <string>
    #include <iostream>
    #include <fstream>
    
    std::string gText; 
    
    void letText(const std::string &text) 
    { 
    	gText = text;
    } 
    
    const std::string &getTextValue() 
    { 
    	return gText;
    } 
    
    int main(int argc, char* argv[]) 
    { 
    
    	std::ifstream is("absturz.txt");
    	std::string line;
    	while(is && std::getline(is, line))
    	{		
    		letText(line);
    		std::cout << getTextValue();
    		//getch(); 
    	}	
    }
    

    für CBuilder gibt's eigentlich ein anderes Forum



  • camper schrieb:

    hast du schon mal versucht, die exception abzufangen, um herauszubekommen, worum es sich handelt? durch einsatz eines debuggers kommt man dem problem in der regel auch auf die spur, wenn es reproduzierbar ist.

    @camper: Jaha und das hab ich doch auch schon oben beschrieben: Es wird einfach ein Speicherbereich überschrieben der eigentlich gar nicht überschrieben werden darf!!!! Siehe oben, die Sache mit den 600 Bytes.

    @ssm: Jaha, ein C++ Builder Forum für VCL, mein Programm hat aber mit VCL gar nichts am Hut. :p



  • WOFF!!

    Nach 1 Monat intensiver Programmierung und Debugging (ich habe mein komplettes Prog jetzt als reines C-Programm OHNE string-Objekte re-implementiert) bin ich diesem blöden Fehler jetzt endlich auf die Schliche gekommen: Man allokiere einen Speicherbereich von der Größe einer Datei, mappe diese Datei da rein, und schreibe an das Ende des Speicherbereichs PLUS 1 noch einen Nullterminierer! Voila, schon hat man das perfekte Speicherleck, das irgendwann zahlreiche Operationen, allokationen etc. später zu einem Lesefehler führt! Nur weil meine doofe Einleseschleife nicht korrekt war, habe ich jetzt meine halbe Software neu geschrieben!

    Naja, was solls, jetzt ist sie auf jedenfall auch performanter ;).

    Grüsse,
    code_pilot


Anmelden zum Antworten