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::array
nochstd::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(??)
-
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 TypT
ist undSize
die 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 mitSize
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 Funktionnoexcept
machst hast du dann quasistd::size
nachimplementiert