Struct schnell leeren?
-
Hi.
Ich habe ein struct ala
struct daten
{
int x;
char ch[20];
bool test;
};darf man das so leeren?
daten dat;
ZeroMemory(&dat,sizeof(dat));
bzw wie wäre die richtige Vorgehensweise, um alles 0 zu setzen?Danke.
-
Hallo,
Wie wärs mit memset ?
-
Was ist der Vorteil/Nachteil, ob man ZeroMemory(&dat,sizeof(dat)); oder memset(&excel,0,sizeof(excel)); macht?
-
memset() ist eine Funktion des C++/C-Standard und existiert daher für jeden
standardkonformen Compiler.
ZeroMemory ist eine Funktion des Betriebssystem und daher nicht auf jeder,
Plattform, unter diesem Namen vorhanden.Es ist jedoch durchaus möglich das memset() mithilfe von ZeroMemory implementiert
ist.
-
daten dat = daten();
-
ssm schrieb:
daten dat = daten();
Das setzt aber nicht alle Elemente auf 0. Vielmehr sind die Member in diesem Fall uninitialisiert.
Initialisieren kannst du das Ganze auch so:
daten d = {0, {0}, 0};
Das geht aber natürlich nur bei einer Initialisierung.
-
Man sollte strukturen auch einen konstruktor verpassen (in C++).
Dann hat man eine Fehlerquelle weniger.
-
ZeroMemory ist ein Makro aus der Winapi:
#define ZeroMemory(p,s) memset(p, 0, s)
-
ssm schrieb:
daten dat = daten();
Das sollte okay sein - aber nur genau dann, wenn es sich um einen POD-Typen handelt.
Siehe hier bei Punkt 3:
http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html
-
HumeSikkins schrieb:
Initialisieren kannst du das Ganze auch so:
daten d = {0, {0}, 0};
Wobei man auch einfach nur
daten d = {};
schreiben kann. Alle nicht explizit initialisierten Elemente werden dabei mit 0 initialisiert.
-
7H3 N4C3R schrieb:
ssm schrieb:
daten dat = daten();
Das sollte okay sein - aber nur genau dann, wenn es sich um einen POD-Typen handelt.
Hast du Humes Beitrag gelesen?
-
Shade Of Mine schrieb:
Hast du Humes Beitrag gelesen?
Japps. Nach dem Artikel, den ich verlinkt habe, sollte aber in genau dem Fall eine Defaultinitialisierung passieren - für einen POD-Typen. (siehe Unterschied zwischen new T und new T()). Defaultinitialisierung für einen POD-Typen bedeutet, mit Nullen füllen.
Ich lasse mich aber gerne berichtigen, falls ich da etwas falsch verstanden haben sollte.
-
HumeSikkins schrieb:
Initialisieren kannst du das Ganze auch so:
daten d = {0, {0}, 0};
Das geht aber natürlich nur bei einer Initialisierung.
Ist das eine offiziell erlaubte Form?
Ich hab das bisher nur 1x gesehen, und da hab ich mir gedacht "schau an, die Nutzen einfach das Speicherlayout vom Compiler aus... Das ist wirklich "legal" (read: standardkonform) ?
-
7H3 N4C3R schrieb:
Shade Of Mine schrieb:
Hast du Humes Beitrag gelesen?
Japps. Nach dem Artikel, den ich verlinkt habe, sollte aber in genau dem Fall eine Defaultinitialisierung passieren - für einen POD-Typen. (siehe Unterschied zwischen new T und new T()). Defaultinitialisierung für einen POD-Typen bedeutet, mit Nullen füllen.
Ich lasse mich aber gerne berichtigen, falls ich da etwas falsch verstanden haben sollte.Jup. Du (und damit auch ssm) hast recht. () gilt als initializer. Damit wird das Objekt default-initialized (bzw. nach dem TC1 value-initialized), was für POD-Typen einer zero-initialization gleich kommt.
Im Beispiel wird dat dann per copy-initialization initialisiert, mit dem Ergebnis, dass am Ende alle Elemente 0 sind.Blue-Tiger schrieb:
HumeSikkins schrieb:
Initialisieren kannst du das Ganze auch so:
daten d = {0, {0}, 0};
Das geht aber natürlich nur bei einer Initialisierung.
Ist das eine offiziell erlaubte Form?
Jup. Siehe 8.5.1 im Standard.
-
Siehe 8.5.1 im Standard.
Wo kann man die definition des Standarts finden ?
-
:: schrieb:
Siehe 8.5.1 im Standard.
Wo kann man die definition des Standarts finden ?
Du kannst den Standard hier käuflich erwerben.
Moritz
-
HumeSikkins schrieb:
Blue-Tiger schrieb:
HumeSikkins schrieb:
Initialisieren kannst du das Ganze auch so:
daten d = {0, {0}, 0};
Das geht aber natürlich nur bei einer Initialisierung.
Ist das eine offiziell erlaubte Form?
Jup. Siehe 8.5.1 im Standard.
Thx... eine Stelle im Struppi oder im C++ Primer wuerden noch mehr helfen, wenn du's zufaellig weisst
-
Blue-Tiger schrieb:
[Thx... eine Stelle im Struppi oder im C++ Primer wuerden noch mehr helfen, wenn du's zufaellig weisst
Im Struppi wird das Thema nur sehr kurz behandelt. Ich habe hier die deutsche Version in der dritten Ausgabe. Dort findet man in 5.2.1 die "Feldinitialisierer" erklärt. In 5.7 wird dann lediglich gesagt: "die Schreibweise zur Initialisierung von Feldern kann auch für Variablen vom Strukturtyp benutzt werden".
Im Primer finde ich das Ganze nur für Arrays (3.9).
Du kannst aber auch einfach in den frei verfügbaren Final Draft schauen:
http://www.kuzbass.ru/docs/isocpp/decl.html
-
hab dank
-
Danke fürs Nachschauen, Hume. War jetzt schon selbst verwirrt, ob ich das denn auch richtig verstanden habe.
Ich denke aber, auf solch subtile Code-Bedeutungen sollte man zu Gunsten aller Quelltext-Lesenden verzichten
-
Shade Of Mine schrieb:
ZeroMemory ist ein Makro aus der Winapi:
#define ZeroMemory(p,s) memset(p, 0, s)
ist deine winapi kaputt? bei mir ist das ne funktion aus der kernel32.dll
vorteile von memset:
- ist intrinsic
- kann also bei kleinen feldern zu REPNE STOSB und konsorten gut umgewandelt werden
- kann von alignment gut profitierenmemset ruft bei größeren feldern (oder feldern mit für den compiler unbekannter größe) feine handoptimierte assembler-funktion auf.
vorteil von ZeroMemory:
es steht nicht im eigenen programm, dadurch wird es etwas kleiner.könnte natürlich sein, daß heute die memset bei großen oder unbekannten feldern die Zeromemory aufruft, dann wäre das makro ok.