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
-
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.
-
@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 wederstd::arraynochstd::regexnutzen 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.corean.
-
@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.corean.
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(??)
-
Die Größe des Arrays wird automatisch anhand der Template Parameter bestimmt. Obwohl... ne, eigentlich umgekehrt.
GetSizeist ein Funktionstemplate, dass anhand der übergebenen Parameter erzeugt wird. Die Signatur verlangt, dass der übergebene Parameter ein Array vom TypTist undSizedie Größe des Arrays (Anzahl der Elemente). Beides findet der Compiler für dich heraus und bildet daraus die Template Argumente. Dasstatic const char* ReplyErrors[]"ersetzt der Compiler automatisch zustatic const char* ReplyErrors[3]"und erzeugt für den AufrufGetSize( ReplyErrors)eine konkrete Funktion mitT=const char*undSize=3. Damit ist die Größe des Arrays bekannt und wird mitSizezurückgegeben.
-
@Quiche-Lorraine sagte in size of static Array[] of string?:
template<typename T, int Size> int GetSize(T(&)[Size]) { return Size; }Wennst noch
constexprdavorschreibst und die Funktionnoexceptmachst hast du dann quasistd::sizenachimplementiert