Größenermittlung eines zweidiminsionalen arrays
-
Hi,
kann man irgendwie die Breite und Höhe eines zweidiminsionalen Zeigers, des Typs unsigned integer, ermitteln?
-
Ein Zeiger ist und bleibt ein Zeiger, Größe auf aktuellen Systemen meistens 4 byte
Wenn du Container benutzt, kannst du mit Leichtigkeit deren Größe feststellen.
-
Ich mein nicht die Größe, ich mein die Länge.
-
Ein Pointer hat keine Länge. Die Länge des Arrays auf das der Pointer zeigt ist nicht zu ermitteln. Wie gesagt, nimm Container, die haben eine size()-Methode die dir sagt wie viele Elemente im Container sind.
-
Bei einem Array kommst du nicht drum herum das ganze Ding zu durchlaufen und mitzuzählen. Aber um ein Array (mit lediglich einem Zeiger) zu durchlaufen brauchst du ja ein Endkriterium, was nun man die Anzahl ist. Also stehtst du wieder am Anfang. Sprich du musst die Grösse immer irgendwie mitgeben. Und da endest du schlussentlich bei einem Container. Entweder selbst geschrieben, oder einer aus der Standardbibliotek.
-
Ok merci. Ich dachte nur, da ich die Größe eines Arrays, des Typs char, ermitteln kann, könnte ich das auch mit einem des Typs int machen.
for(int size=0;*cstr;++cstr,++size);Aber der string hat ja ein Abschlusskriterium ('\0') und int nicht!
-
GuardianOfLife schrieb:
Ok merci. Ich dachte nur, da ich die Größe eines Arrays, des Typs char, ermitteln kann, könnte ich das auch mit einem des Typs int machen.
for(int size=0;*cstr;++cstr,++size);Aber der string hat ja ein Abschlusskriterium ('\0') und int nicht!
Das ist ne C-String Geschichte (und hat in C++ eigentlich auch nur wenig verloren)
-
Auch der C-Ansatz ist etwas suboptimal, da er O(n) mit sich bringt, um die Länge zu ermitteln. Eine vernünftige Implementierung der STL-Container speichert die Grösse selbst und benötigt dementsprechend nur konstante Zeit.
Schau dir doch mal den Artikel über STL-Container an. Das ist nämlich ein sehr wichtiger Teil der C++-Standardbibliothek, den du andauernd wieder brauchen wirst.
-
drakon schrieb:
Bei einem Array kommst du nicht drum herum das ganze Ding zu durchlaufen und mitzuzählen. Aber um ein Array (mit lediglich einem Zeiger) zu durchlaufen brauchst du ja ein Endkriterium, was nun man die Anzahl ist. Also stehtst du wieder am Anfang. Sprich du musst die Grösse immer irgendwie mitgeben.
Was soll das denn für eine verquere Logik sein???
-> UNFUG
-
hustbaer schrieb:
drakon schrieb:
Bei einem Array kommst du nicht drum herum das ganze Ding zu durchlaufen und mitzuzählen. Aber um ein Array (mit lediglich einem Zeiger) zu durchlaufen brauchst du ja ein Endkriterium, was nun man die Anzahl ist. Also stehtst du wieder am Anfang. Sprich du musst die Grösse immer irgendwie mitgeben.
Was soll das denn für eine verquere Logik sein???
-> UNFUG?
Was ist den daran falsch? Ich sage nur, dass man, wenn man einen Zeiger hat, welcher auf ein Array zeigt man die Grösse bereits mitgeliefert bekommen muss, es sei denn man hat ein Endkriterium, welches das Ende des Arrays markiert. (wie z.B bei einem C-String)
Ich weiss nicht, was daran Unfug sein soll..
-
eigentlich kann man doch immer containers statt arrays nehmen? oder sind die arrays schneller als containers? also ob anlegen, zuweisen, etc schneller für cpu ist?
hab überlegt mal ganz auf die arrays zu verzichten, bis auf mehrere statische variablen die zusammengefasst werden soll. sonst werden eh die meisten objekte zur laufzeit erzeugt ?
-
xBlackKnightx schrieb:
eigentlich kann man doch immer containers statt arrays nehmen? oder sind die arrays schneller als containers? also ob anlegen, zuweisen, etc schneller für cpu ist?
Wenn man mit den Containern richtig umgeht und die richtigen Container verwendet tut sich das sicherlich nicht wirklich viel.
-
Und nimm für Arrays
std::tr1::arraybzw.boost::array, da hast du kaum bis keinen Overhead, aber ein schönes Interface, Kopier- und Zuweisbarkeit sowie Assertions im Debug-Modus.
-
Nexus schrieb:
Und nimm für Arrays
std::tr1::arraybzw.boost::arrayJup, für fixe Arrays std::tr1::array, für dynamische Arrays std::vector - letzteren kann man ja gleich mit dem richtigen Speicherbedarf initialisieren, sobald er bekannt ist.