kostenloser Webspace werbefrei: lima-city


[C++]Länge eines Arrays berechnen?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    benutzernaemelchen

    Kostenloser Webspace von benutzernaemelchen

    benutzernaemelchen hat kostenlosen Webspace.

    So. Hab' mal wieder eine Frage.

    Hier mal ein kleiner Ausschnitt:

    <?php
    int gleiche(int arr1[], int arr2[])
    {
    	//laenge des ersten arrays
    	int arr1Length = sizeof(arr1) / sizeof(int);
    	//lange des zweiten arrays
    	int arr2Length = sizeof(arr2) / sizeof(int);

    die Arrays, die ich übergebe haben 6 Elemente.
    Allerdings ist arr1Length sowie arr2Length immer nur 1.

    Wenn ich arr1 und arr2 als Referenz definiere, bekomm' ich immer eine Fehlermeldung.

    Deshalb wollte ich jetzt einfach mal fragen, wie ich das denn hinbekomme, dass dort auch die richtige Länge rauskommt.


    Hoffe, ihr wisst was.


    MfG


    EDIT: Ich habe jetzt noch einen dritten Parameter hinjzugefügt, und es klappt.
    Allerdings würde ich es gern unabhängig von der Länge der Arrays machen.

    Beitrag geaendert: 10.3.2007 9:48:41 von benutzernaemelchen
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c*********c

    die Arrays, die ich übergebe haben 6 Elemente.
    Allerdings ist arr1Length sowie arr2Length immer nur 1.


    Der Arraybezeichner (in deinem Falle arr1 und arr2) liefert die Anfangsadresse des allozierten Speicherberichs. Aus dem Ergebnis lässt sich schliessen, dass ein Integer gleich viel Platz wie ein Zeiger benötigt.
  4. tischfussball

    tischfussball hat kostenlosen Webspace.

    Das Problem ist so, wie du es dir wünschst, nicht zu lösen. Dafür gibt es zweierlei Gründe. Zum einen ist sizeof() keine normale Funktion, sondern ein Operator, ähnlich wie echo in PHP. sizeof()-Aufrufe werden zur Kompilierungszeit statisch umgesetzt. Dies bedeutet, dass von Arrays, die dynamisch per new oder malloc() bzw. deren Schwesterfunktionen angelegt werden, die Grösse (Anzahl der Elemente) nicht mit sizeof() bestimmt werden kann. sizeof() wird in diesem Fall IMMER die Anzahl der Bytes zurückliefern, die ein Zeiger auf dem System belegt (auf 32-Bit-Systemen halt 4 Bytes).
    Nun wirst du vielleicht einwenden, dass du statische Arrays übergibst, also solche, die zum Beispiel mit "char bla[6]" angelegt worden sind. Bei statischen Arrays funktioniert der sizeof()-Operator, da deren Grösse zur Kompilierungszeit ja bekannt ist. ABER nur, wenn das statische Array nicht in einen Zeiger konvertiert wird. Und das werden Arrays immer, wenn sie an eine Funktion übergeben werden.
    Es gibt nur einen sinnvollen Grund, den sizeof()-Operator auf Arrays anzuwenden:
    #define ANZAHL_ELEMENTE
    
    typedef int ELEMENTTYP;
    ELEMENTTYP bla[ANZAHL_ELEMENTE];
    int temp;
    
    temp = sizeof(bla) / sizeof(ELEMENTTYP);
    
    for (; temp > 0; temp--)
       //...irgendwas machen mit dem array


    Macht also nur Sinn, wenn es sein kann, dass man vor dem Kompilieren Typ und Grösse des Arrays ändern könnte und dann keine Lust hat, den Quellcode nach solchen Stellen zu suchen, wo dann ebenfalls Änderungen vorgenommen werden müssen.
    Bei statisch angelegten Arrays weiss man ansonsten ja eh die Grösse des Arrays.
    Bei dynamisch angelegten Arrays muss man halt in seinem Programm die Grösse des Arrays irgendwo speichern und bei Veränderungen halt auch ändern. Dafür eignet sich unter C++ natürlich am besten eine Klasse, unter C solltest du dir am besten mit einer Struktur behelfen. Falls dir das zu umständlich ist und du lieber den Overhead der STL in Kauf nehmen würdest, musst du halt vector aus der STL benutzen. Damit kannst du die Grösse einfach über vector::size() feststellen.
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!