Announcement

Collapse
No announcement yet.

Größe von dynamischen Arrays ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Größe von dynamischen Arrays ermitteln

    Hi,

    Das hört sich jetzt vermutlich wie eine Anfängerfrage an, aber ich stehe da momentan echt auf dem Schlauch. Gibt es irgendeine Möglichkeit an einem dynamisch erzeugten Array zur Laufzeit abzufragen, wie groß er ist?

    Also in der Form:
    [highlight=c++]
    void UsingArrays()
    {
    float statArray[12]; // das geht ja nur, wenn zu Compilezeit die Größe feststeht
    int arraySizeStat= sizeof(statArray) / sizeof(statArray[0]);
    bzero(statArray, 12* sizeof(float));

    float* a=new float[readSizeFromSourceForA()];
    int arraysizeA=???
    bzero(a,arraySizeA*sizeof(float));

    float* b= (float*) calloc(readSizeFromSourceForB(), sizeof(float)); // hier habe ich ja gar keine Chance, außer ich merke es mir in einer anderen Variable
    int arraySizeB=readSizeFromSourceForB();

    if(arraySizeA == arraySizeB) printf("gleich groß");

    delete[] a;
    delete[] b;
    }
    [/highlight]

    Hintergrund ist, dass ich um new, malloc, Speicherzugriffe und Konsorten besser kontrollieren zu können, eine Klasse, die std::vector nutzt umschreiben wollte, aber nicht jedesmal, wenn ein std::vector an eine Funktion übergeben wird, die die Länge des Vektors braucht (also irgendwo auf vector.size() zugreift), extra Parameter mit übergeben will, und eine extra Datenstruktur zu erzeugen, die den float[] Array und die Größenagabe enthält, kommt mir zu buganfällig vor (wenn man den Array verändert, ohne die Größenangabe mitzuändern)

    Gruß
    Martin

  • #2
    readSizeFromSourceForA() steht doch die Größe drin. Außerdem warum sollte sizeof nicht funktionieren? Ggf. Größe durch den Datentyp teilen
    Zuletzt editiert von Christian Marquardt; 22.05.2012, 11:07.
    Christian

    Comment


    • #3
      readSizeFromSourceForA() und readSizeFromSourceForB() sind Platzhater für irgendwelche Funktionen, die Arraygrößen ermitteln, dies kann eine beliebige Momentaufnahme sein, z.B. die Füllgröße einer Queue sein, Anzahl Zeilen in einer Datei oder Diagnosedaten aus einem externen Messgerät, kurz gesagt, nur weil zum Zeitpunkt der Erzeugung des Arrays da eine 12 zurückgegeben wurde, muss es nicht heißen, dass zum Zeitpunkt der nächsten Abfrage immer noch eine 12 zurückgegeben wird, wenn sich etwas an der SourceForA geändert hat.

      sizeof(a) klappt übrigens nicht, das habe ich ja zuerst ausprobiert, das gibt mir 4 zurück, egal wie viele Elemente in dem Array sind. Dadurch dass ich es als float* a deklarieren muss, und nicht wie im ersten Beispiel schon als Array, gibt er mir die Größe des Pointers oder der Einzelemelentes "float" zurück.

      [highlight=c++]
      float* testarray = new float[13];
      printf("testarray has a size of %d, *testarray a size of %d", sizeof(testarray), sizeof(*testarray));
      delete[] testarray;
      [/highlight]

      ergibt
      Code:
      testarray has a size of 4, *testarray a size of 4

      Comment


      • #4
        Ja, der Pointer testarray ist 4 Byte groß -> kann mich wieder dunkel erinnern -> geht nicht

        dies kann eine beliebige Momentaufnahme sein
        ..die du ja wissen musst. Wie lange sollte sonst der Pointer durchlaufen werden, wenn du alle Elemente ansprechen willst. Du musst dir die aktuelle Größe merken
        Christian

        Comment

        Working...
        X