Einführung in C von Christoph Bach WICHIG: Im Text bedeuten *( = eckige Klammer mit SHIFT , )* = eckige Klammer mit SHIFT . = Semikolon Datentypen In Standart C gibt es nur vier Daten- typen: char, int, float und pointer char ist ein einzelnes ASCII-Zeichen. int ist eine Integer (ganze) Zahl. Als Untertypen von int gibt es noch short und long. Alle Integerzahlen können auch als unsigned (vorzeichenlos) definiert werden. float ist eine Fließkommazahl. Ein Untertyp davon ist double. pointer sind Zeiger. Sie sind mindestens zwei Byte lang (für 64kByte Adressraum). Datentyp Bytes Zahlenbereich char 1 1 0-255 ASCII int 2 2 -32768 .. +32767 short - 1 -128 .. +127 long - 4 +-1073741823 float (6) 4 +-10 E 38 double - 8 +-10 E 307 pointer 2 2 0 .. 65535 Die erste Spalte unter Bytes steht für die ATARI-Compiler. Für den ATARI kann eine float-Variable mit char *(6)* deklariert werden. Je nach Implemen- tation schwankt die Zahl der benutzten Bytes, und damit auch der Zahlen- bereich. Hat man mehr als 64k Speicher, so benötigt man pointer mit mehr als 2 Byte. Wird eine Integervariable als unsigned deklariert, so können Zahlen zwischen 0 und 65535 (255 bei short) dargestellt werden. Vereinbarung von Variablen Zuerst schreibt man den Datentyp, dann die oder den Variablennamen, und schließt das Ganze mit einem Semikolon ab. Das Komma verknüpft, wie sonst in C auch, mehrere Vereinbarungen. char zeichen,taste Diese Zeile definiert die Variablen zeichen und taste als char-Variablen. Für beide wurde je ein Byte Speicher reserviert. Arrays Arrays sind aufeinanderfolgende, gleichartige Variablen, die über einen gemeinsamen Namen und eine Nummer angesprochen werden können. Die Vereinbarung von Arrays funktioniert genauso wie die Vereinbarung von gewöhnlichen Variablen, nur die Anzahl der Array-Felder muß zusätzlich in eckigen Klammern angegeben werden. char sechsc*(6)* Damit werden sechs aufeinanderfolgende Bytes für die Variable sechsc reserviert. Jedes einzelne Byte kann durch seine Nummer angesprochen werden, wobei das erste Byte die Nummer Null hat. Beim ATARI kann man sechsc auch als Fließkommavariable verwenden. Mehrdimensionale Arrays int schach *(8)* *(8)* sind beim ATARI nicht möglich. Globale und lokale Variable Je nach dem Ort der Definition haben Variablen in C eine unterschiedliche Geltungsdauer. Man kann auf eine Variable nur dann zugreifen, wenn sie im gleichen, oder einem übergeordneten Block $( $) definiert wurde. Als globale Variable bezeichnet man diejenigen Variablen, die außerhalb eines Blockes stehen. Auf sie haben alle Teile eines Programms Zugriff, d.h. diese Variablen können überall gelesen und geschrieben werden. Häufiger benötigt man die lokalen Variablen. Man kann in jeder Funktion die lokale Variable i definieren, ohne daß im einen Programm aus Versehen die Variable des anderen Programms geändert wird. Alle lokalen Variablen verlieren beim Verlassen der Funktion ihren Wert. Um das zu vermeiden gibt es das reservierte Wort static (nicht beim ATARI), das man vor die Deklaration setzt. Will man in einer Funktion auf eine Variable, die lokal in einer anderen Funktion definiert wurde, zugreifen, so benutzt man extern: extern int zahl Damit wird kein Speicherbereich reserviert. Die Variable zahl muß schon irgenwo als int deklariert worden sein. Initialisierung Einer Variablen kann bei ihrer Deklaration ein Wert zugewiesen werden. Bei einer extern-Referenz ist das nicht möglich: int hans = 12, otto = 25 Die Integervariablen hans und otto werden mit den Startwerten 12 und 25 besetzt. Will man ein Array mit Startwerten versehen, so muß man die Werte in geschweifte Klammern schreiben: int wuerfel *(6)* = $( 1,2,3,4,5,6 $) char ich*(3)* = $( 'I','c','h' $) Die Initialisierung funktioniert nicht auf dem ATARI. Vergleiche In C kann man die üblichen Vergleiche durchführen. Anders als in Basic schreibt sich der Vergleich auf Gleichheit mit == und der Vergleich auf Ungleichheit mit !=. Verzweigungen if() Die if-Abfrage kommt wohl in jeder Programmiersprache vor. Auch für sie gilt, daß sie nur eine Anweisung ausführt (oder auch nicht), es sei denn man definiert einen Block mit geschweiften Klammern. Natürlich ist auch else vorhanden, mit dem man eine alternative Anweisung ausführen lassen kann. switch() Für Mehrfachverzweigungen gibt es die Funktion switch. Jede einzelne Möglichkeit wird mit case abgefragt. Tritt dieser Fall ein, so wird der zugehörige Block ausgeführt. dieser sollte immer mit einem break enden. Falls keines der vielen case zutrifft, wird der mit default angegebene Block ausgeführt. break und continue break bricht die momentane Schleife ab, und verlässt sie (gilt auch fÜr for-, whiel- und do-Schleifen), während continue den momentanen Schleifen- durchlauf zwar auch abbricht, aber die Schleife mit dem nächsten Wert fortsetzt. /* Verzweigungen in C */ int x /* globale Variable */ main() $( printf("Öf if() und switch() Demo in CÖnÖn") printf("ÖtC-Kurs Nr.2 von C.BachÖnÖnÖn") for (x=1x<6x=x+1) $( printf("Önx hat den Wert %dÖn",x) if (x==3) printf("x==3Ön") if (x!=3) printf("x!=3Ön") if (x<=3) printf("x<=3Ön") if (x>=3) printf("x>=3Ön") if (x<3) printf("x<3Ön") if (x>3) printf("x>3Ön") else printf("x<=3 (else)Ön") switch(x) $( case 1 : $( printf(" x==1Ön") break $) case 2 : $( printf(" x==2Ön") break $) case 4 : $( printf(" x==4Ön") break $) default : $( printf("x==3 oder x==5Ön") break $) $) /* Ende von switch */ printf("ÖnÖtweiter mitÖn") getchar()/* warten auf Taste */ $) /* Ende von for */ $) /* Ende von main */ In diesem Beispiel durchläuft die Variable x die Werte von eins bis fünf. Je nachdem welcher Wert gerade in x steht, sind die Vergleiche wahr und es werden die entsprechenden Meldungen ausgegeben. Wenn nicht anders geklammert wurde, so bezieht sich ein else immer auf das nächstegelegene if. Die Bibliotheksfunktion getchar() wartet nur auf einen Tastendruck. Um mit ACE-C ein lauffähiges Programm zu erhalten, startet man vom DOS aus (ohne Basic booten) den Compiler ACEC.COM und gibt auf die Frage nach dem zu compilierenden Programm den Namen CKURS ein. Nach erfolgreicher Compilierung geht man mit RETURN wieder zurück ins DOS. Jetzt startet man den Linker LINK.COM. Hat man noch keine Link-Datei erstellt, so legt der Linker nach der Frage nach dem zu linkenden Zwischencode eine solche an. Anschließend wird die Datei gelinkt (d.h. die einzelnen Teile werden mit dem Runtime-Paket (ENGLOAD.OBJ) und der Bibliothek (ACECIO.CCC) verknüpft. Ist man wieder im DOS, so kann man das so erzeugte Programm laufen lassen (mit Load binary). Soll es auch als eigenständiges Programm lauffähig sein, so muß man in der Datei CKURS.LNK die Zeile ENGLOAD.OBJ durch ENGINE.OBJ ersetzen und nochmals linken. Das so entstandene Programm ist ca. 40 Sektoren länger, da das komplette Runtime-Paket mit eingebunden wurde. Das Beispiellisting dieses Kurses wurde auf diese Weise compiliert und gelinkt, und ist als CKURS.COM auf der Disk. Vom DOS aus (ohne Basic) kann man es mit L und Angabe des Namens laden und laufen lassen, ohne daß man ACE-C besitzt.