size of static Array[] of string?



  • Guten Morgen,

    ich habe eine statisch Array, welches Fehler texte enhält:

    static const char* ReplyErrors[] =
    	{ 
    		"0x00 No error",
    		"0x01 Register Interface access not allowed at current state",
    		"0x02 Register Interface access denied at current access lev...
    
    
    ...};
    

    gibt es eine Möglichkeit die Anzahl der Fehler texte zur compile zeit zu ermitteln? wenn ich ein array of ints hätte , wäre es ja möglich so in der art : sizeof(array) / sizzeof(int).. aber wie geht es in meinem fall? Andernfalls könnte ich ja einfach std::vector nehmen fällt mir ein!? Oder was wäre den schön?;)

    Vielen DAnk


  • Mod

    Genauso. Typ ist halt const char*. Ist nichts magisches dran. Profitrick für alle Arrays, bei dem man den Typ nicht einmal kennen braucht: sizeof(array) / sizeof(*array)



  • @SoIntMan oder du verwendes

    static const std::array ReplyErrors =
    

    Dann kennt das Array seine Größte selbst.


  • Mod

    @manni66 sagte in size of static Array[] of string?:

    @SoIntMan oder du verwendes

    static const std::array ReplyErrors =
    

    Dann kennt das Array seine Größte selbst.

    Oh, sehe gerade, in welchem Forum wir sind. Da so selten echte Fragen zu C++/CLI mit .NET kommen: @SoIntMan Bist du sicher mit der Sprache? C++/CLI mit .NET ist weder C noch C++. Dein Code sieht nach C aus, und meine Antwort war auch C. In C++ ginge es eher in die Richtung von manni66s Antwort. Und die bestmögliche Antwort in C++/CLI mit .NET kenne ich gar nicht…



  • Du kannst (ab C++17) einfach std::size(ReplyErrors) nehmen.

    Dumme Frage an die Experten hier: std::size ist in ca. 1 Million Headern (ok, kleine Übertreibung, 14 laut cppreference) definiert. Warum ist sowas nicht direkt ohne ein Include verfügbar? Warum muss ich also z.B. <array> oder <regex> includen, obwohl ich weder std::array noch std::regex nutzen will? Oder nochmal ketzerisch gefragt: warum ist nicht die gesamte STL automatisch includet? Bzw. könnte man das nicht komplett automatisieren (also ich meine jetzt nicht mit Tools, sondern von Sparachstandardseite)?



  • @SeppJ sagte in size of static Array[] of string?:

    sizeof(array) / sizeof(*array)

    cool kannte ich nich.. naja bin ja noch am anfang

    @manni66 std::array is auch ne gute ide passt ab c++11 für mich;)

    @SeppJ : Ne ich bin grad im pure c++ context, noch kein cli;)

    @wob: leider nur in c++11 unterwegs:=)



  • @SoIntMan sagte in size of static Array[] of string?:

    @wob: leider nur in c++11 unterwegs:=)

    Update ist keine Option? 2011 ist auch schon wieder 10 Jahre her...



  • @wob sagte in size of static Array[] of string?:

    Bzw. könnte man das nicht komplett automatisieren

    Mit modules soll das (fast automatisch) kommen, ist aber AFAIK noch nicht spezifiziert. VS bidtet da z.B. schon std.core an.



  • @SoIntMan sagte in size of static Array[] of string?:

    @manni66 std::array is auch ne gute ide passt ab c++11 für mich;)

    So wie gezeigt geht es aber erst mit C++ 17 und CTAD.



  • @manni66 sagte in size of static Array[] of string?:

    std.core an.

    👍

    Sehr gut! Ich bin nämlich vom manuellen Includen genervt, insbesondere da ich inzwischen nur noch alle paar Wochen mal was mit C++ mache und dann natürlich vergesse, in welchem Header z.B. std::pair nun wieder ist (in <pair> jedenfalls nicht). Und eigentlich ist es mir auch egal. Kurzfristig erinnere ich mich vielleicht an <util> - oder wars doch <utility> - oder include ich einfach <map>, da wird das ja wohl als Abhängigkeit bestimmt auch drin sein? (und dann geht das natürlich im nächsten Update kaputt...)



  • @SoIntMan
    Kennst du auch folgendes?

    #include <cstdio>
    
    template<typename T, int Size>
    int GetSize(T(&)[Size])
    {
        return Size;
    }
    
    int main()
    {
        static const char* ReplyErrors[] =
        {
            "0x00 No error",
            "0x01 Register Interface access not allowed at current state",
            "0x02 Register Interface access denied at current access lev..."
        };
    
    
        printf("Size: %i\n", GetSize(ReplyErrors));
        return 0;
    }
    


  • @Quiche-Lorraine sagte in size of static Array[] of string?:

    template<typename T, int Size>
    int GetSize(T(&)[Size])
    {
    return Size;
    }

    ne kenne ich nicht, erklär mal was da passiert bei GetSize(??)



  • @SoIntMan

    Die Größe des Arrays wird automatisch anhand der Template Parameter bestimmt. Obwohl... ne, eigentlich umgekehrt. GetSize ist ein Funktionstemplate, dass anhand der übergebenen Parameter erzeugt wird. Die Signatur verlangt, dass der übergebene Parameter ein Array vom Typ T ist und Size die Größe des Arrays (Anzahl der Elemente). Beides findet der Compiler für dich heraus und bildet daraus die Template Argumente. Das static const char* ReplyErrors[]" ersetzt der Compiler automatisch zu static const char* ReplyErrors[3]" und erzeugt für den Aufruf GetSize( ReplyErrors) eine konkrete Funktion mit T=const char* und Size=3. Damit ist die Größe des Arrays bekannt und wird mit Size zurückgegeben.



  • @Quiche-Lorraine sagte in size of static Array[] of string?:

    template<typename T, int Size>
    int GetSize(T(&)[Size])
    {
        return Size;
    }
    

    Wennst noch constexpr davorschreibst und die Funktion noexcept machst hast du dann quasi std::size nachimplementiert 🙂


Log in to reply