Strukturen
-
Hello, ich versuche gerade die Win32-API Grundlagen zu lernen dabei bin ich auf eine struct gestosen
die ich eigentlich von den C Grundlagen kennen müsste, tu ich aber nicht.int main() { struct { int iIndex; TCHAR *szLabel; TCHAR *szDesc; } sysmetrics [] = { SM_CYCAPTION, TEXT ("SM_CYCAPTION"), TEXT ("Hoehe der Titelleiste"), }; cout << sysmetrics[0].szLabel << endl; //Ausgabe: SM_CYCAPTION cout << sysmetrics[0].szDesc << endl; //Ausgabe: Hoehe der Titelleiste cout << sysmetrics[0].iIndex; //Ausgabe: 4 return 0; }
Ich sehe da nur eine struct und ein Array aber wieso bekomme ich dann gültige Ausgaben?? Liegt das daran das die sruct anonym ist?
Wäre nett wenn mir das einer ausführlich erklären könnte. Please HELP.
-
Auf den ersten Blick würd ich sagen, dass es sich hier um C++ handlet, da iostreams verwendet werden... aber hier gehts ja nicht drum
. Du hast Recht, diese struct ist anonym, d. h. sie wird direkt instanziert (als array) und auch gleich mit allen Werten gefüllt. Dass du nun auf die Werte ohne Probleme zugreifen kannst ist doch ganz erfreulich
(und natürlich normal). Verstehe dein Problem nicht ganz..
-
#phoenix# schrieb:
Auf den ersten Blick würd ich sagen, dass es sich hier um C++ handlet, da iostreams verwendet werden...
Finde es sowieso immer lustig, wie im Forum immer alles wahllos durcheinander gewürfelt wird. Unnötige char-Buffer etc in C++ und dann sowas in C.
Ganz abgesehen von Programmierparadigmen...
-
1. Wenn du C++ programmierst, wieso stellst du die Frage in C Forum?
2. Wenn du WinAPI verwendest und eine dieser Funktionen, wieso fragst du in ANSI C forum?Der Grund, warum die richtige Ausgaben hast, liegt vermutlich daran, dass SM_CYCAPTION, TEXT ("SM_CYCAPTION"), TEXT ("Hoehe der Titelleiste") diese Makros oder Funktionen sein, die ein int, ein TCHAR und nochmal ein TCHAR zurückgeben. Wenn du bei einem struct mit den Elementen den Membern des structs zuweist, dann wird das struct damit initialisiert.
-
supertux schrieb:
1. Wenn du C++ programmierst, wieso stellst du die Frage in C Forum?
2. Wenn du WinAPI verwendest und eine dieser Funktionen, wieso fragst du in ANSI C forum?zu 1.: Da es eine Struktur ist, betrifft es C (auch die Initialisierung)
zu 2.: Auch, wenn die Struktur mit einer WinAPI-Funktion verwendet wird, hat die Frage an sich nichts mit WinAPI zu tun.@Tux86
Bei diesem Konstrukt ist das so:
Es wird zunächst eine Struktur deklariert (structe { ... }. Danach wird gleich dafür eine Variable bzw. ein Array (sysmetrics) definiert (wodurch du die struct an sich nicht wo anders benutzen kannst). Dieses Array wird nun auch noch initialisert ( = { ... }). In dem Fall nur mit einem Element.
Verständlich?
-
ich dachte in "C" gibts nur
typedef struct { int var1; int var2; }var;
und in c++:
struct var { int var1; int var2; }
ist dem so - oder haben unsere "professoren" wieder mal gepfuscht
?
mfg (c)h
-
Letzteres. Man kann schon "struct foo" schreiben, aber dann legt man Variablen dieses Typs auch mit "struct foo xyz" an, nicht mit "foo xyz". Um sich diese Schreibarbeit zu ersparen, kann man in C auch "typedef struct opt { ...} foo" schreiben, dann geht auch "foo xyz".
-
AJ schrieb:
zu 1.: Da es eine Struktur ist, betrifft es C (auch die Initialisierung)
zu 2.: Auch, wenn die Struktur mit einer WinAPI-Funktion verwendet wird, hat die Frage an sich nichts mit WinAPI zu tun.zu 1: C und C++ structs sind nicht gleich, und das sollte man schon beachten.
zu 2: da hast du Recht.Die C und C++ structs sind unterschiedliche Sachen. In C sind structs einfach Variablen, die "Subvariablen" haben, die Members.
/* Nur C Code */ struct mystruct { int x; int y; char* z; }; void foo() { struct mystruct m; m.x=0; }
Du kannst dort nur andere Variablen und ggf andere structs haben, keine Funktionen.
/* nur C Code */ struct mystruct { int x; int y; char* z; void foo_matic(); }; void foo() { struct mystruct m; m.x=0; }
Beim Kompilieren bekommt man (Ausgaben von gcc) struct.c:6: error: field `foo_matic' declared as a function.
Wenn du eine Instanz eines structs haben willst, etwa m in void foo, dann muss du mit struct mystruct deklarieren, in C++ nicht. Man kann aber aus dem struct ein Datentyp machen, und zar mit typedef:
/* Nur C Code */ typedef struct mystruct_tmp { int x; int y; char* z; } mystruct; void foo() { mystruct m; m.x=0; }
Wie du siehst, dann brauchst du das struct nicht mehr in void foo. typedef <variablen typ/struct> <neuer Name des Datentyps> ist die Syntax und was man meisten sieht.
Doch ist das in C++ aber anders, In C++ sind structs eigentlich schon Klassen, deren Elementen standardmäßig public sind. D.h. sowas ist eigentlich äquivalent.
// Nur C++ Code struct mystruct { int a; int b; int c; void f(); }; void foo() { mystruct m; m.c=9; }
und
// nur C++ Code class mystruct { public: int a; int b; int c; void f(); }; void foo() { mystruct m; m.c=9; }
und vor allem sind Funktionen zugelassen, was bei C nicht der Fall ist.
-
supertux schrieb:
1. Wenn du C++ programmierst, wieso stellst du die Frage in C Forum?
Heh I'm just a Newbie und weil es sich hier um eine Struktur handelt die nun mal am häufigsten in C auftreten dachte ich das ich hier richtig bin.
Dank an #phoenix# und AJ. Ihr habt mir geholfen meinen Denkfehler zu erkennen.
[cpp]
struct
{ int iIndex;
TCHAR *szLabel;
TCHAR *szDesc;
} ; sysmetrics []
[/cpp]
Jetzt versteh ich dich zusammenhänge zwischen struct und sysmetrics. Danke.