value_string
-
So hab jetzt ein kleines Testprogramm geschrieben, und siehe da es funktioniert!
#include <stdio.h> #include <stdlib.h> typedef struct _value_string { int value; const char *strptr; } value_string; static const value_string packettypenames[] = { { 0, "TEXT" }, { 1, "SOMETHING_ELSE" }, { 0, NULL } }; int main(int argc, char *argv[]) { printf("Hallo:\n"); printf("%s%d\n","Wert:", packettypenames[1].value); printf("%s%s","String:", packettypenames[1].strptr); return 1; }
Was macht es eigentlich für einen Unterschied ob ich
typedef struct _value_string {
oder
typedef struct {
schreibe???
-
THE_ONE schrieb:
Was macht es eigentlich für einen Unterschied ob ich
typedef struct _value_string {
oder
typedef struct {
schreibe???
im zweiten fall hast du eine namenlose struct geschaffen. die kannste nur über den typedef-typ ansprechen.
-
-fricky- schrieb:
im zweiten fall hast du eine namenlose struct geschaffen. die kannste nur über den typedef-typ ansprechen.
Verstehe ich nicht ganz, bei beiden kann ich doch einfach
value_string Wert1
schreiben, was kann ich mit dem ersteren mehr anfangen.
Verstehe die Aussage "die kannste nur über den typedef-typ ansprechen." nicht ganz -> das ist doch der Sinn der Sache das man sich Schreibarbeit ersparrt. Könntest du mir vielleicht anhand von Beispielcode den Unterschied zeigen.Lg THE_ONE
-
THE_ONE schrieb:
Verstehe ich nicht ganz, bei beiden kann ich doch einfach
value_string Wert1
schreiben, was kann ich mit dem ersteren mehr anfangen.
Richtig, es hat ja auch niemand behauptet dass Du das im ersten Fall nicht kannst.
Im ersten Fall kannst Du aber zusätzlich folgendes machen, im zweiten Fall nicht:
struct _value_string Wert1;
-
THE_ONE schrieb:
-fricky- schrieb:
im zweiten fall hast du eine namenlose struct geschaffen. die kannste nur über den typedef-typ ansprechen.
Verstehe ich nicht ganz, bei beiden kann ich doch einfach
value_string Wert1
schreiben, was kann ich mit dem ersteren mehr anfangen.
Nein, kannst du nicht in ANSI C! Das ist in C++ so.
In Ansi C muss ein struct davor.struct mystruct { int val; }; /* ... */ struct mystruct v; v.val = 42;
da das struct aber manchmal ganz schön störend sein kann (beim Tippen sowie beim Lesen), kann man mit einem typedef die sache verschönen
typedef struct { int val; } MyStruct; /* ... */ MyStruct v; v.val = 42;
SO kannst du allerdings bspw. keine Liste/Bäume oder andere Datenstrukturen realisieren, die eines oder mehrerer Knoten bedürfen. Dafür muss das struct bekannt sein. D.h. da bist du auf das Keyword angewiesen:
/* single linked list */ typedef struct _mystruct { int val; struct _mystruct* next; /* MyStruct* next wäre NICHT zulässig */ } MyStruct; MyStruct* base = malloc(sizeof(MyStruct)); base->val = 42; base->next = NULL; free(base);
-
Xantus schrieb:
Nein, kannst du nicht in ANSI C! Das ist in C++ so.
[...]
da das struct aber manchmal ganz schön störend sein kann (beim Tippen sowie beim Lesen), kann man mit einem typedef die sache verschönenAlso.... kann er doch! :p
-
typedef struct MyStruct MyStruct; struct MyStruct{ int val; MyStruct* next; };
-
Ok, überzeugt.
-
Hallo!
Danke euch allen für die spitzenmäßige Erklärung (vor allem Xantos - genau das wollte ich wissen).Was wollte mir Camper mit seinem Code zeigen?
Von was bist du überzeugt Xantos???
Lg THE_ONEPs.: Ich glaube ich habs verstanden was Camper meinte mit:
typedef struct MyStruct MyStruct; struct MyStruct{ int val; MyStruct* next; };
durch das Typedef am Anfang kann ich dann trotzdem schreiben:
Mystruct Wert1;
obwohl das in ANSI C ja nicht gehen würde ohne das Typedef -richtig??
-
THE_ONE schrieb:
Wow, Danke, das ging aber flott. Wie kommst du darauf (ist das jahrelange Programmiererfahrung?)
Wie kommst du darauf dass das ein struct sein muss, hätte das nicht auch ein anderes Array sein können??LG THE_ONE
Mit etwas Nachdenken und Sprachkenntnis ist es ein Leichtes. Denn deine Variable packettypenames ist ein eindimensionales Array vom Typ value_string, als Elemente werden jedoch zusammengesetzte Strukturen benutzt. Damit es ein Array sein kann müsste dein packettypenames Array also zweidmensional sein.
Somit muss value_string eine Struktur sein, welche als erste Variable einen Integer-Typ hat (könnte auch was anderes sein wie doule, aber da in deinem Beispiel nur ganze Zahlen benutzt werden gehen wir mal von einem Integer aus) und da bietet sich "int" als Standard-Integer dann an ohne zusätzliche Kenntnis.
Und beim zweiten bietet sich ein Zeiger auf einen konstanten String an, da auch hier keine genaueren Kenntnisse vorhanden sind. Es könnte sich aber auch ein Char-Array als Typ für die zweite Variable anbieten, aber auch hier ist wieder const char* am sinnvollsten, wenn man nur den Codeausschnitt kennt.