Seite 1 von 1

INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 2:06 pm
von naums
Ich hab letztens mal wieder an meinem INIMaker rumgebastelt und folgender Code lässt sich zwar kompilieren, aber auszuführen geht der Code nicht.

Der Code:

Code: Alles auswählen

   
    string data[20][50];
    int a = 1; int b=1;
    while (b<21)
    {
        while (a<51)
        {
            char p[data[b][a].length()];
            int i;
            for(i = 0; i < data[b][a].length(); i++)
            {
                p[i] = data[b][a][i];
            }
            p[i++] = '\0';

            char bufferA[4];
            char bufferB[4];
            sprintf(bufferA, "%d", a);
            sprintf(bufferB, "%d", b);
            if (data[b][a]!="")
               WritePrivateProfileString(bufferB,bufferA, p, FilePath);
            a++;
        }
        b++;
        a=1;
    }
Bis b=18 funktioniert alles einwandfrei, nur bei b=19 und a =50 geschiet der Fehler. Windows gibt eine Fehlermeldung aus, die soviel besagt, dass INIMaker nicht mehr funktioniert ... und beendet werden muss. Wenn ich while(b<19) einsetze läuft alles einwandfrei durch. Auch wenn die gesamt b=19 a=X leer ist (und dann somit das Schreiben übersprungen wird) geschiet der Fehler.
Kann mir wer sagen, so ich den, warscheinlich ziemlich dummen Fehler gemacht habe? Ich kompiliere unter Windows 7 64Bit mit GCC.

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 2:19 pm
von nufan
naums hat geschrieben:

Code: Alles auswählen

    string data[20][50];
    int a = 1; int b=1;
    while (b<21)
    {
        while (a<51)
Deine Indizes des Arrays stimmen nicht, die fangen nämlich bei 0 an. Das letzte Element ist in diesem fall data[19][49], du versuchst aber auf data[20][50] zuzugreifen, was natürlich zu einem Absturz führt.
naums hat geschrieben:

Code: Alles auswählen

char p[data[b][a].length()];
Du reservierst nicht genug Speicher. length () zählt das '\0' nämlich nicht mit.
naums hat geschrieben:

Code: Alles auswählen

p[i++] = '\0';
Wozu das ++ gut sein soll ist mir schleierhaft.
naums hat geschrieben:

Code: Alles auswählen

if (data[b][a]!="")
Auf was versuchst du hier zu vergleichen? '\0'?

Das ist mir mal auf den ersten Blick aufgefallen. Weiters würden deinem Code ein paar Kommentare nicht schaden. Vor allem wenn du willst, dass ihn sich weiterhin jemand ansieht.

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 2:42 pm
von naums
jaaaa, Kommentare sind sicherlich gut, wa ^^.

okay... hab jetzt data[21][51] und es geht... komisch dass das programm aber bis b=19 durchgelaufen ist... hm.

und das

Code: Alles auswählen

if (data[b][a]!="")
soll prüfen, ob in data[a] überhaupt was drin steht, wenn da nämlich "" (also nichts) steht dann würde in die INI folgendes geschrieben werden:

Code: Alles auswählen

[1]
1=
2= 
3=
...
und das wäre sinnlose Verschwendung von Speicherplatz und würde der Überschaubarkeit der Datei nicht unbedingt helfen.

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 2:47 pm
von nufan
naums hat geschrieben:okay... hab jetzt data[21][51] und es geht... komisch dass das programm aber bis b=19 durchgelaufen ist... hm.
Was ist daran komisch? Wenn du data[20] hast ist das letzte gültige Element data[19].
naums hat geschrieben:und das

Code: Alles auswählen

if (data[b][a]!="")
soll prüfen, ob in data[a] überhaupt was drin steht, wenn da nämlich "" (also nichts) steht dann würde in die INI folgendes geschrieben werden:

Code: Alles auswählen

[1]
1=
2= 
3=
...
und das wäre sinnlose Verschwendung von Speicherplatz und würde der Überschaubarkeit der Datei nicht unbedingt helfen.
Leserlicher wären vielleicht

Code: Alles auswählen

if (data[b][a].empty ())
oder

Code: Alles auswählen

if (data[b][a].length () == 0)

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 3:53 pm
von naums
gutgut, übernehme ich gleich. hab allerdings noch ein prob mit INIs:

Code: Alles auswählen

    int position;               //bestimmt die Position, an der sich das Programm befindet. (zb: 350=Hauptmenue)
    DWORD destsize =100;         
    CHAR* license;                    //In die Variable soll der Wert eingetragen werden
    GetPrivateProfileString("INIMaker", "License", "NULL", license, destsize, "settings.ini");   //Aus der nicht vorhandenen Datei settings.ini lesen
    std::string version="0.9 Beta";        //Version
    int letter;                                       //Bestimmt ob der Lizenz schon einmal zugestimmt worden ist.
    if (license=="NULL")
    {
        letter=1;                                    //=Lizenz nicht gesehen.
    }
    else letter=0;                                 //=Lizenz gesehen.

    if (letter==1)
    {
        std::cout << "Dieses Programm wurde von Stefan Naumann erstellt." <<                          //Lizenz
        std::endl << "Es wird ihnen unter den Bedinungen der " <<                                              //For use under General Public License
        std::endl << "GNU General Public License zu Verfuegung gestellt." <<
        std::endl << "Es bestehen keine Garantieleistungen, Copyright: Stefan Naumann"<<
        std::endl << "Die Lizenz liegt als Textdatei 'LIZENZ.TXT' bei." <<
        std::endl << "Programmversion: " << version <<
        std::endl;

        position = 0;
    }
    else if (letter==0)
    {
       position=1;
    }
So. Jetzt müsste ja eigentlich der Wert der Variable license = "NULL" sein oder? Der gesamte Text, auch position 0 wird übersprungen, und das programm springt direkt zu Position 1.... Wo ist da mein Denkfehler.

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 3:59 pm
von Bebu

Code: Alles auswählen

   CHAR* license;                    //In die Variable soll der Wert eingetragen werden
    GetPrivateProfileString("INIMaker", "License", "NULL", license, destsize, "settings.ini");   //Aus der nicht vorhandenen Datei settings.ini lesen
  
was passiert in GetPrivateProfileString? Wird dort license ein Wert zugewiesen?

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 4:01 pm
von naums
laut dem hier sollte License ein Wert zu gewiesen werden: http://www.tsql.de/c_plus_plus/cpp_ini_lesen

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 4:12 pm
von Bebu
versuch doch einmal zu überprüfen welcher Wert tatsächlich in der Variable steht. Außerdem iritiert mich dein Kommentar in der Zeile. Wie kann man aus einer nicht vorhandenen Datei lesen und hoffen sinnvolle Werte zu erhalten?

Ein verwirrter Bebu

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 4:17 pm
von cloidnerux

Code: Alles auswählen

CHAR* license;
Hast du ein Typedef oder Define für CHAR? Normalerwiese heißt das char und wenn du unter C++ arbeitest, solltest du string nehmen.

Code: Alles auswählen

 if (license=="NULL")
license ist ein C-String, soweit ich wieß kann man die nicht mit == auf Inhalt prüfen, das müsstest du dann so machen:

Code: Alles auswählen

if(strcmp(license, "NULL") == 0)

Re: INI - Fehler beim Schreiben

Verfasst: So Feb 28, 2010 4:29 pm
von naums
naja, die "NULL" müsste ja der Standartwert sein, wenn der Eintrag net existiert...

okay... jetzt gehts, weiß zwar nicht wo die settings.ini hingeschrieben wird, weil ich die nirgendwo finde, aber.... es geht. ^^.