PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ist "dies" in diesem C-Code Beispiel eine Variable oder ein Datentyp?



Catonga
16-04-2003, 04:17
Hallo, ich habe hier folgenden Code:



typedef struct data
{
int x, y;
char a, b;
} data_t, *data_p;

static data_t test[10];


Die Frage ist jetzt, was passiert hier jetzt denn eigentlich genau?

Wenn man das "typedef" mal entfernt,
dann wird hier wohl ein Struct mit dem Typnamen data deklariert
und dann eine Variable Namens "data_t" und ein Zeiger Namens"data_p" vom (Struct-) Typ data definiert.

Das Problem das mir hier nicht ganz klar ist ist das typedef.


Bei typedef bekommt ein Datentyp ja einen neuen Namen, z.b.
typedef int superint;

Wenn data_t aber eine Variable ist und kein Typ,
wieso funktioniert dann typdef?
Hier wird das also doppelt belegt,
also wird es zum einen eine normale Variabel (wegen Struct) und
zum anderen ein Typ vom Typ Struct oder wie soll man das
interpretieren?

Doppelt gemoppelt?


Und wenn man die Zeile weiter unten anschaut,
dann wird data_t als Datentyp verwendet und nicht als Variable
um dieses Array names test zu generieren:
static data_t test[10];

Weil eine Variable kann das ja in diesem Fall nicht sein.


Dieser Code läßt sich zumindest compilieren und der letzten Zeile
zufolge müßte data_t offentsichtlich ein Datentyp sein und keine Variable.

Daher die Frage, hat hier typdef vor der Variablendefinition Priorität
oder ist data_t sowohl ein Datentyp als auch eine Variable vom Typ Struct data? :confused:

Wenn ich mir aber den Zeiger am Schluß anschaue, dann müßte hier
dieses Struct immer noch in der Lage sein zu wirken um diesen Zeiger vom Typ Struct
data zu erstellen.
Wie soll man das denn jetzt verstehen?

tkortkamp
16-04-2003, 09:31
Hi!

Der Hauptnutzen von typedef ist es Strukturen zu definieren, z.B.:


typedef struct {char *lastname; char *name} person;
person people;

person ist jetzt ein neuer Typ und kein Variablenname.

Man kann auch viele Datentypen in einem Zug definieren:


typedef int superint, megaint, gigaint;


Wenn du einen Pointer auf einen Datentyp haben möchte schreibst du normalerweise


int *p;

Um jetzt aber von dieser Schreibweise wegzukommen, kannst du einfach einen neuen Datentyp definieren:


typedef int *int_p;

Dann kannst du einen Pointer auf int mit:


int_p p;

deklarieren.

Mit


data_p p;

deklarierst du also einen Pointer auf die Struktur, deswegen auch bei der Definition das * davor.
Das wäre dasselbe als wenn du das hier


data_t *p;

schreiben würdest.

c ya,
Tobias

anda_skoa
16-04-2003, 09:41
@Catonga: Mit dem typedef ist data_t eben keine Variable, sondern ein andere Name für die struct, also ein Typ.

Selbiges bei data_p

Ciao,
_

jamba
16-04-2003, 14:19
Original geschrieben von anda_skoa
@Catonga: Mit dem typedef ist data_t eben keine Variable, sondern ein andere Name für die struct, also ein Typ.

Selbiges bei data_p

Ciao,
_

meiner meinung nach sind data_p, data_t variablen der strucktur data. und keine namen für die struktur.
laut syntax kann man nach der struktur definition gleich bestimmte variablen dieser struktur bzw. instanzen dieser struktur (um etwas objektorientierter zu argumentieren) definieren.

z.b.



struct queueEntry
{
long mType;
int mArray;
int mText;
} qEntryUp, qEntryDown;


hiermit definiere ich einen eintrag in einer message queue, mit dem verschiedenen eigenschaften wie dem mType, einen integer array mArray und einen dazugehörigen text mText.
hinten dran initialisiere ich 2 neue instanzen vom typ queueEntry, sozusagen zwei neue messages.

ich hofffe ich hab mich klar ausgedrückt.

jamba

--------------------------------------
EDIT: sorry, habt recht, ich hab das ohne TYPEDEF gemacht. da schaut die sache wieder anders aus....
--------------------------------------

anda_skoa
16-04-2003, 14:26
Original geschrieben von jamba
EDIT: sorry, habt recht, ich hab das ohne TYPEDEF gemacht. da schaut die sache wieder anders aus....


:)
Ist ein gutes Beispiel dafür, dass man nicht mehrer Sachen auf einmal machen sollte.

Das macht nur den Code unleserlicher.

Ciao,
_

jamba
17-04-2003, 00:09
Original geschrieben von anda_skoa
:)
Ist ein gutes Beispiel dafür, dass man nicht mehrer Sachen auf einmal machen sollte.

Das macht nur den Code unleserlicher.

Ciao,
_

ich weiss jetzt zwar nicht ganz was du meinst (mehrere sachen auf einmal machen), aber wenn du die variablen initialisierung am ende der struktur meinst: das ist doch noch recht übersichtlich. finde ich zumindest.

jamba

anda_skoa
17-04-2003, 10:29
Original geschrieben von jamba
ich weiss jetzt zwar nicht ganz was du meinst (mehrere sachen auf einmal machen), aber wenn du die variablen initialisierung am ende der struktur meinst: das ist doch noch recht übersichtlich. finde ich zumindest.


Ich meinte, das Deklarieren der Struct und gleichzeitig deklarieren davon abhängiger Typen.

Bzw, falls das typedef nicht da ist, deklarieren der Struct und gleichzeitg deklarieren von Variablen davon.

Initialisierung ist zwar vom Code her einen Deklaration und eine Zuweisung in einer Zeile, aber da das eben die Schreibweise für Initialisierung ist, ist es auch gewohnt.

Ciao,
_