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 ubound

    Das 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.


Log in to reply