Variables Array



  • hab ich gemacht:

    int abzaehlen(int Anz,int Silb)
    {
            bool* person = new bool[Anz+1];
            int uebrig;
            int position;
    
            for(int i=0;i < Anz;i++)
            {
                    *(person+i)= false;
            };
    
            uebrig = Anz;
    
            do
            {
                    position+= Silb;
    
                    if(*(person+position))
                    {
                            *(person+position) = false;
                            uebrig--;
                    }
                    else if(!*(person+position))
                    {
                            position++;
                            *(person+position) = false;
                            uebrig--;
                    };
            }while(uebrig != 0);
    
            delete[] person;
    }
    

    und gez kommt immer ne Zugriffsverletzung!!!



  • Ach ja die Zugriffsverletzung wird von

    delete[] person;
    

    ausgelöst!



  • Ohje, eine uninitialisierte Variable 🙂

    Ich nehme an, du willst

    int position = 0; // wichtig!
    

    Außerdem kannst du ruhig wie bei normalen Arrays indizieren, also

    person[i] = false; // leserlich
    

    statt

    *(person+i) = false; // imho unleserlich
    

    gruß,
    walker



  • Sorry! Iss korrekt is mir auch grad aufgefallen!!! 😮 😮



  • gez hab ich eine beim beenden?!!!!



  • Hi,

    der Fehler ist, daß Du den Bereich deines Arrays nicht beachtest.

    1. Du initialisierst 'position' nicht. dort kann alles möglich drinstehen.

    2. Wenn Du Deine Funktion mit

    abzaehlen(8,6);
    

    aufrufst.
    erster Schleifendurchlauf wenn position durch zufall doch 0 ist:

    position += Silb;
    

    dann ist position 6 und person[6] gibts.
    da ist noch alles im grünen Bereich
    zweiter Durchlauf:

    position += Silb;
    

    danach ist position 12 und das macht bei einem Array mit 8 Elementen:

    PPP   EEEE N  N GGGG
    P  P  E    NN N G
    PPP   EEE  N NN G GG
    P     E    N NN G  G
    P     EEEE N  N GGGG
    

    (mein erstes ASCII-Art, Kritiken sind nicht gefragt 😃 😃 😃 😃 😃 )

    grüße Con@n



  • Hinweis am Rande:

    *(person+position) = false; 
    uebrig--;
    

    kannste aus dem if-Block nehmen, da es eh in if UND else ausgeführt wird - wäre übersichtlicher IMHO.



  • GoTo schrieb:

    Ach ja die Zugriffsverletzung wird von

    delete[] person;
    

    ausgelöst!

    Wie wird der Speicher korrekt freigegeben ?
    'delete person;' löscht ja nur das erste Element des char arrays. 😮



  • die Klammer [] nach delete löscht doch das ganze array!



  • Unter Windows gibt übrigens auch "delete person;" den Speicher des gesamten Arrays frei - was es allerdings nicht richtiger macht.

    edit
    Ich meinte damit zumindest VC++6 SP5... 🙄



  • Stimmt, der VC ist da nicht wirklich konsequent. Habe ich ganz früher auch nicht verstanden, was die eckigen Klammern da sollen wenn es auch ohne geht.


Anmelden zum Antworten