Allgemeine Fragen zu Strukturen
-
~fricky schrieb:
supertux schrieb:
SonntagsGast schrieb:
Also sowas wie ein Kopier-Konstruktor für Strukturen.
sowas gibt es in C nicht.
struct s { int a; char *b; char c; } s1 = {123, "hello", 'x'}; // original int main() { struct s s2 = s1; // kopie printf ("%d %s %c\n", s2.a, s2.b, s2.c); }
Deine Kopie ist nur halbgar.
-
supertux schrieb:
die Rede war nicht von Kopien sondern von einem Kopier-Konstruktor (im C++schen Sinne), oder hab ich da was falsch verstanden?
ne, ich hab' das falsch verstanden. sowas was mein code macht, macht der OP sowieso schon. vielleicht sollte ich mir mal angewöhnen, threads vollständig zu lesen bevor ich was poste.
Tachyon schrieb:
Deine Kopie ist nur halbgar.
was stört dich? wird doch alles kopiert.
-
Hallo,
vielen Dank für die Antworten. Das letzte, was ich jetzt immer noch nicht so recht verstanden habe ist, wofür der Unterstrich in unten stehendem Code steht?! Ich sehe da einfach keinen Sinn darin, ich könnte doch genauso gut den Unterstrich zweimal oder auch keinmal verwenden?
typedef struct _myTestStruct { HANDLE hMyHandle; int a; char myCharArray[10]; }myTestStruct;
-
SonntagsGast schrieb:
Ich sehe da einfach keinen Sinn darin, ich könnte doch genauso gut den Unterstrich zweimal oder auch keinmal verwenden?
Gut deine Augen sind
@ fricky
Tachyon wird entweder auf padding bytes, oder auf das nicht kopierte Zeugs auf das der Zeiger zeigt hinaus wollen.
-
Du kannst sogar auf die Unterstriche ganz verzichten.
Guckst du, so:typedef struct A { int i; }A;
Vielleicht verwirrt es noch weniger, wenn du auf das 'Tagding' ganz verzichtest:
typedef struct { int i; }B;
MfG,
k.k.
-
SonntagsGast schrieb:
Hallo,
vielen Dank für die Antworten. Das letzte, was ich jetzt immer noch nicht so recht verstanden habe ist, wofür der Unterstrich in unten stehendem Code steht?!
was ich nicht verstehe, wofür der 'S' Buchstabe bei deinem Nick steht?!
_ ist Teil des Namen, genauso gut könnte MickeyMouse oder Mickey_Mouse stehen. Eigentlich ist es nicht erlaubt einen Bezeichnernamen mit einem (doppelten) Unterschrich zu verwenden, weil diese Namen reserviert sind aber wenig Leute halten sich daran.
Tim schrieb:
@ fricky
Tachyon wird entweder auf padding bytes, oder auf das nicht kopierte Zeugs auf das der Zeiger zeigt hinaus wollen.
da frag ich mich, wie löst der Compiler diese Aufgabe?
struct wasauchimmmer a,b; ... b = a;
ist sowas irgendwo definiert? Ist das äquivalent zu
memmove(&a, &b, sizeof(a));
oder zub.member1 = a.member1; b.member2 = a.member2;...
?
-
Sehe ich das dann richtig, dass nach einem typedef wie unten zu sehen _myTestStruct und myTestStruct vollkommen gleichbedeutend sind?
So dass ich nach dem unten stehenden Codefragment eine Struktur diesen Typs so
_myTestStruct nummer1;
oder so
myTestStruct nummer2;
deklarieren könnte? D.h. "nummer1" und "nummer2" sind Strukturen des gleichen Typs?!
typedef struct _myTestStruct { HANDLE hMyHandle; int a; char myCharArray[10]; }myTestStruct;
-
Nein.
Im Zweifelsfall kannst du das auch ausprobieren.typedef struct { int i; }C; typedef struct _D { int i; }D; C c; // Ok D d; // Ok _D _d; // Fehler
Das _D ist ein Etikett, ein structure tag und kann weggelassen werden.
-
supertux schrieb:
Tim schrieb:
@ fricky
Tachyon wird entweder auf padding bytes, oder auf das nicht kopierte Zeugs auf das der Zeiger zeigt hinaus wollen.
da frag ich mich, wie löst der Compiler diese Aufgabe?
struct wasauchimmmer a,b; ... b = a;
ist sowas irgendwo definiert? Ist das äquivalent zu
memmove(&a, &b, sizeof(a));
oder zub.member1 = a.member1; b.member2 = a.member2;...
?Die Implementierung kann es sich raussuchen. Oder hast du was anderes erwartet?
-
supertux schrieb:
da frag ich mich, wie löst der Compiler diese Aufgabe?
struct wasauchimmmer a,b; ... b = a;
schreib mal entsprechenden code und disassembliere den compiler-output. du wirst sehen, dass 'heimlich' eine kopier-routine aufgerufen wird. das kann durchaus 'memcpy' sein.
-
Tim schrieb:
Die Implementierung kann es sich raussuchen. Oder hast du was anderes erwartet?
dass es Frieden auf Erden gibt
ich dachte nur, vielleicht ist sowas irgendwo genau spezifiziert.
schreib mal entsprechenden code und disassembliere den compiler-output. du wirst sehen, dass 'heimlich' eine kopier-routine aufgerufen wird. das kann durchaus 'memcpy' sein.
hab grade jetzt keine Lust dazu