array grösse messen
-
wenn ich ein array unbekannter grösse habe, wie finde ich dann heraus wie viele elemente er bestutz? bsp für eine schleife.
in vb gbs dafür ubound
-
Wenn das Ende nicht irgendwie markiert ist, gar nicht.
-
Wenn du C++0x benutzt, dann verwende statt C-Arrays std::array.
Wenn du kein C++0x benutzt, aber boost::, dann verwende boost::array.std::array<int, 10> oof; std::cout << oof.size();
-
Marvin94 schrieb:
wenn ich ein array unbekannter grösse habe, wie finde ich dann heraus wie viele elemente er bestutz? bsp für eine schleife.
in vb gbs dafür uboundDas Array kannst Du befragen mit sizeof.
int a[]={3,6,4,23,6,}; int anzahl=sizeof(a)/sizeof(a[0]);//gibt 5, stimmt.
AAaber:
Arrays, die an Funktionen übergeben werden, sind nur scheinbar Arrays, sondern in Wirklichkeit nur Zeiger aus erste lement.void test(int a[]){ int anzahl=sizeof(a)/sizeof(a[0]);//gibt vermutlich 1, stimmt überhaupt nicht
Deswegen übergibt man immer den Zeiger aus erste lement UND die Anzahl
void test(int a[],int anzahl){ for(int i=0;i<anzahl;++i) cout<<a[i]<<' '; cout<<'\n'
und als Aufruf vielleicht
int main(){ int a[]={3,6,4,23,6,}; test(a,sizeof(a)/sizeof(a[0]));
Soviel zu den Arrays, die keine Klassen sind.
Mit den Klassen vector oder array fährt man diesbezüglich viel besser. Die wissen, wie groß sie sind. Normalerweise sollte man versuchen, diese zu benutzen.
-
schade eigentlich, würde sicher viel arbeit ersparen, hat sicher einen grund.
also danke
-
Der Grund ist das Zero-Overhead Prinzip von C++. Ich bin Struppi sehr dankbar, dass Arrays so dumm sind. Auch Range-Checks hab ich noch nie vermisst.
-
314159265358979 schrieb:
Der Grund ist das Zero-Overhead Prinzip von C++.
Falsch. Arrays könnten auch kopiert werden und wer das nicht will, übergibt Zeiger auf Arrays.
void test(int a[5])//sollte kopieren void test(int (*a)[5])//sollte nicht kopieren
Diese Sonderregel für Arrays finde ich nervig.
314159265358979 schrieb:
Ich bin Struppi sehr dankbar, dass Arrays so dumm sind.
Damit hat Struppi wenig zu tun. Eher K&R.
314159265358979 schrieb:
Auch Range-Checks hab ich noch nie vermisst.
Ich schon.
-
volkard schrieb:
Falsch. Arrays könnten auch kopiert werden und wer das nicht will, übergibt Zeiger auf Arrays.
void test(int a[5])//sollte kopieren void test(int (*a)[5])//sollte nicht kopieren
Diese Sonderregel für Arrays finde ich nervig.
Ich meinte damit nun eher das Speichern der Größe. Und ja, du hast hier natürlich Recht
volkard schrieb:
Damit hat Struppi wenig zu tun. Eher K&R.
Naja, er hat sie doch genau so aus C übernommen, oder?
volkard schrieb:
Ich schon.
Wirklich? Normalerweise benutze ich rohe Arrays nur, wenn ich irgendwelche Compilezeit-Konstante habe, wie im anderen Thread. In diesem Fall bekomme ich die Größe mit sizeof, viel mehr als darüber iterieren muss ich meistens nicht machen.
-
Ja, Arrays sind wegen ihrer "Features" recht mühsam. Glücklicherweise behebt
std::array
fast alle Probleme (Kopiersemantik, Debug-Range-Checks, kein Array-To-Pointer-Decay, Methode für Grösse, ...).Ich verwende eigentlich nie mehr rohe Arrays. Marvin94, ich rate dir das Gleiche. Die STL (ich zähle
std::array
mal dazu) hat auf Vieles eine Antwort.