ein Kapitel zurück                                           ein Kapitel weiter

In diesem Kapitel lernen sie Ihren Strukturen einen eigenen Namen geben. Das heißt sie definieren Ihren Typen selbst. Dies ist auch wieder äußerst praktisch da sich die Lesbarkeit deutlich erhöht. Ich benutze einfachfalber unser erstes Programm das wir zu dem Thema Datenstrukturen geschrieben haben und benutze dabei unser neues Schlüsselwort typedef.

/*Download:typedef1.c*/
#include <stdio.h> #include <string.h> #include <stdlib.h> static int x; struct adres { char vname[20]; char nname[20]; long PLZ; char ort[20]; int geburtsjahr; }adressen[100]; typedef struct adres ADRESSE; void Eingabe(int nr,ADRESSE neu[]) { printf("Vorname : "); gets(neu[nr].vname); fflush(stdin); printf("Nachname : "); gets(neu[nr].nname); printf("Postleitzahl: "); scanf("%ld",&neu[nr].PLZ); fflush(stdin); printf("Wohnort : "); gets(neu[nr].ort); printf("Geburtsjahr : "); scanf("%d",&neu[nr].geburtsjahr); } void Suche(ADRESSE search[],char buchstabe,int nr) { int i; for(i=0; i<=nr; i++) { if(search[i].nname[0] == buchstabe) { printf("\n\nGefunden unter Buchstabe :\"%c\"\n\n",buchstabe); printf("Vorname.........:%s\n",search[i].vname); printf("Nachname........:%s\n",search[i].nname); printf("Postleitzahl....:%ld\n",search[i].PLZ); printf("Ort.............:%s\n",search[i].ort); printf("Geburtsjahr.....:%d\n",search[i].geburtsjahr); fflush(stdin); printf("\n\tWeiter mit <ENTER>\n"); getchar(); } } } void Ausgabe(ADRESSE all[],int nr) { int i; for(i=0; i<nr; i++) { printf("Vorname.........:%s\n",all[i].vname); printf("Nachname........:%s\n",all[i].nname); printf("Postleitzahl....:%ld\n",all[i].PLZ); printf("Ort.............:%s\n",all[i].ort); printf("Geburtsjahr.....:%d\n\n",all[i].geburtsjahr); if((!(i%2))&& i!=0) { fflush(stdin); printf("\n\tWeiter mit <Enter>\n\n"); getchar(); } } } void Sort(ADRESSE sort[],int nr) { ADRESSE *temp; int i,j; for(i=0; i<nr; i++) { for(j=i+1;j<nr;j++) { if(strcmp(sort[i].nname, sort[j].nname)>0) { *temp=sort[j]; sort[j]=sort[i]; sort[i]=*temp; } } } printf(".....Sortiert!!\n"); } int main() { int auswahl; char c; do { printf("-1- Neue Adresse eingeben\n"); printf("-2- Bestimmte Adresse Ausgeben\n"); printf("-3- Alle Adressen Ausgeben\n"); printf("-4- Adressen Sortieren\n"); printf("-5- Programm beenden\n"); printf("\nIhre Auswahl : "); scanf("%d",&auswahl); fflush(stdin); switch(auswahl) { case 1 : Eingabe(x++,adressen); break; case 2 : printf("Anfangsbuchstabe d. Nachnamen :"); scanf("%c",&c); Suche(adressen,c,x); break; case 3 : Ausgabe(adressen,x); break; case 4 : Sort(adressen,x); break; default: break; } }while(auswahl <5); return 0; }

Dank unserer neuen Typendefinition....

typedef struct adres ADRESSE;

...nun auf unsere Struktur mittels....

ADRESSE neueadressen[100];

....zu. Und das finde ich ist wesentlich lesbarer. Vor allem wenn sie mehrere Strukturen definieren die einander sehr ähnlich sind. Sie hätten unsere Typendefinition anstatt wie im Programm vorgestellt auch so machen können.....

typedef struct adres {
                               char vname[20];
                               char nname[20];
                               long PLZ;
                               char ort[20];
                               int geburtsjahr;
                             }ADRESSE;

ADRESSE adressen[100];

Diese Schreibweise hat den selben Effekt wie die oben von unserem Programm. Auch hier wird es wieder andere geben die das Ganze ganz anders rangehen...

#define ADRESSE struct adres

ADRESSE              {
                               char vname[20];
                               char nname[20];
                               long PLZ;
                               char ort[20];
                               int geburtsjahr;
                             }adressen[100];

Sicherlich sind das jetzt nicht alle Möglichkeiten und sie werden jetzt vielleicht ein bisschen verwirrt sein. Aber gerade das ist es was die Sprache C gegenüber anderen Sprachen etwas schwerer aber dafür nicht so Einseitig macht. Sie haben die Freiheit Programme zu schreiben wie sie es wollen und können. Irgendwann werden sie diese Freiheiten zu schätzen wissen. Jeder wird seinen eigenen Stil haben.

Natürlich könne sie die Typendefinition auch auf andere Variablen anwenden. Recht häufig werden sie noch sehen .....

typedef unsigned char BYTE;   //1 Byte = 8 BIT
typedef unsigned int WORD;   //1 WORD = 16 BIT
typedef unsigned long DWORD;   //1 DOUBLE WORD = 32 BIT
typedef unsigned double QWORD;   //1 QUAD WORD = 64 BIT
typedef unsigned int uint;
typedef unsigned char uchar;
........................

Zum Beispiel ist die die Schreibweise.......

uint wert1,wert2;

...äuquevalent zu...

unsigned int wert1,wert2;

Das Schlüsselwort typdef wird hauptsächlich dazu benutzt sogenannte Primitive Datentypen zu erzeugen. Von denen werden wir in späteren Kapiteln noch vielen begegnen. Nun wozu soll das denn gut sein? Nehmen wir zum Beispiel den Primitiven Datentyp uclock_t (Primitive Datentypen Enden normalerweise immer mit _t). Dieser ist in der Headerdatei <time.h> beim DJGPP angegeben.....

typedef long long uclock_t;

Auf einem anderen System sieht dieses vielleicht so aus.....

typedef unsigned long uclock_t;

Und was soll uns das sagen? Die Primitiven Datentypen machen unsere Programm Portabler und sie müssen sich nicht auf jedem anderen Systemen mit dem Datentyp auseinandersetzen. Es wäre doch ärgerlich wenn ein Programm unter DOS programmiert haben, Das dann unter Linux ganz falsche Werte ausgibt.
Nun wie schon mit enum oder define machen sie mit typedef das Programm nicht etwa besser oder schneller sondern es dient auch hier lediglich zur Erleichterung damit sie Ihr Programm besser Lesen, Schreiben und Portieren können.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf