Länge eines dynamischen Arrays
-
Kein Interesse.
-
int* myarray = new int[42];es gibt keinen Weg um die Größe des Speichers der hinter dem myarray-Pointer steht zu ermitteln - musst du selber mitschleifen
in C++ mit nackten Pointer zu arbeiten ist nicht so gerne gesehen
also#include <vector>
std::vector<int> myarray(42);
myarray.size() == 42
-
Gast3 schrieb:
in C++ mit nackten Pointer**, die Resourcen besitzen,** zu arbeiten ist nicht so gerne gesehen**, weil es fehleranfällig ist**
Siehe Edit
-
Yarra schrieb:
Kein Interesse.
warum möchtest du denn den std::vector nicht nutzen?
er ist ein dynamischer container:
- der z.B. eine funktion hat dir die länge zurückzugibt
- ist fehlerunanfälliger
- bietet weiter funktionen die dir, als programmierer das leben einfacher machtwas spricht also dagegen?

-
Das frage ich mich auch. Ich kann verstehen, wenn man so einen Container mal selber implementieren möchte zu Übungszwecken, aber das ist auch der einzige Grund.
Wenn vector eben nicht in Production Code nutzt (und statt dessen eine Quick&Dirty Lösung) spricht das schon von sehr großer Dummheit. Und was mir bei dem Beitrag
Yarra schrieb:
Kein Interesse.
für ein Eindruck entstanden ist, war "Keine Lust die Referenz zu lesen, weil ich zu faul bin."
-
Ein Mod möge womöglich die IP-Adressen der beiden 'Yarra's vergleichen, womöglich ist der zweite Post ein Trollpost.
-
wenns nur zum Spielen ist, dann kannst du natürlich new[] überladen und zusätzlich 4 Byte anfordern, in welchen du die Länge (in Byte) speicherst.
void* operator new[](size_t s) { /* hier statt s zusätzlich 4 Byte anfordern (s+4). In den ersten 4 Byte die Länge speichern, und schließlich die Adresse des von malloc gegebenen Speichers + 4 rechnen */ return malloc(s); } void operator delete[](void* p) { /*hier von p wieder die 4 byte abziehen und schließlich an free übergeben*/ free(p); } // Länge in Byte. Anzahl der Elemente: müsstest du noch durch sizeof(Typ) dividieren size_t getLengthOfArrayInByte(void* p) { size_t len=...; // 4 byte vor p findet sich die Länge return len }Du kannst dann bei jedem mit new[] erstellten Array die Länge abfragen.
Sofern das ganze auch nur ein halbwegs sinnvolles Programm werden soll: nimm std::vector
-
du kannst auch ganz einfach schreiben:
int *array; int arraylength=255; array = new int[arraylength]; void resizearray(int newlength) { int *temp=new int[newlength]; for(int i=0;i<arraylength;i++) { *(temp+i)=*(array+i); } arraylength=newlength; }alles natürlich sauber in eine klasse eingebettet, was ich hier aus bequemlichkeitsgründen nicht getan habe.

-
sorry außerdem musst du natürlich ein delete array, ein array=temp; und ein temp=0; anweisen.
-
temp = 0 setzen obwohl es doch eh am ende der Funktion rausfällt?
Eine manuelle Allokation und ein roher, besitzender Zeiger hat unter anderem einen Nachteil: Fliegt eine Ausnahme, wird der Speicher nicht freigegeben, jedoch werden die Desktruktoren der lokalen Objekte aufgerufen, weshalb smarte zeiger und container denoch ihren besitz freigeben.
-
roflo schrieb:
Ein Mod möge womöglich die IP-Adressen der beiden 'Yarra's vergleichen, womöglich ist der zweite Post ein Trollpost.
Tja, das ist eben der Nachteil, wenn man sich nicht registriert. Ich kann jedenfalls sagen, dass der zweite Beitrag nicht unbedingt von der gleichen Person stammt wie der erste.