Speicherüberschreibung?


  • Administrator

    Nukularfüsiker schrieb:

    2. Zeile 20: Bist du sicher, dass dort auch wirklich immer mind. 5 Elemente im Vektor stehen?

    Witzig, habe ihn schon im letzten Thread darauf hingewiesen 🙂
    Ich füge noch ein 3. dazu:
    Der Speicherfehler muss nicht in der Funktion LoadLanguage geschehen, er kann irgendwo im Programm auftauchen. Das ist ja auch das heimtückische an solchen Fehlern.
    Ich würde mich allerdings aktuell mal auf den Bereich vor LoadLanguage und darin beschränken. Also fehlt noch einiges an Code, welchen du uns noch nicht gezeigt hast: Tokenize und den Bereich vor LoadLanguage .

    Grüssli



  • Hallo

    Ja, es sind immer 5 Elemente im Vektor, bzw. sollten drin sein. 😉

    Tokeinze:

    VOID Tokenize(const string& str, vector<string>& tokens, const string& delimiters)
    {
        // Skip delimiters at beginning.
        string::size_type lastPos = str.find_first_not_of(delimiters, 0);
        // Find first "non-delimiter".
        string::size_type pos     = str.find_first_of(delimiters, lastPos);
    	int i = 0;
    
        while (string::npos != pos || string::npos != lastPos)
        {
            // Found a token, add it to the vector.
    		//cout << str << endl;
    		//cout << str.substr(lastPos, pos - lastPos) << endl;
            tokens.push_back(str.substr(lastPos, pos - lastPos));
    		//cout << tokens[i++] << endl;
            // Skip delimiters.  Note the "not_of"
            lastPos = str.find_first_not_of(delimiters, pos);
            // Find next "non-delimiter"
            pos = str.find_first_of(delimiters, lastPos);
        }
    }
    

    Vor LoadLanguage() ist ansich nichts interessantens ausser dem Auslesen ob der Prozess läuft und das Auslesen des Language Pfades.

    Vielleicht ein Entscheidender "Hinweis".
    Alle strings im Vektor bestehen immer nur aus einem Wort.
    Ausser der eine String, bei dem es crasht. - Dieser bestehst aus 3 Wörtern.

    Gruss,
    fiorn



  • Lass dir mal im Debugger oder per cout nach der Funktion Tokenize() die Größe des Vektors Token ausgeben, nur um sicherzugehen.

    Nebenbei, arbeitet dein Programm in einem Thread oder mehreren?



  • Hallo,

    Token.size() beträgt nach jedem 'Tokenize()' 5.
    Mein Programm arbeitet in nur einem Thread.

    Das Problem mit dem debuggen ist, dass dieses Programm dann auf einer VMWare getestet werden muss, und da kein VS installiert ist.

    Gruss,
    fiorn



  • Hau doch erst mal in LoadLanguage all das raus, was du bis dahin eh nicht brauchst und guck, was passiert - dann noch nen paar Debug-Ausgaben mehr und dann weist du zumindest schon mal ohne Debugger halbwegs, wo es crasht...

    An dem cout an sich sieht aber auch noch bissl was komisch aus:
    "\ t"
    Ich weiß nicht, was der Compiler bei einer ungültigen Escape-Sequenz machen darf und was nicht, aber ich würd das Leerzeichen zwischen '\' und 't' auf jeden Fall wegmachen

    Auch wenn du dir sicher bist, dass immer 5 Elemente in dem vector sind, kannst du ja mal das hier aus der Schleife machen:

    for(vector<string>::const_iterator i(Token.begin()), e(Token.end()); i != e; ++i)
      std::cout << "\t [" << *i << ']' << std::endl;
    

    bb



  • Hi unskilled,

    Ja, es sind tatsächlich immer 5 Einträge im Vector 'Titel' vorhanden.
    Aber ich wundere mich immernoch, warum dass das Programm nur dann crasht, wenn in dem Begriff mehr als 1 Wort (sprich es beinhaltet Leerzeichen) vorhanden sind.

    Ich habe mich nun an einem kleinen Workaround versucht und anstatt der copy() Methode ein einfaches push_back gemacht:

    for each(string s in vData[outerloop])
    				{
    					Titel.push_back(s);
    					cout << s << endl;
    				}
    

    In der eigentlichen Methode werden die Daten dem Vektor auch erfolgreich hinzugefügt.
    Rufe ich den Inhalt jedoch in der Main-Methode ab, so ist der Inhalt von "Titel" leer. - Und das obwohl Titel global ist.

    Wo liegt mein Denkfehler?

    Gruss,
    fiorn



  • Zeig doch mal bisschen Code

    Zumindest die deklaration, initialisierung und die fkt., die schreibend darauf zugreift und die, die lesend darauf zugreift.

    bitte poste nicht wieder 50zeilige Funktionen, wenn es auch 10 tun, weil die anderen Zeilen unbedeutend für dieses Problem sind.

    Wieso machst du das kopieren so kompliziert?
    Titel = vData[outerLoop];
    wäre wohl zu übersichtlich?

    Sicher, dass das TestHandle-Zeugs alles richtig läuft?

    Und wenns das nicht war und das nächste mal nicht deutlich mehr debug-Ausgaben in deinem Code zu sehen sind und du auch die Ausgabe des Programms mitpostet, hab ich die Lust dann ganz verloren... (die erwartete / erhoffte Ausgabe natürlich auch mit)

    bb



  • Hallo,

    Also, ich habe das ganze nun so umgebaut dass nur noch ein einziger Vektor benötigt wird, dieser jedoch einfach global ausserhalb des main deklariert wird.
    Dazu noch einen Integer der mir dann die richtige Zeile der Sprachdatei angibt

    vector<vector<string>> vData;
    int DataIndex;
    

    Der Anfang des Programmes ist für euch wohl eher unwichtig.
    Es wird nur der Pfad der Sprachdatei gesucht und darauf gewartet dass ein bestimmter Prozess läuft:

    string sExePath = argv[0];
    	int Idx = sExePath.find_last_of("\\");
    	string sLanguagePath = sExePath.substr(0, Idx);
    	sLanguagePath.append("\\language.txt");
    
    	while (!ProcessIsRunning()){
    		printf(".");
    		Sleep(SLEEPTIME_LOOP);
    	}
    

    Danach wird dem DataIndex die gewünschte Spalte zurückgegeben mittels der Funktion "LoadLanguage(string)":

    DataIndex = LoadLanguage(sLanguagePath);
    

    Die Funktion kennt ihr ja bereits bestens. 🙂
    Die Funktion liest einfach alle Begriffe in einer Textdatei aus (pro Zeile 5 Begriffe - alle ausser dem Problembegriff bestehen aus EINEM Wort - , getrennt mit Semikolon.
    Danach läuft das Programm in einer Schleife alle Wörter durch und schaut, mittels welchem Wort man ein gültiges WindowHandle bekommt -> Diese Zeile ist dann die benutzte Sprache im Programm.

    /* Das einlesen der Datei habe ich jetzt nicht drin -> funktioniert fehlerfrei und ist oben bereits drin */
    	for(int outerloop=0;outerloop<vData.size();outerloop++)
    	{
    		if (TestHandle!=NULL)
    			break;
    
    		for(int innerloop=0;innerloop<vData[outerloop].size();innerloop++)
    		{
    			// Get the Window Handle
    			TestHandle = FindWindow(NULL, (LPCSTR)vData[outerloop][innerloop].c_str());
    			cout << vData[outerloop][innerloop] << endl;
    			cout << TestHandle << endl;
    			if (TestHandle != NULL)
    			{
    				// Gives the Index back, where the valid language is stored.
    				return outerloop;
    			}
    		}
    	}
    

    Mittels dem Index des VektorArrays kann mit dem Programm nun immer bestimmt werden, auf welcher "Seite" sich das externe Programm befindet (da jede "Seite" einen anderen Titel hat).

    So, das ganze funktioniert auch 1A nur bei dem einen Begriff, welcher aus 3 Wörtern besteht: "Interventi di servizio").

    Ich hoffe das sind vorerst mal genug detailierte Informationen. 😉

    Gruss,
    fiorn



  • Hallo,

    weiss niemand Rat?



  • unskilled schrieb:

    Und wenns das nicht war und das nächste mal nicht deutlich mehr debug-Ausgaben in deinem Code zu sehen sind und du auch die Ausgabe des Programms mitpostet, hab ich die Lust dann ganz verloren... (die erwartete / erhoffte Ausgabe natürlich auch mit)


Anmelden zum Antworten