Variable ändert sich selbstständig (?)



  • Hallo,

    ich hab ein kleines Problem mit folgendem Code:

    int area_width = 9, area_height = 9;
    int area[9][9];
    int x, y;
    
    for(x=0;x<=area_width;x++) {
    	for(y=0;y<=area_height;y++) {
    		area[x][y] = 0;
    	}
    }
    

    Wenn ich diesen Code ausführe, hat area_height am Ende der Schleife den Wert 0.

    Was ich bisher versucht habe:
    1. area_height als Konstante deklarieren, also const int area_height = 9; Ergebnis war ein Laufzeitfehler.
    2. area_height probeweise überall durch die Zahl 9 ersetzen. Seltsamerweise nahm dann area_width den Wert 0 an. area_width war vorher aber immer 9 geblieben.
    3. Sowohl area_width als auch area_height durch 9 ersetzen. Ergebnis wie bei 1.

    Wäre prima, wenn mir jemand helfen könnte. 🙂 Vielen Dank im Vorraus

    Gruß
    dread



  • Hehe, witziger Fehler 🙂

    Wenn du ein Array hast, das du mit int a[9] deklarierst, darfst du nur auf die Elemente a[0] bis [8] zugreifen. Da du auch auf das neunte zugreifst (wegen dem '<=' in der Schleifenbedingung), überschreibst du die anderen Variablen damit 😉



  • mach statt <= bitte < sonst hast beim letzten durchlauf, ein zugriff aufs nirvana, der rest klingt ein bisschen misteriös

    mfg spjoe



  • Jap es liegt daran das der Index eines Arrays bei 0 und nicht bei 1 Anfängt. Dadurch hast du außerhalb des reservierten Bereiches geschrieben ...

    const std::size_t area_width = 9, area_height = 9;
    int area[area_width][area_height];
    
    for (std::size_t x = 0; x < area_width; ++x)
        for (std::size_t y = 0; y < area_height; ++y)
            area[x][y] = 0;
    

    ...



  • Japp, das war der Fehler. 🙂
    Werds mir merken.
    (Das kommt davon, wenn man von Visual Basic kommt)



  • dread schrieb:

    ...Das kommt davon, wenn man von Visual Basic kommt...

    Aber ich glaube nicht, dass in VB ein Array mit 9 Elemente 10 Elemente hat .... 😉

    dread schrieb:

    ...

    int area_width = 9, ...
    int area[9][9];
    ...
    for(x=0;x<=area_width;...
    

    Gruß,

    Simon2.



  • Simon2 schrieb:

    dread schrieb:

    ...Das kommt davon, wenn man von Visual Basic kommt...

    Aber ich glaube nicht, dass in VB ein Array mit 9 Elemente 10 Elemente hat .... 😉

    Aber es ist schon irritierend: In VB gibt man bei der Initialisierung eines Arrays eben nicht die Größe eines Arrays sondern dessen höchsten Index (oder den niedrigsten und höchsten) an. Das heißt, folgende Initialisierung:

    Dim arr(10) As Integer
    

    … erstellt (per Default) in Wahrheit ein Array mit 11 Elementen.

    /EDIT: Und dadurch verwendet man in einer VB-Schleife eben doch eine *inklusive* obere Schranke, in C(++) hingegen eine exklusive.



  • Konrad Rudolph schrieb:

    ...folgende Initialisierung:

    Dim arr(10) As Integer
    

    … erstellt (per Default) in Wahrheit ein Array mit 11 Elementen.
    ...

    Aha ! Dann hatte ich doch Unrecht mit:

    Simon2 schrieb:

    ...
    Aber ich glaube nicht, dass in VB ein Array mit 9 Elemente 10 Elemente hat .... 😉

    denn ich konnte mir eigentlich nur die 2 Varianten vorstellen:
    - Entweder gibt man die Anzahl der Array-Alemente an (und die Schleife [0, 9] durchläuft halt 10 Elemente)
    - oder den höchsten Index und zählt ab 1.

    Auf die Idee "Höchster Index UND ab 0 zählen" bin ich gar nicht gekommen.

    OK - wieder was gelernt. 😃

    Gruß,

    Simon2.


Anmelden zum Antworten