basic_string-Problem



  • Hallo,

    ich schreibe gerade ein Programm, dass C++-Code so umformt, dass er richtig in einem Browser dargestellt wird. Außerdem wird Syntax Coloring unterstützt. Die Unterstützung von Kommentaren soll noch folgen.

    Nun zu meinem Problem:
    Ich bekomme einen Runtime-Error, wenn ich das Programm ausführe. Durch den Debugger habe ich festgestellt, dass in der zweitletzten Zeile (also in der return-Zeile von main()) der Fehler auftritt. Während die Fehlermeldung in der Konsole nutzlos ist, kommt folgende Meldung im Debug-Modus:

    Unbehandelte Ausnahme in coloring.exe: 0xC0000005: Access Violation.
    

    Diese Meldung öffnet die Include-Datei XSTRING und markiert Zeile 590. Diese befindet sich in der Klasse basic_string und in der Funktion void _Tidy(bool _Built=false).

    Weil der Fehler erst zum Schluss auftritt, denke ich, dass es ein Problem mit dem Destruktor von basic_string ist.

    Hier ist mein Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include "umlaute.h"
    using namespace std;
    
    string ConvertSymbols(string lines)
    {
    	int i=0;
    	string searched[4]={"<", ">", "\n", "\t"};
    	string replaceWith[4]={"&lt;", "&gt;", "<br />\n", "&nbsp;&nbsp;&nbsp;&nbsp;"};
    
    	for(int x=0; x<4; ++x)
    	{
    		i=lines.find(searched[x], 0);
    		while(i!=-1)
    		{
    			lines.replace(i, 1, replaceWith[x]);
    			i=lines.find(searched[x], i+replaceWith[x].length());
    		}
    	}
    	return lines;
    }
    
    string transform(ifstream key, string code)
    {
    	code=ConvertSymbols(code);
    
    	char buffer[101];
    	int i=0;
    	key.getline(buffer, 100);
    	string help;
    	while(!key.eof())
    	{
    		help=buffer;
    
    		while(code.find(help+" ", i)!=-1)
    		{
    			code.insert(code.find(help, i), "<span class=\"key\">");
    			code.insert(code.find(help, i)+help.length(), "</span>");
    			i=code.find(help+" ", i+19+help.length());
    		}
    
    		key.getline(buffer, 100);
    		i=0;
    	}
    	code.insert(0, "<p class=\"code\">");
    	code+="</p>";
    	return code;
    }
    
    string ReadFile(ifstream in)
    {
    	char buffer[101];
    	string lines="";
    	do
    	{
    		in.getline(buffer, 100);
    		lines+=buffer;
    		lines+='\n';
    	}
    	while(!in.eof());
    	return lines;
    }
    
    int main()
    {
    	cout << "Bitte geben Sie einen Dateinamen ein: " << flush;
    	string datei;
    	cin >> datei;
    	ifstream in(datei.c_str());
    	if(!in.good())
    	{
    		cerr << datei << " konnte nicht ge" << oe << "ffnet werden!";
    		return -1;
    	}
    	ifstream key("C:\\keys.txt");
    	if(!key.good())
    	{
    		cerr << "C:\\keys.txt konnte nicht ge" << oe << "ffnet werden!";
    		return -1;
    	}
    	ofstream out("C:\\result.txt");
    	if(!out.good())
    	{
    		cerr << "C:\\result.txt konnte nicht ge" << oe << "ffnet werden!";
    		return -1;
    	}
    	out << transform(key, ReadFile(in));
    	return 0;
    }
    

    Wie werde ich diesen Fehler los?

    Ich danke für jede Hilfe.



  • Bist du sicher, dass Du in allen drei Methoden alle Parameter nicht als Referenz oder Zeiger sondern per Wert übergeben möchtest?



  • CME386 schrieb:

    ...                                                                          
    cerr << datei << " konnte nicht ge" << oe << "ffnet werden!";  // was ist oe?
    ...
    

    Mich wundert es, dass er das so erkennt.
    Oder ist "oe" in umlaute.h definiert?



  • @ChrissiB: oe ist in Umlaut.h definiert.

    @desert pinguin: Ob ich die Parameter jetzt per call by value oder per call by reference übergebe und als Rückgabewert dann void angebe, macht in diesem Fall eigentlich keinen Unterschied.
    Wieso hast du dich eigentlich desert pinguin genannt?



  • CME386 schrieb:

    @desert pinguin: Ob ich die Parameter jetzt per call by value oder per call by reference übergebe und als Rückgabewert dann void angebe, macht in diesem Fall eigentlich keinen Unterschied.
    Wieso hast du dich eigentlich desert pinguin genannt?

    Eines von beiden: Entweder geht es um einen Fehler oder der ist ein Deutscher.
    Übrigens: I habe das Beispiel nur mit MinGW ausprobiert. Es compiliert sich nicht ("oe" habe ich natürlich losgeworden), weil es einige Probleme mit ios_base Kontruktoren gibt. Dann habe Ich ifstream durch ifstream& ersetzt und das Beispiel zum fehlerfrein Laufen gekriegt.



  • Es lag tatsächlich daran, dass ich nicht call by reference übergeben habe. Danke für deine Hilfe.

    Aber das hier musst du mir noch erklären:

    desert pinguin schrieb:

    Eines von beiden: Entweder geht es um einen Fehler oder der ist ein Deutscher.

    Was willst du mir damit sagen?



  • Guten Tag,

    [EDIT]Wegeditierter Schwachsinn, ist heute nicht mein Tag 🙄 [/EDIT]

    MfG Max



  • CME386 schrieb:

    Es lag tatsächlich daran, dass ich nicht call by reference übergeben habe. Danke für deine Hilfe.

    Aber das hier musst du mir noch erklären:

    desert pinguin schrieb:

    Eines von beiden: Entweder geht es um einen Fehler oder der ist ein Deutscher.

    Was willst du mir damit sagen?

    [EDIT]Mit "der" habe Ich natürlich "desert pinguin" gemeint.[/EDIT]
    Das war meine Antwort auf von dir gestellte Frage.

    CME386 schrieb:

    Wieso hast du dich eigentlich desert pinguin genannt

    weil eng. Penguin auf deut. Pinguin heisst.
    Du hast ja mir auf diesen Fehler hingewiesen. Oder?


Anmelden zum Antworten