Problem mit WritePrivateProfileString



  • Hallo zusammen,
    ich schreibe mir zur Zeit einen kleinen Rechner um festzuhalten wieviele Urlaubstage ich noch habe (ja nicht besonders nützlich, aber es geht um den Lerneffekt).
    Dabei verwende ich "WritePrivateProfileString" und "GetPrivateProfileString".

    Wenn ich das Programm starte kommt allerdings direkt eine Meldung von Windows dass das Programm ein Problem verursacht hat und beendet werden muss.
    Der Compiler liefert keine Fehlermeldung.

    Hier mal der Code:

    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    int main()
    {
    	int tage, frei;
    	string eingabe;
    	char *grund;
    	DWORD size;
    	size = 5;
    	tage = 28;
    
    	//GetPrivateProfileString("Urlaub","Tage","NULL",tage,size,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	WritePrivateProfileString("Urlaub","Tage",(char*)tage,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	cout << "[-----Urlaubstagerechner-----]" << endl << endl;
    	cout << "Restliche Urlaubstage: " << tage << endl;
    	cout << "zu buchende Urlaubstage: ";
    	cin >> frei;
    	tage = tage-frei;
    	WritePrivateProfileString("Urlaub","Tage",(char*)tage,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	cout << "\nGrund: ";
    	cin >> eingabe;
    	strcpy(grund, eingabe.c_str());
    	WritePrivateProfileString("Urlaub","Grund",grund,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	return 0;
    }
    

    Zur Info: ich verwende Code::Blocks und den GNU GCC Compiler

    Ich hoffe mir kann jemand weiterhelfen 🙂



  • (char*)tage
    Nen Cast reicht da nicht, du musst schon die Zahl in eine Zeichenkette konvertieren. (w)sprintf() oder itoa() oder sowas.

    strcpy(grund, eingabe.c_str());
    grund ist nur ein Zeiger, der momentan irgendwohin zeigt!
    Du solltest dafür sorgen der der grund-Zeiger auch auf von dir reservierten Speicher zeigt. (malloc() z.B.)



  • Ich denke itoa() habe ich nun richtig verwendet.
    Allerdings macht malloc() Probleme.
    Dass es speicherplatz reserviert habe ich verstanden aber wie man die Funktion genau verwenden muss weiß ich nicht.

    Das ganze sieht jetzt folgendermaßen aus:

    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    int main()
    {
    	int i, j;
    	//string eingabe;
    	char *grund, *tage, *frei;
    	grund = (char *) malloc(1000);
    	//DWORD size;
    	//size = 5;
    	i = 28;
    
    	//GetPrivateProfileString("Urlaub","Tage","NULL",tage,size,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	WritePrivateProfileString("Urlaub","Tage",itoa(i, tage, 2),"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	cout << "[-----Urlaubstagerechner-----]" << endl << endl;
    	cout << "Restliche Urlaubstage: " << i << endl;
    	cout << "zu buchende Urlaubstage: ";
    	cin >> j;
    	i = i-j;
    	WritePrivateProfileString("Urlaub","Tage",itoa(i, tage, 2),"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	cout << "\nGrund: ";
    	cin >> grund;
    	//strcpy(grund, eingabe.c_str());
    	WritePrivateProfileString("Urlaub","Grund",grund,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\setting.ini");
    
    	return 0;
    }
    

    Der Fehler den ich schon oben beschrieben habe taucht immer noch auf.
    Leider verstehe ich auch nicht warum WritePrivateProfileString() überhaupt const char* erwartet und nicht einfach einen String.



  • http://www.cprogramming.com/tutorial/c/lesson6.html

    Als 3. Parameter willst du vermutlich statt 2 eher 10 angeben.
    Mit "tage" bekommst du dasselbe Problem wie bei grund 😉
    Du sagst itoa() quasi als 2. Parameter wohin er die Zeichenkette im Speicher platzieren darf.
    Für tage hast du allerdings keinen Speicher reserviert und zeigt noch irgendwohin.

    malloc() hast du quasi richtig verwendet. Du hast 1000 Bytes Speicher reserviert und grund zeigt jetzt auf den reservierten Speicher statt irgendwohin.
    Wenn du den Speicher nicht mehr brauchst einfach mittels free() wieder freigeben.

    WritePrivateProfileString() und GetPrivateProfileString() sind beides WinAPI-Funktionen, WinAPI ist allerdings in C. Daher will es char* 😉

    Du scheinst eher C++ als C zu nutzen:
    Statt malloc()/free() kannst du auch new/delete benutzen:
    http://tutorial.schornboeck.net/dyn_speicher.htm

    Wenn die Größe ohnehin feststeht auch einfach:
    char grund[1000];
    ...und du kannst dir Speicherreservierung sparen (da es für dich erledigt wird).



  • Danke erstmal für deine Hilfe.
    Mit new und delete komm ich wesentlich besser klar 🙂

    Jetzt funktioniert soweit alles.



  • Ich werde den Thread hier einfach mal für ein weiteres Problem von mir bei diesem Programm nutzen.

    Folgendermaßen sieht es mittlerweile aus:

    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    int main()
    {
    	int i, j;
    	string eingabe;
    	char *grund, *tage;
        tage = new char[10];
    
        GetPrivateProfileString("Urlaub","Tage","NULL",itoa(i, tage, 10),10,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\settings.ini");
    
        if (tage == "NULL")
            i = 28;
    
    	WritePrivateProfileString("Urlaub","Tage",itoa(i, tage, 10),"E:\\Coding\\C++ Projects\\Urlaubsrechner\\settings.ini");
    
    	cout << "\n[-----Urlaubstagerechner-----]\n" << endl;
    	cout << "Restliche Urlaubstage: " << i << endl;
    	cout << "zu buchende Urlaubstage: ";
    	cin >> j;
    
    	while (i<j) {
    	    cout << "Nicht mehr genug Urlaubstage!\n";
    	    cout << "zu buchende Urlaubstage: ";
    	    cin >> j;
    	}
    
        i = i-j;
        WritePrivateProfileString("Urlaub","Tage",itoa(i, tage, 10),"E:\\Coding\\C++ Projects\\Urlaubsrechner\\settings.ini");
    
    	cout << "\nGrund: ";
    	cin >> eingabe;
    	grund = new char[sizeof(eingabe)];
        strcpy(grund, eingabe.c_str());
    
    	WritePrivateProfileString("Urlaub","Grund",grund,"E:\\Coding\\C++ Projects\\Urlaubsrechner\\settings.ini");
    
        delete tage;
        delete grund;
    
    	return 0;
    }
    

    Ich hätte gern nur einen Teil hier rein kopiert aber da ich keine Ahnung habe wo der Fehler liegt musste es alles sein.

    Wenn ich das Programm starte gibt er mir von vorneherein vor, dass ich noch 8 Urlaubstage habe, auch wenn ich die .ini-Datei lösche und komplett neu anlegen lasse.
    Kann mir jemand sagen woran das liegt?


Log in to reply