Länge eines Arrays



  • Hallo,

    ich versuche mich grad an einem Zellulären Automaten für mein Studium. Als Aufgabe soll ich das ganze mit vector und mit arrays lösen.

    Ich habe also mit

    int* Regel;
        Regel = new int[8];
    

    mein Array der Größe 8 angelegt (später wird mein 2. Array Daten variabel gesetzt).

    Nun brauch ich aber die Länge des Arrays für die restlichen Funktionen in meiner Automaten-Klasse. Natürlich könnt ich eine int Variable setzen in der ich die Länge reinschreibe. Aber ich wollte eher via Funktion an die Länge dieses Arrays kommen.

    Was ich bisher im Internet dazu gefunden habe, was angeblich funktionieren soll:

    sizeof(Regel) / sizeof(Regel[0]

    Nur bringt mir das immer 1 raus. Ist ja eigentlich auch klar, da sizeof(Regel) 4 ergibt und sizeof(Regel[0]) auch.

    Gibts also ne Möglichkeit die Länge rauszubekommen? Oder sollte ich wirklich eine weitere Variable in dieser Klasse setzen?

    mfg Sinsei



  • Du hast ein Array fester Größe. Warum schiebst du es auf den Heap?

    int Regel[8];
    

    Dann klappt das auch mit dem Tipp, den du bekommen hast, denn Regel ist nun ein Array und kein Zeiger.

    Es gibt aber eigentlich (fast) keinen Grund mehr, überhaupt noch rohe Arrays zu benutzen. Der bevorzugte Weg wäre hier

    array<int, 8> Regel;
    

    Die Größe bekommst du dann mit Regel.size() .



  • Naja, es sieht so aus, dass ich auch noch ein 2. Array Daten habe und dieses Array via Variable umändern möchte. Die Funktion für mein Daten-Array:

    int* Daten; //In der Klasse
    
    void ArrayAutomat::zufallsZustaendeErstellen(int Reichweite)
    {
        Daten = new int[Reichweite];
        for(int i = 0; i <= Reichweite; i++)
        {
            Daten[i] = rand()%2;
        }
    }
    

    Mein Beispiel mit Regel war wohl hier etwas blöd gewählt



  • Für Arrays variabler Länge nimmt man std::vector. Sonst sind die Speicherlöcher schon vorprogrammiert.



  • Ich weiß, aber laut Aufgabenstellung soll ich das Ganze eben einmal mit Vektoren programmieren und einmal mit Arrays. Mit Vektoren war das Ganze auch leicht zu machen, nur mit Arrays bereitete mir eben das oben geschilderte Problem Kopfschmerzen.

    Ich hab das Ganze nun einfach mit 2 Zusatzvariablen für die Länge des Regel- und des Daten-Arrays geschrieben und es funktioniert.

    Danke für deine Hilfe 🙂



  • Nur um die eigentliche Frage nochmal zu beantworten

    Sinsei schrieb:

    Gibts also ne Möglichkeit die Länge rauszubekommen?

    Nein, so eine Möglichkeit gibt es nicht.



  • hustbaer schrieb:

    gibt es nicht

    Das ist übertrieben. new[] muss irgendwo die Länge festhalten, damit delete[] wieder alles freigibt. Mit schmutzigen Hacks komme ich also wieder an die Länge.

    Wenn ich new/delete überschreibe (was gut geht), dann dürfte ich die Länge sogar wieder legal bekommen.



  • schmutzigerhacker schrieb:

    hustbaer schrieb:

    gibt es nicht

    Das ist übertrieben. new[] muss irgendwo die Länge festhalten, damit delete[] wieder alles freigibt. Mit schmutzigen Hacks komme ich also wieder an die Länge.

    Nö, muß nicht. Der Compiler könnte sich unter Umständen auch merken, wo die Variable stand, die int new[] als Länge übergeben wurde, statt es sich im Freispeicher etc zu merken. Und bei leerem Destruktor der Datenelemente kann er auf's Notieren auch ganz verzichten.



  • @schmutzigerhacker
    Ja, ich weiss.
    Manchmal tut's aber auch eine einfache Antwort auf eine einfache Frage.
    Man muss die ganzen "ausser wenn blah" und "theoretisch wöre möglich blubb" nicht immer dazuschreiben, vor allem dann nicht, wenn man weiss dass sie dem Fragesteller nix bringen.


Anmelden zum Antworten