jetzt lerne ich Spieleprogrammierung mit DirectX Der einfache Einstieg in die C++-Programmierung CHRISTIAN ROUSSELLE Das erste Programm jetzt lerne ich KAPITEL 3 In diesem Kapitel lernen Sie den Umgang mit Code::Blocks kennen. Sie legen Ihr erstes Projekt an und schreiben ein erstes kurzes C++-Programm. 3.1 Einführung in Code::Blocks Studio Starten Sie Code::Blocks Studio über die Verknüpfung, die während der Installation angelegt wurde. Falls Sie keine Verknüpfung angelegt haben, können Sie das Programm auch über das Startmenü starten. Sie finden das Programm unter START/ALLE PROGRAMME/CODEBLOCKS/CODEBLOCKS. Wenn Sie das Programm zum ersten Mal starten, werden Sie zunächst gefragt, ob Sie C/C++-Dateien mit Code::Blocks verknüpfen wollen. Wenn Sie hier JA wählen, werden künftig alle C/C++-Dateien automatisch mit Code::Blocks geöffnet. Wenn Sie NEIN wählen, bleiben die bisherigen Verknüpfungen bestehen. Wenn Sie bislang keine IDE im Einsatz haben, können Sie den Dialog mit JA bestätigen. Als Nächstes sucht Code::Blocks nach Compilern, die auf Ihrem System installiert sind, und zeigt, wie in Abbildung 3.1 zu sehen, einen Dialog mit einer Liste der auf Ihrem System gefundenen Compiler. 31 jetzt lerne ich 3 Das erste Programm Abb. 3.1: Liste der von Code::Blocks gefundenen Compiler Wenn Sie das Visual C++ Toolkit 2003 installiert haben, sollte dieser Compiler in dem Dialog aufgelistet werden. Wenn dies der einzige Compiler ist, den Sie auf Ihrem System installiert haben, wird auch nur bei diesem der Status DETECTED angezeigt. Wählen Sie das Toolkit aus, klicken Sie auf SET AS DEFAULT und danach auf CLOSE. Dadurch wird das Visual C++ Toolkit 2003 als Standard-Compiler in Code::Blocks verwendet. Abb. 3.2: Code::Blocks IDE Nachdem Sie den Compiler ausgewählt haben, sehen Sie die eigentliche IDE (Abbildung 3.2). Im Fenster TIP OF THE DAY werden Ihnen Konfigurationsmöglichkeiten und Tipps zum Umgang mit Code::Blocks angezeigt. 32 Einführung in Code::Blocks Studio jetzt lerne ich Konfiguration von Code::Blocks Vor der Nutzung von Code::Blocks müssen Sie die IDE zunächst konfigurieren. Dazu gehören die Angabe des Pfads des Compilers, die Einstellung von Compiler-Optionen sowie die Angabe der Pfade für Header-Dateien und Libraries. Wählen Sie aus dem Menü BUILD den Eintrag COMPILER OPTIONS. Die folgende Abbildung zeigt den Konfigurationsdialog, der dann geöffnet wird. Abb. 3.3: Compiler-Einstellungen Wie in Abbildung 3.3 dargestellt, können Sie in diesem Dialog COMPILER FLAGS angeben. Wählen Sie folgende Einstellungen: 쐽 Enable warnings level 3 쐽 Maximize Speed 쐽 Enable C++ Exception Handling 쐽 __cdecl calling convention 쐽 Single-threaded Runtime Library Bei den hier vorgenommenen Einstellungen handelt es sich um die gleichen Compiler-Einstellungen, die auch von Visual C++.NET 2003 verwendet werden. Die erste Einstellung legt fest, dass Compiler-Warnungen ausgegeben werden. Compiler-Warnungen sind in verschiedene Klassen unterteilt. Dabei werden in Warning Level 3 alle Warnungen angezeigt, die Einfluss auf den Ablauf Ihres Programms haben können. Die Einstellung Maximize 33 jetzt lerne ich 3 Das erste Programm Speed sorgt dafür, dass der Compiler ein geschwindigkeitsoptimiertes Programm erzeugt. Die genaue Bedeutung der letzten drei Einstellungen sind schwer zu verstehen, wenn Sie bisher noch nicht intensiv mit einem Compiler gearbeitet haben. Dies stellt jedoch kein Problem dar, da diese Optionen zunächst keinen Einfluss auf Ihre Arbeit mit dem Compiler haben. Wenn die Option Enable C++ Exception Handling aktiviert ist, sind Sie in der Lage, einen speziellen C++-Mechanismus zu nutzen, um auf unvorhergesehene Fehlerzustände in Ihrem Programm zu reagieren. Mit der Einstellung der Calling convention legen Sie fest, auf welche Weise Parameter an Funktionen übergeben werden und wie Funktionsnamen zusammengesetzt werden. Die Option Single-threaded Runtime Library sollten Sie verwenden, wenn Sie Programme schreiben, die nicht mit mehreren Threads, d.h. mehreren parallelen Ausführungsebenen (Multithreading), arbeiten. In diesem Buch werden keine Programme entwickelt, die mit mehreren Ausführungsebenen arbeiten. 1 Wenn Sie an weiteren Informationen zu den Compiler-Einstellungen interessiert sind, können Sie diese auf der Website der MSDN-Library unter http://msdn.microsoft.com/library finden. Wie Sie das Hilfesystem nutzen, wird im Kapitel MSDN – das Hilfesystem erläutert. Nachdem Sie die COMPILER FLAGS eingestellt haben, empfiehlt es sich, die Verzeichnisse anzugeben, in denen der Compiler nach Header- und Bibliotheksdateien suchen soll. Wählen Sie dazu im Compiler SETTINGS-DIALOG den Reiter DIRECTORIES und dort den Reiter COMPILER. Stellen Sie hier den Pfad zu dem Ordner include des Platform SDK ein (siehe Abbildung 3.4). Dort sollte sich bereits der Pfad zum include-Ordner des Visual C++ Toolkit 2003 befinden. Wenn dies nicht der Fall ist, ergänzen Sie den Pfad, wie in Abbildung 3.4 dargestellt. Achten Sie auch darauf, dass die Pfade in der gleichen Reihenfolge wie in der Abbildung angegeben werden. Die Reihenfolge können Sie über die beiden Pfeile an der rechten Seite ändern. Wechseln Sie danach zum Reiter LINKER (unterhalb des Reiters DIRECTORIES) und geben Sie dort, wie in Abbildung 3.5 zu sehen, die Pfade zu den libOrdnern des Platform SDK und des Visual C++ Toolkit 2003 an. Auch hier sollte der Pfad zum Visual C++ Toolkit 2003 schon vorhanden sein. 34 Einführung in Code::Blocks Studio jetzt lerne ich Abb. 3.4: Einstellung des Ordners für IncludeDateien Abb. 3.5: Einstellung des Ordners für Bibliotheksdateien 35 3 Das erste Programm jetzt lerne ich Nachdem Sie den COMPILER SETTINGS-Dialog mit OK bestätigt haben, ist die Konfiguration von Code::Blocks abgeschlossen. Klicken Sie als Letztes auf den Menüpunkt SETTINGS und wählen Sie dort den Punkt ENVIRONMENT. Wechseln Sie in dem Dialogfenster, das daraufhin angezeigt wird, in den Reiter VIEW und stellen Sie sicher, dass der Punkt OPEN BLANK WORKSPACE gesetzt ist (siehe Abbildung 3.6). Abb. 3.6: Änderung der WorkspaceEinstellungen Die Auswahl dieser Option erleichtert die Projektverwaltung von Code:: Blocks. 1 In den nächsten Kapiteln, beispielsweise wenn die Windows- und DirectX-Programmierung vorgestellt wird, müssen Sie noch weitere Compiler-Einstellungen in Code::Blocks vornehmen. 3.2 Projekte anlegen Um in Code::Blocks ein Programm zu entwickeln, müssen Sie zunächst ein Projekt anlegen. In einem Projekt werden alle Dateien zusammengefasst, die für das ausführbare Programm benötigt werden. Außerdem legen Sie in den Projekteinstellungen Compiler- und Linker-Optionen für das zu erstellende Programm an. Es empfiehlt sich, einen Ordner für alle Projekte, die Sie im Laufe der Lektüre dieses Buchs entwickeln werden, anzulegen. Dies könnte beispielsweise der Pfad C:\ENTWICKLUNG sein. Alternativ können Sie auch einen Ordner ENTWICKLUNG im Ordner EIGENE DATEIEN anlegen. Um ein Projekt anzulegen, wählen Sie aus dem FILE-Menü in Code::Blocks den Eintrag NEW PROJECT. Alternativ können Sie auch nach dem Starten von Code::Blocks auf CREATE A NEW PROJECT im Reiter START HERE klicken. Danach erscheint folgender Dialog: 36 Projekte anlegen jetzt lerne ich Abb. 3.7: Neues Projekt anlegen Die Abbildung zeigt einen Dialog, in dem Sie die Art Ihres Projekts festlegen. Jeder dieser Einträge symbolisiert eine spezielle Projekt- bzw. Anwendungsart. Der Zweck dieser Projektauswahl ist es, dem Programmierer Arbeit abzunehmen. Code::Blocks ist in der Lage, ein Gerüst für jede dieser Anwendungsarten zu erzeugen. Dieses Gerüst muss der Programmierer noch erweitern und an seine eigenen Bedürfnisse anpassen. Wenn Sie beispielsweise eine Windows-Anwendung erstellen wollen, in der ein Fenster angezeigt wird, wählen Sie hier den Projekttyp WIN32 GUI APPLICATION. Mehr zum Thema Windows-Anwendungen erfahren Sie im Kapitel Grundlagen der Windows-Programmierung. Für den Anfang arbeiten Sie zunächst mit Konsolenanwendungen. 1 Wählen Sie in diesem Dialog eine CONSOLE APPLICATION und achten Sie darauf, dass das Häkchen DO NOT CREATE ANY FILES gesetzt ist. Geben Sie den Pfad, z.B. C:\ENTWICKLUNG an, in dem das Projekt angelegt werden soll. Außerdem müssen Sie einen Projektnamen festlegen. Nennen Sie das Projekt, wie in der Abbildung gezeigt, HELLO WORLD. Es ist eine Art Tradition, das erste Programm in einem Buch, das sich mit Programmiersprachen beschäftigt, so zu nennen. 37 jetzt lerne ich 3 Das erste Programm Nachdem Sie auf CREATE geklickt haben, erscheint, wie in der folgenden Abbildung zu sehen, ein weiterer Dialog. Abb. 3.8: Festlegen des Standardverzeichnisses Mithilfe dieses Dialogs können Sie festlegen, dass der Pfad C:\ENTWICKLUNG künftig als Standardpfad für neue Projekte verwendet wird. Bestätigen Sie diesen Dialog durch Drücken auf den JA-Knopf. Daraufhin wird das Projekt angelegt und die Code::Blocks-IDE hat das in Abbildung 3.9 gezeigte Aussehen. Wie Sie sehen, ist die IDE in Komponenten aufgeteilt, deren Funktion im Folgenden erläutert wird. Abb. 3.9: Code::Blocks nach dem Anlegen des Projekts 38 Projekte anlegen jetzt lerne ich Standardsymbolleiste Die Standardsymbolleiste enthält bekannte Windows-Funktionen wie Öffnen, Speichern, Kopieren, Einfügen, Wiederherstellen, Suchen und Ersetzen. Sie finden hier aber auch Buttons zum Anlegen neuer Projekte oder Dateien. Compiler-Leiste Diese Leiste ermöglicht den schnellen Zugriff auf die Compiler-Funktionen von Code::Blocks. Sie können das Programm, das Sie entwickeln, so auf einfache Weise übersetzen und ausführen. Debugger-Leiste Über diese Leiste haben Sie schnellen Zugriff auf Debugging-Funktionen. Mit diesen Funktionen können Sie Ihre Programme überwachen oder bis zu vorher definierten Haltepunkten ausführen lassen. Momentan stehen Debugging-Funktionalitäten in Code::Blocks für das Visual C++ Toolkit 2003 noch nicht zur Verfügung. Projektmanager Der Projektmanager zeigt den Arbeitsbereich mit allen momentan geöffneten Projekten an. Außerdem erhalten Sie hier Informationen über verschiedene Eigenschaften der Projekte. Dazu gehört beispielsweise eine Liste aller momentan geöffneten Dateien. Sie können sich außerdem alle zu einem Projekt gehörenden Dateien anzeigen lassen. Zudem werden hier Symbole wie z.B. Funktions-, Klassen- oder Variablennamen angezeigt. Editorbereich Im Editorbereich erledigen Sie alle Aufgaben, die die Bearbeitung von Quellcode betreffen. Hier geben Sie den Quellcode für Ihre Programme ein und überarbeiten diese. Der Quellcode wird dabei von Code::Blocks farblich aufbereitet. Es ist möglich, mehrere Quelltextfenster gleichzeitig im Editorbereich zu öffnen. Mit Hilfe des Projektmanagers ist es außerdem möglich, an bestimmte Quelltextstellen zu springen. Ausgabebereich Im Ausgabe- oder Nachrichtenbereich werden Informationen über den Fortschritt der Kompilierung und des Linkens ausgegeben. Hier werden auch Warnungen und Fehler angezeigt, die beim Übersetzen des Programms aufgetreten sind. Außerdem können Sie sich hier die Ergebnisse einer Suche anzeigen lassen. 39 3 Das erste Programm jetzt lerne ich 3.3 Hello World Es ist endlich so weit! In diesem Abschnitt schreiben Sie Ihr erstes Programm. Dazu müssen Sie zunächst eine Quellcodedatei anlegen. Wählen Sie im FILE-Menü von Code::Blocks NEW FILE. Nun erscheint ein Dialog, in dem Sie den Pfad und den Namen der neuen Datei angeben müssen. Abb. 3.10: Neue Datei anlegen Wenn Sie sich noch nicht im gleichen Verzeichnis befinden, in dem Sie das Projekt angelegt haben, wechseln Sie dorthin und ändern Sie den Namen der Datei von UNTITLED1 in HELLO WORLD.CPP (siehe Abbildung 3.10). Klicken Sie auf SPEICHERN. Danach erscheint der folgende Dialog, in dem Sie entscheiden müssen, ob die neu angelegte Datei zum Projekt hinzugefügt werden soll. Bestätigen Sie diesen Dialog mit JA. Abb. 3.11: Erstellte Datei zum Projekt hinzufügen? Code::Blocks öffnet jetzt ein neues, leeres Fenster mit dem Titel HELLO WORLD.CPP. cpp steht dabei für C++ (C-Plus Plus) und ist die Standarderweiterung für C++-Quellcodedateien. Das folgende Listing enthält das Programm Hello World. 40 Hello World #include <iostream> using namespace std; int main(void) { cout << "Hello World\n"; } jetzt lerne ich Listing 3.1: Das erste Programm Hello World Geben Sie das Programm aus Listing 3.1 in das Quelltextfenster mit dem Titel HELLO WORLD.CPP ein. Achten Sie bei der Eingabe unbedingt auf die richtige Schreibweise. C++ ist case-sensitive. Das bedeutet, dass in C++ zwischen Groß- und Kleinschreibung unterschieden wird. Klicken Sie nach der Eingabe des Programms auf den blauen Button mit dem Zahnradsymbol, das Sie in der Compiler-Leiste finden, um das Programm zu übersetzen. Alternativ dazu können Sie auch Ÿ+Ñ drücken. Code::Blocks kompiliert das Programm und erstellt die ausführbare Datei Hello World.exe. Wenn sich bei der Eingabe des Programms ein Fehler eingeschlichen haben sollte, wird der Compiler an der betreffenden Stelle eine Fehlermeldung ausgeben. Verbessern Sie den Fehler und übersetzen Sie das Programm danach erneut. Bei fehlerfreier Kompilierung erscheinen die folgenden Meldungen im Ausgabebereich von Code::Blocks. Abb. 3.12: Ausgabebereich nach erfolgreicher Kompilierung Jetzt können Sie das Programm ausführen. Klicken Sie dazu auf das PlaySymbol, das Sie ebenfalls in der Compiler-Leiste finden. Alternativ können Sie auch Ÿ+Ò drücken oder RUN aus dem COMPILE-Menü wählen. Danach wird das Programm in einem Kommandozeilenfenster, wie in der folgenden Abbildung dargestellt, ausgeführt. 41 3 Das erste Programm jetzt lerne ich Abb. 3.13: Das Programm Hello World in Aktion Das Fenster bleibt so lange offen, bis Sie die þEnterÿ- bzw. Æ-Taste drücken. 1 Sie können das Programm auch ausführen, indem Sie in das Verzeichnis wechseln, in dem sich das Projekt Hello World befindet. Dort finden Sie eine Datei mit dem Namen Hello World.exe, die Sie starten können. Das Programm lässt sich also auch ohne Code::Blocks wie eine normale Anwendung ausführen. Nachdem Sie nun gesehen haben, was beim Ausführen und Übersetzen des Programms geschieht, sollten Sie einen genaueren Blick auf das Programm werfen, damit Sie verstehen, was der Quellcode bedeutet: Listing 3.2: Hello World mit Zeilennummerierung 01: 02: 03: 04: 05: 06: 07: 08: #include <iostream> using namespace std; int main(void) { cout << "Hello World\n"; } Das Listing ist hier mit Zeilennummern dargestellt. Die Nummerierung dient lediglich dazu, gezielt auf bestimmte Zeilen im Code eingehen zu können und diese näher zu erläutern. Sie dürfen die Zeilennummern (und die Doppelpunkte) nicht eingeben. In C++ sind Zeilennummerierungen, anders als z.B. in alten Versionen von Basic, nicht vorgesehen und führen zu Fehlermeldungen. 42 Hello World jetzt lerne ich Reservierte Wörter und Schlüsselwörter Die erste Zeile enthält die Anweisung #include <iostream>. Wie Sie vielleicht festgestellt haben, stellt Code::Blocks #include in grüner Schrift dar. Alle bekannten C++-Anweisungen und Schlüsselwörter werden in Code::Blocks farblich hervorgehoben. Schlüsselwörter sind Wörter, die zum Sprachumfang von C++ gehören und jeweils eine bestimmte definierte Bedeutung haben. Mit #include <iostream> wird die Datei iostream mit in den Kompilierungsvorgang eingebunden. Die Datei iostream gehört zum Funktionsumfang von C++ und bietet beispielsweise die Möglichkeit, Zeichen auf den Bildschirm auszugeben oder Eingaben von der Tastatur entgegenzunehmen. Die Raute (#), gefolgt von einer Anweisung, veranlasst den Präprozessor – ein Hilfsprogramm, das vor der eigentlichen Kompilierung ausgeführt wird –, den Quellcode zu modifizieren. Der Präprozessor ersetzt dabei die Zeile #include <iostream> durch den Inhalt der Datei iostream. Erst danach führt der Compiler die Übersetzung des Quellcodes durch. Die dritte Zeile enthält die Anweisung using namespace std;. Diese Anweisung sorgt dafür, dass Sie die Funktionen, die in der Datei iostream definiert sind, verwenden können. Für den Moment müssen Sie diese zugegebenermaßen unbefriedigende Erklärung akzeptieren. Wie Sie später im Kapitel über die C++ Standard Library und Namespaces sehen werden, hat diese Anweisung eine ganz bestimmte Bedeutung. 1 Das eigentliche C++-Programm beginnt in der fünften Zeile mit der main()Funktion. Jedes C++-Programm verfügt über eine main()-Funktion. Diese Funktion wird immer als Erstes beim Start eines Programms ausgeführt. Eine Funktion in C++ ist ein zusammengehöriger Quellcodeteil, der aus einer oder mehreren Anweisungen besteht. Dieser Quellcodeteil wird in geschweifte Klammern {...} gefasst. Einen durch {...} zusammengefassten Programmteil bezeichnet man auch als Block. Direkt vor der main()-Funktion steht das Schlüsselwort int. Dieses Schlüsselwort gibt an, dass die main()-Funktion einen Wert vom Typ int zurückgibt. Bei diesem Typ handelt es sich um einen Ganzzahltyp. In C++ muss die main()-Funktion einen Wert vom Typ int zurückgeben. Der Rückgabewert der main()-Funktion gibt meist Auskunft darüber, ob das Programm erfolgreich beendet werden konnte oder ob ein Fehler während der Ausführung aufgetreten ist. Der Wert wird dabei direkt an das Betriebssystem bzw. an das aufrufende Programm zurückgegeben. 43 jetzt lerne ich 1 3 Das erste Programm Im Normalfall müssen Sie das Schlüsselwort return verwenden, um Werte aus Funktionen zurückzugeben. Die main()-Funktion bildet eine Ausnahme. Wenn Sie hier keinen Rückgabewert angeben, wird der Wert 0 automatisch zurückgegeben. Näheres zu Rückgabewerten erfahren Sie im Kapitel Funktionen. Das Schlüsselwort void in runden Klammern nach main bedeutet, dass das Programm Hello World (genauer die Funktion main()) keine Argumente berücksichtigt, die eventuell durch das Betriebssystem oder ein anderes aufrufendes Programm übergeben werden. Dieses Schlüsselwort heißt so viel wie »leer« und wird Ihnen noch häufiger bei der Programmierung in C++ begegnen. 1 Sie haben sicher schon einmal ein Programm mit Kommandozeilenargumenten gestartet, also einem Programm beim Aufruf Argumente mitgegeben, um die Wirkungsweise des Programms zu beeinflussen. Ein Beispiel ist format a:. Dieser Aufruf sorgt dafür, dass eine Diskette formatiert wird. format ist hier der Name des Programms und a: das Argument, das in diesem Fall festlegt, dass das Laufwerk a: formatiert werden soll. Im Beispielprogramm Hello World besteht die main()-Funktion nur aus einer Anweisung in der siebten Zeile. 7: cout << "Hello World\n"; Die Anweisung cout << "Hello World\n"; gibt die Zeichenkette Hello World auf den Bildschirm aus. Der Backslash \ (§+ß), gefolgt von dem kleinen n (\n) ist ein C++-Steuerzeichen und bewirkt einen Zeilenumbruch. Zeichenketten werden auch Strings genannt und müssen in C++ in doppelte Anführungszeichen (Á+2) eingeschlossen werden. cout steht für character out und sorgt für die Ausgabe auf den Bildschirm. Der Ausgabeoperator (<<) gibt an, dass die Zeichenfolge Hello World an cout geleitet und somit auf den Bildschirm ausgegeben werden soll. Der Einfügeoperator besteht aus zwei sich öffnenden spitzen Klammern. Das letzte Zeichen in der siebten Zeile ist ein Semikolon (;). Sie müssen alle Anweisungen in C++ mit einem Semikolon abschließen. Die geschweifte Klammer in Zeile 8 schließt die main()-Funktion und damit das Programm ab. 44 Hello World cout ist ein Objekt. Objekte spielen in C++ eine zentrale Rolle. Was es mit Objekten genau auf sich hat, werden Sie im Kapitel über objektorientierte Programmierung erfahren. Momentan müssen Sie nur wissen, dass man cout für die Ausgabe verwenden kann. jetzt lerne ich 1 Formatierung des Quelltextes Mit Formatierung wird das Erscheinungsbild des Quelltextes bezeichnet. Die Formatierung geschieht dabei durch Whitespace-Zeichen. Bei WhitespaceZeichen handelt es sich um alle Zeichen, die keine sichtbare Darstellung besitzen. Dazu gehören im Wesentlichen Leerzeichen (þLeertasteÿ), der Tabulator (Å) und Zeilenumbrüche (Æ). In C++ ist es nicht notwendig, jede Anweisung in eine eigene Zeile zu schreiben oder durch Leerzeichen zu trennen. Man könnte das Programm Hello World auch folgendermaßen schreiben: Listing 3.3: Hello World mit unüberSie könnten das Programm auch auf zwei Zeilen kürzen, indem Sie die Zei- sichtlicher Forlen 2 und 3 zu einer zusammenfassen. Der C++-Compiler übersetzt auch matierung solche Programme anstandslos. Die Form ist für den Compiler bedeutungslos, nur die korrekte Syntax ist wichtig. Eine korrekte Syntax sagt aber noch nichts darüber aus, ob das Programm auch tatsächlich wie gewünscht funktioniert. 1: #include <iostream> 2: using namespace std; int main(void){ 3: cout << "Hello World\n";} Syntax und Semantik Die Begriffe Syntax und Semantik stammen aus dem Bereich der Informatik und betreffen den Aufbau bzw. die inhaltliche Bedeutung eines Programms. Wenn ein Programm übersetzt werden kann, ohne dass der Compiler Fehler meldet, ist das Programm bezüglich seiner Syntax korrekt. Das heißt, dass das Programm richtig aufgebaut ist und keine Eingabefehler enthält. In einer natürlichen Sprache entspräche dies einem Text mit korrekter Rechtschreibung und korrektem Satzbau. Unter der Semantik eines Programms kann man sich dessen inhaltliche Bedeutung vorstellen. Die Bedeutung kann z.B. eine Funktion sein, die das Programm berechnet. Damit ein Programm die beabsichtigten Ergebnisse erzielt, müssen sowohl Syntax als auch Semantik korrekt sein. Ein Programm kann also eine korrekte Syntax aufweisen, aber trotzdem nicht das beabsichtigte Ergebnis liefern. Stellen Sie sich beispielsweise ein Programm vor, das entwickelt wurde, um die Fläche eines Kreises zu berechnen. Angenommen, der Programmierer hat keine syntaktischen Fehler be- 45 3 Das erste Programm jetzt lerne ich gangen, aber die Formel zur Berechnung der Kreisfläche mit der für den Kreisumfang verwechselt. Der Compiler übersetzt dann das Programm ohne Fehlermeldung, da es bezüglich der Syntax korrekt ist. Da das Programm aber mit einer falschen Formel arbeitet, führt dies zu einem unerwünschten Ergebnis. 1 Eine Schreibweise wie in Listing 3.3 ist nur schwer zu verstehen. Sie sollten daher Ihre Programme so formatieren, dass sie gut lesbar sind. Dabei empfiehlt es sich vor allem, Leerzeilen zu verwenden, im Allgemeinen nicht mehrere Anweisungen in eine Zeile zu schreiben und mit Einrückungen zu arbeiten. Kommentare Kommentare sind ein weiteres wichtiges Mittel, um den Quellcode besser lesbar und verständlicher zu gestalten. Mit Kommentaren lassen sich Erklärungen und Hinweise im Quelltext anbringen. In der Praxis versteht man einen Quellcode, auch wenn man ihn selbst geschrieben hat, nach einiger Zeit nicht mehr sofort. Kommentare helfen dann, die Bedeutung des Quelltextes schneller zu erfassen. Nahezu unverzichtbar sind Kommentare, wenn mehrere Programmierer an einem Projekt arbeiten, da es erfahrungsgemäß recht schwer ist, sich in die Denkweise anderer Programmierer zu versetzen. Hier sollten die Kommentare das Wesentliche erklären, so dass die Funktionsweise der Quellcodestellen schnell nachvollzogen werden kann. In C++ gibt es zwei Arten von Kommentaren. Der Unterschied ist, dass die eine Variante sich jeweils nur auf eine Zeile bezieht und die andere Variante das Anbringen von mehrzeiligen Kommentaren erlaubt. Kommentare, die nur bis zum Ende der Zeile gültig sein sollen, werden mit zwei Schrägstrichen // (Á+7) eingeleitet. Mehrzeilige Kommentare beginnt man dagegen mit /* und man beendet sie mit */. Listing 3.4 zeigt das Programm Hello World, diesmal mit Kommentaren versehen. Listing 3.4: Hello World mit Kommentaren versehen 46 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: /* Programmname : Hello World Gibt den String Hello World auf den Bildschirm aus und wartet auf Enter */ #include <iostream> using namespace std; Hello World 12: 13: 14: 15: 16: 17: jetzt lerne ich // Hier beginnt das Hauptprogramm int main(void) { cout << "Hello World\n"; /* HelloWorld ausgeben */ } Die erste Zeile enthält die Zeichenfolge /*, die einen Kommentar einleitet, der sich über mehrere Zeilen erstrecken kann. Danach folgt ab der zweiten Zeile eine Beschreibung des Programms. In der sechsten Zeile endet der Kommentar mit */. In Zeile 12 steht ein Kommentar, der mit // eingeleitet wird und auch nur in dieser Zeile gültig ist. Zeile 16 zeigt, dass man die Syntax für einen Mehrzeilenkommentar auch in nur einer Zeile verwenden kann. Wie Sie sehen, ist es möglich, Kommentare für längere Beschreibungen zu nutzen (siehe Zeile 1 bis 6 in Listing 3.4). Bei der Verwendung von Kommentaren können Sie diese sowohl in separate Zeilen schreiben (wie in Zeile 12 demonstriert) als auch hinter Anweisungen in der gleichen Zeile (Zeile 16). Kommentare werden bei der Kompilierung ignoriert und haben daher keine Auswirkung auf Speicherbedarf und Geschwindigkeit des resultierenden, ausführbaren Programms. Sie können die Kommentare einfach in Ihr bereits bestehendes Programm einfügen. Wenn Sie das Programm verändert haben, sollten Sie die Datei speichern. Dies geschieht am einfachsten über das Diskettensymbol in der Standardsymbolleiste von Code::Blocks. Nach dem Speichern der Datei sollten Sie nicht vergessen, das Projekt zu speichern. Wenn Sie ein neues Projekt anlegen, wie Sie es für Hello World getan haben, enthält es zu Beginn keine Dateien. Durch das Hinzufügen der cpp-Datei Hello World.cpp wurde das Projekt geändert. Aus diesem Grund fragt Code::Blocks beim Beenden, ob Sie das Projekt speichern wollen. Beantworten Sie diese Frage mit JA. Danach können Sie das Projekt Hello World jederzeit wieder laden, indem Sie die Datei Hello World.cbp öffnen. Alternativ können Sie das Projekt auch direkt speichern, indem Sie aus dem PROJECT-Menü den Eintrag SAVE PROJECT wählen. Neben Projekten kann Code::Blocks außerdem Workspaces verwalten. In einem Workspace lassen sich mehrere Projekte zusammenfassen. Dies ist komfortabel, wenn Sie gleichzeitig an mehreren Projekten arbeiten und schnell zwischen den Projekten wechseln wollen. Workspaces können, wie Projekte auch, über das FILE-Menü geladen und gespeichert werden. 1 47 3 Das erste Programm jetzt lerne ich Fehler während der Kompilierung Zum Abschluss soll noch ein Blick darauf geworfen werden, was geschieht, wenn ein Programm einen syntaktischen Fehler aufweist. Sehen Sie sich Listing 3.5 an. Listing 3.5: Quelltext mit einem Tippfehler in Zeile 16 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: /* Programmname : Fehler Dieses Programm enthält einen Fehler in Zeile 16 */ #include <iostream> using namespace std; // Hier beginnt das Hauptprogramm int main(void) { cout << "Fehler\n" /* HelloWorld ausgeben */ } In der 16. Zeile fehlt das Semikolon, das die cout-Anweisung abschließt. Wenn Sie dieses Programm kompilieren, tritt ein Fehler auf. Abb. 3.14: Fehlermeldung beim Kompilieren Abbildung 3.14 zeigt den Ausgabebereich von Code::Blocks. Hier meldet der Compiler korrekterweise, dass ein Semikolon fehlt. Wenn Sie auf die Fehlermeldung doppelklicken, steuert Code::Blocks die fehlerhafte Zeile automatisch an. Sie sehen, dass der Kommentar bei der Kompilierung nicht berücksichtigt wird, da der Compiler den Fehler vor der schließenden geschweiften Klammer und nicht schon vor dem Kommentar meldet. Dass der Compiler den Fehler in Zeile 17 meldet und nicht die eigentlich fehlerhafte Zeile 16 moniert, liegt daran, dass Fehler erst als solche erkannt werden, wenn ein falsches oder unerwartetes Zeichen auftaucht. Das Semikolon könnte durchaus noch in der nächsten Zeile, also der 17. Zeile, fol- 48 Zusammenfassung jetzt lerne ich gen. Da aber hier eine geschweifte Klammer steht und damit die main()Funktion beendet wird, ohne dass die aktuelle Anweisung mit einem Semikolon abgeschlossen wird, meldet der Compiler jetzt einen Fehler. Es kann mitunter schon vorkommen, dass der Compiler sehr viele Fehlermeldungen erzeugt, obwohl Sie sich nur einmal vertippt oder nur ein Zeichen vergessen haben. Das liegt daran, dass ein Fehler sehr viele Folgefehler erzeugen kann. Fehlende Klammern sind ein häufiger Grund für solche Fehler. 3.4 1 Zusammenfassung In diesem Kapitel haben Sie gelernt, wie Sie ein Projekt in Code::Blocks anlegen, wie Sie Dateien zu dem Projekt hinzufügen, Code in das Quelltextfenster eingeben, den Quelltext übersetzen und gegebenenfalls Fehler korrigieren. Sie haben erfahren, dass jedes C++-Programm über eine main()-Funktion verfügt und dass man mithilfe von cout Zeichenketten auf den Bildschirm ausgeben kann. Sie haben gelernt, dass C++ case-sensitive ist und dass der Präprozessor den Quellcode noch vor der Übersetzung durch den Compiler verändert. Kommentare und eine entsprechende Formatierung machen Quellcodes besser lesbar und so leichter verständlich. Sie sollten Kommentare deshalb gezielt zur Erläuterung Ihrer Programme einsetzen. 3.5 Fragen 1. Was bewirkt die Anweisung #include <iostream>? 2. Was bedeutet der Begriff case-sensitive? 3. Wozu werden Kommentare eingesetzt? 4. Was ist unter den Begriffen Syntax und Semantik zu verstehen? Die Antworten finden Sie in Anhang A. 49