Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Ist "dies" in diesem C-Code Beispiel eine Variable oder ein Datentyp?

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.08.2002
    Beiträge
    33

    Ist "dies" in diesem C-Code Beispiel eine Variable oder ein Datentyp?

    Hallo, ich habe hier folgenden Code:

    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?

    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?
    Geändert von Catonga (16-04-2003 um 04:22 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339
    Hi!

    Der Hauptnutzen von typedef ist es Strukturen zu definieren, z.B.:
    Code:
    	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:
    Code:
    	typedef int superint, megaint, gigaint;
    Wenn du einen Pointer auf einen Datentyp haben möchte schreibst du normalerweise
    Code:
    int  *p;
    Um jetzt aber von dieser Schreibweise wegzukommen, kannst du einfach einen neuen Datentyp definieren:
    Code:
    typedef int *int_p;
    Dann kannst du einen Pointer auf int mit:
    Code:
    int_p p;
    deklarieren.

    Mit
    Code:
    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
    Code:
    data_t *p;
    schreiben würdest.

    c ya,
    Tobias

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    @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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.04.2003
    Beiträge
    15
    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.

    Code:
    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....
    --------------------------------------
    Geändert von jamba (16-04-2003 um 14:23 Uhr)

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.04.2003
    Beiträge
    15
    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
    I'm judge and I'm jury and I'm executioner too.
    www.metallica.com
    www.st-anger.de
    www.metallicamp.de

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •