Verhalten bei indexierung von Array



  • Ich habe mir einen Array angelegt der 6 Häfen speichern soll. Da am Anfang ein Hafen als Anfangshafen gesetzt werden soll benutze ich srand und rand um durch Zufall einen Index zu bekommen.

    Komischerweise will der Compiler bei der deklarierung, dass ich einen festen Index von 6 setze. Obwohl eigentlich 5 ausreichen müssten, da der Index bei 0 anfängt. Komischerweise fängt der Index bei mir, bei der Deklaration, aber bei 1 an. Hier mal kurz mein Code.

    m_HarbourList = new std::string[6] { "Hamburg", "Los Angeles", "New York", "Antwerpen", "Dubai", "Singapur" };
    m_Harbour = Util::chance(0, 6);
    
    std::string Player::getHarbour() const
    {
            return m_HarbourList[m_Harbour];
    }
    

    So liefert er mir auf jedenfall jeden Hafen zurück, dass funktioniert ja auch. Nur ich würde gerne verstehen wieso der Compiler meckert wenn ich new std::string[5] schreibe. Es sieht für mich so aus als das er mit dem Index 1 anfängt. Sowas ist mir eigentlich noch nicht untergekommen und widerspricht allem was ich bisher über Arrays gelesen habe.

    Kann mir das jemand erklären?


  • Mod

    Indizes und Anzahlen sind zwei verschiedene Konzepte. Ein Feld mit einer Anzahl von 6 Einträgen (bei der Definition angegeben) hat Indizes von 0 bis 5 (jeweils einschließlich).



  • Ich würde jetzt mal vermuten, dass Util::chance(0, 6) auch eine 6 liefern kann. Das wäre falsch, da du nur 6 Häfen hast.



  • manni66 schrieb:

    Ich würde jetzt mal vermuten, dass Util::chance(0, 6) auch eine 6 liefern kann. Das wäre falsch, da du nur 6 Häfen hast.

    im Gegenteil, das Programm verhält sich komischerweise richtig, ohne Fehler. Es werden mir alle 6 Häfen zurückgegeben. Chance liefert mir eine Zahl zwischen 1-6. Kann also auch 1 oder 6 sein, aber nie 0.

    Deswegen habe ich ja gefragt warum das so ist. Verstehen tuh ich es immer noch nicht ganz, aber bin jetzt auf vector umgestiegen.



  • Bennisen schrieb:

    manni66 schrieb:

    Ich würde jetzt mal vermuten, dass Util::chance(0, 6) auch eine 6 liefern kann. Das wäre falsch, da du nur 6 Häfen hast.

    im Gegenteil, das Programm verhält sich komischerweise richtig, ohne Fehler.

    Das kann bei undefiniertem Verhalten so sein. Irgemdwann fliegt es dir halt um die Ohren.

    Bennisen schrieb:

    Es werden mir alle 6 Häfen zurückgegeben.

    Dann werden die Indizes 0 bis 5 verwendet.

    Bennisen schrieb:

    Chance liefert mir eine Zahl zwischen 1-6. Kann also auch 1 oder 6 sein, aber nie 0.

    Wenn das wirklich so sein sollte, ist die Funktion ziemlich beschissen definiert. Unabhängig davon: der Index 6 ist ungültig.

    Bennisen schrieb:

    aber bin jetzt auf vector umgestiegen.

    Ein Vector verhält sich in der Hinsicht genau so, d.h. der Index 6 ist ungültig.



  • m_HarbourList = new std::string[6] { "Hamburg", "Los Angeles", "New York", "Antwerpen", "Dubai", "Singapur" };
    

    new std::string[6] <= gibt es da heute in C++ nicht andere Lösungen 😕

    Irgend wie denke ich, dein Quelltext ist sehr eigenwillig oder kreativ? 😮



  • Bei der Definition des Arrays ist die in eckigen Klammern angegebene Anzahl [6] die Anzahl der gewünschten Elemente, die Zählung erfolgt dabei wie gewohnt.

    Die Indizierung (also das Zugreifen) beginnt bei 0. Somit kannst du auf 6 Elemente zugreifen, die erlaubten Indizes sind aus der Menge {0, 1, 2, 3, 4, 5}.

    Dass das bei-0-zählen-anfangen nicht immer intuitiv ist zeigt sich auch in den vielen Programmfehlern/Sicherheitslücken, welche durch off-by-1 Fehlern entstanden sind.



  • Bennisen schrieb:

    im Gegenteil, das Programm verhält sich komischerweise richtig, ohne Fehler. Es werden mir alle 6 Häfen zurückgegeben. Chance liefert mir eine Zahl zwischen 1-6. Kann also auch 1 oder 6 sein, aber nie 0.

    Glaub ich nicht.
    Lass dir die Zahlen die du von Util::chance(0, 6) bekommst mal ausgeben.
    Die werden 0...5 sein.
    Was auch vernünftig wäre.
    Bzw. eine der beiden vernünftigen Varianten.
    Die 2. vernünftige Variante wäre dass Zahlen 0...6 zurückkommen.

    Und 1...6 wäre so beknackt dass ich dir - wie ich ja schon geschrieben habe - einfach nicht glaube dass es so ist.



  • naja dann muss irgendwas meinen verstand getrübt haben. dann hatte ich wohl doch recht, dass das nicht sein kann. aber mittlerweile habe ich sowieso ein paar dinge geändert (optimiert).


Log in to reply