Arraylänge bestimmen (double)
-
Hi,
am Anfang sei erst mal gesagt: "Ja, ich weiß was eine Suchfunktion ist, und ich hab sie auch benutzt!".
Leider hab ich immer nur Topics gefunden bei denen es darum ging eine Stringlänge (bzw. char[]-Länge) zu bestimmen.Ich hab folgendes Problem:
Ich muß die Länge eines dynamisch angelegten 2-Dimensionalen double-Arrays bestimmen. Im Forum hab ich in einem Thread gelesen daß das nicht so ohne weiteres möglich ist, aber leider nichts konkretes. Mit sizeof() komme ich nicht weiter, weil ich damit ja immer nur die größe des ersten Elements im Array bestimmen kann.double *test=new double[x];
Wie bestimme ich die Größe wenn x nicht bekannt ist (muß doch irgendwie gehn)?
Im Voraus besten Dank!!
Gruß
Threaddy
-
Threaddy schrieb:
Im Forum hab ich in einem Thread gelesen daß das nicht so ohne weiteres möglich ist
Nicht ganz richtig: Es geht überhaupt nicht. Entweder du merkst dir irgendwo die Größe oder du markierst das Ende mit einem speziellen Wert.
-
Mist, ich wußte es (mein Leben ist die Hölle)
Danke für die schnelle Antwort!
Da sehnt man sich doch nach Java zurück :p
Was wäre denn 's spezieller Wert (gibt's in C++ sowas wie infinite oder nan)Danke!
Gruß
Threaddy
-
Hi!
Weiß zwar nicht ob es das ist was du meinst, aber die Anzahl Elemente kannst du so bestimmen:
sizeof(array)/sizeof(array[0]); // oder sizeof(array)/sizeof(TypVonArray);
Code-Hacker
-
Code-Hacker schrieb:
Hi!
Weiß zwar nicht ob es das ist was du meinst, aber die Anzahl Elemente kannst du so bestimmen:
sizeof(array)/sizeof(array[0]); // oder sizeof(array)/sizeof(TypVonArray);
Code-Hacker
Nur bei statischen Arrays. Hier geht es aber um dyn. allokierten Speicher.
-
Wie wär's mit std::vector statt dem dynamischen Array? Da kannste auch die Größe abfragen.
MfG Jester
-
Jester schrieb:
Wie wär's mit std::vector statt dem dynamischen Array? Da kannste auch die Größe abfragen.
MfG Jester
Ja. Zur Not würde es ja auch sowas tun:
struct array { double* value; unsigned int size; };
-
Stimmt, ist aber unschön zu benutzen. Und bis man dann den op[] noch implementiert hat ist man mit dem vector doch wieder einfacher gefahren.
-
Hi,
Jester schrieb:
Wie wär's mit std::vector statt dem dynamischen Array? Da kannste auch die Größe abfragen.
Hab einen Vector zum Aufbau der Daten verwendet, aus performancegründen (echtzeitregelung) hab ich das aber vor Meßbegin in ein Array kopiert.
Hab jetzt einfach eine Variable die die Größe enthält beim erzeugen mit angelegt.
Danke für eure Hilf!!!
Gruß
Threaddy
-
Threaddy schrieb:
aus performancegründen (echtzeitregelung) hab ich das aber vor Meßbegin in ein Array kopiert.
Nur auf verdacht oder gemessen/probiert? Ein vector dürfte nämlich beim Lesen/Schreiben nicht langsamer sein als ein gewöhnliches Array. Nur beim vergößern etc. ist natürlich Overhead dabei.
MfG Jester
-
Naja, im Vergleich zum bei-jedem-push_back-das-Array-neu-allokieren-und-kopieren ist Overhead vielleicht übertrieben...
-
Das stimmt zwar, aber wir wollen ja bei der Wahrheit bleiben. Und umsonst ist das Vergößern bei vector ja auch nicht.
-
Hi,
Jester schrieb:
Nur auf verdacht oder gemessen/probiert? Ein vector dürfte nämlich beim Lesen/Schreiben nicht langsamer sein als ein gewöhnliches Array. Nur beim vergößern etc. ist natürlich Overhead dabei.
Hab ich schon länger mal probiert. Wenn der Vector mal in den 4Stelligen Bereich geht merkste das schon deutlich (also beim schreiben).
Is des vector.at(x) net n Aufruf (hws. inline)
Gruß
Threaddy
-
Threaddy schrieb:
Is des vector.at(x) net n Aufruf (hws. inline)
du solltes schon op[] benutzen weil at den index zusätzlich prüft. und wenn du speed test machts dann nie mit der debug version es kann nämlich gut sein das in der debug version zusätlicher code in op[] eingebaut wird um prüfungen vorzunähmen
-
Gerard schrieb:
vorzunähmen
LOL
-
Threaddy schrieb:
double *test=new double[x];
Wie bestimme ich die Größe wenn x nicht bekannt ist (muß doch irgendwie gehn)?
wenn du z.b. an die funktionen der heap-verwaltung ran kommst, könnte das gehen. der speicher vor der adresse, auf die *test zeigt, enthält eine struktur, die den heap-block beschreibt (wo u.a. auch die länge steht).
btw: du könntest es selber finden, indem du mehrere 'char* x' 'mallocst' oder 'newst' und dir dann den speicher davor anschaust (x[-1] ... x[-n]).
aber vorsicht - was dabei herauskommt ist natürlich in höchstem maße systemabhängig.
-
wenn du z.b. an die funktionen der heap-verwaltung ran kommst, könnte das gehen. der speicher vor der adresse, auf die *test zeigt, enthält eine struktur, die den heap-block beschreibt (wo u.a. auch die länge steht).
Das mag auf einigen Compilern so sein, aber ich wuerde mich nicht darauf verlassen
dass das alle so machen.Hab ich schon länger mal probiert. Wenn der Vector mal in den 4Stelligen Bereich geht merkste das schon deutlich (also beim schreiben).
Das kann ich mir beim Schreiben gar nicht vorstellen, hoechstens, wenn die
Kapazitaet nicht mehr ausreicht und der ganze Kram umkopiert werden muss.mfg
v R
-
virtuell Realisticer schrieb:
hoechstens, wenn die Kapazitaet nicht mehr ausreicht und der ganze Kram umkopiert werden muss.
Das wiederum kann ein C-Array aber auch nicht schneller. Natürlich wird das irgendwann man langsamer (Cache etc.) aber ich sehe keinen Grund, warum es langsamer sein sollte als ein C-Array.
MfG Jester