Sizeof() gibt falschen Wert aus



  • Was man machen kann ist folgendes:

    short arr[] = {1, 2, 3, 4, 5, 6}; // Geht auch fuer int, double etc.
        printf("length(arr) = %d", sizeof(arr) / sizeof(*arr));
    

    Sollte man das so machen? Nein, weil wenn du z.B. das Array an eine Funktion uebergibst, dann funktioniert das bereits nicht mehr.
    Wie schon geschrieben wurde: Verwende in C++ std::array oder std::vector.



  • Ok ihr habt mich überzeugt, ich nehme std::array.



  • size_t size = sizeof( DeinArray ) / sizeof( DeinArray[0] );
    	for( size_t i = 0; i < size; ++i )
    	{...}
    

    So geht das.



  • EOP schrieb:

    So geht das.

    Nein, std::array ist besser.

    Mit rohen Arrays hast du eine fehleranfällige implizite Konvertierung, dafür keine Wertsemantik, keine Debug-Checks und kein STL-konformes Interface. Und du bist nicht einmal schneller.



  • EOP schrieb:

    size_t size = sizeof( DeinArray ) / sizeof( DeinArray[0] );
    	for( size_t i = 0; i < size; ++i )
    	{...}
    

    So geht das.

    Besser std::extent verwenden... 😉



  • int arr[] = { 1, 2, 3, 4, 5 };
    for(auto beg = std::begin(arr); beg != std::end(arr); ++beg)
        std::cout << *beg << '\n';
    

    Oder so.



  • In der Tat, wenn es nur um ein for each geht, dann ist das natürlich noch besser. Oder eben gleich so:

    int arr[] = { 1, 2, 3, 4, 5 };
    for(auto i : arr)
        std::cout << *i << '\n';
    


  • Nexus schrieb:

    EOP schrieb:

    So geht das.

    Nein, std::array ist besser.

    Mit rohen Arrays hast du eine fehleranfällige implizite Konvertierung, dafür keine Wertsemantik, keine Debug-Checks und kein STL-konformes Interface. Und du bist nicht einmal schneller.

    Wenn man std::array hat. Ich z.B. hab's nicht.

    EDIT: oder std::extent oder auto.
    Ich hab alles davon nicht zur Verfügung.



  • std::tr1::array gibts schon seit 2005 und boost::array seit 2000 😉



  • Nexus schrieb:

    std::tr1::array gibts schon seit 2005 und boost::array seit 2000 😉

    Noch was, das ich nicht zur Verfügung hab. 😉



  • und kein STL-konformes Interface

    #include <algorithm>
    #include <iostream>
    
    int main(int argc, char** argv)
    {
        std::for_each(&argv[0], &argv[argc-1], [](char const* c){std::cout << c << "\n";});
    }
    

    hm?



  • Edit: argc-1 ist falsch, müsst argc heißen.


  • Administrator

    EOP schrieb:

    Nexus schrieb:

    std::tr1::array gibts schon seit 2005 und boost::array seit 2000 😉

    Noch was, das ich nicht zur Verfügung hab. 😉

    Du hast kein Inet? Weil sonst könntest du die Array Implementation auch einfach rauskopieren.
    Eine einfache eigene Implementation kann man zudem ganz schnell selber erstellen. Innert 10-15 Minuten hast du so eine Klasse selber geschrieben. Je nach Funktionsumfang sogar noch schneller.

    Grüssli


Anmelden zum Antworten