Anhang: Einführung in die Programmierumgebung Code::Blocks 1 Einleitung Professionelle Softwareentwicklung fordert heutzutage von den Entwicklern in stetig kürzer werdenden Entwicklungszyklen immer hochwertigere Produkte zu erstellen. Diese Produkte sollen zudem leicht erweiterbar und anpassbar sein. Neben einem fundierten Fachwissen, ausreichender Programmiererfahrung und der Kenntnis neuester Programmiertechnologien sind es vor allem auch die Wahl der richtigen Entwicklungsumgebung, die es dem Softwareentwickler ermöglichen die steigenden Anforderungen erfüllen zu können. Das wesentliche Lernziel des Praktikums „Grundlagen der Programmentwurfstechnik“ besteht darin, einerseits die in der Vorlesung vorgestellten Methoden der strukturierten Analyse anhand einer praktischen Aufgabenstellung auf den Entwurf eines komplexen Systems anzuwenden. Andererseits sollen die einzelnen Studententeams den Entwurf in ein lauffähiges Programm umsetzen. Ein weiteres Lernziel ist dabei den Prozess der Softwareentwicklung "zu erleben" und die vielfältigen Anforderungen an die Projektorganisation und -durchführung aus Praxissicht zu erfahren. Um diese Erfahrungen abzurunden wird auch der Einsatz einer integrierten SoftwareEntwicklungsumgebung (SEU) empfohlen. Hierzu wird den Studierenden die SEU Code::Blocks zur Verfügung gestellt. Die ersten beiden Praktikumstermine führen allgemein in die Struktur und den Aufbau einer SEU ein und demonstrieren deren Nutzung am Beispiel von Code::Blocks. 2 Integrierte Software Entwicklungs Umgebungen (SEU) Eine integrierte Softwareentwicklungsumgebung (engl.: IDE – Integrated Development Environment) unterstützt die Entwickler in nahezu allen Phasen des Software Lebenszyklus, ausgehend von der Anforderungsanalyse über den Entwurf und die Implementierung bis hin zum Test und zur Wartung. Üblicherweise bietet eine SEU unter einer einheitlichen Benutzeroberfläche verschiedene Werkzeuge an, wie z.B. Compiler, Editor, Debugger, Linker und Projekt Manager. Abhängig von der Komplexität bzw. Vollständigkeit der IDE werden auch Komponenten zur Online-Dokumentation, Textmustererkennung und Mehrbenutzer Support bereit gestellt. Neben einer Vielzahl kommerzieller Produkte sind auch freie SEU verfügbar. Die Wahl der „richtigen“ Programmierumgebung ist abhängig von der Art und der Größe des Projeks und wird zudem beeinflusst durch die Erfahrung aber auch den „Geschmack“ des Programmierers. Die „richtige“ SEU unterstützt die Programmierung, führt zu einer größeren Effizienz und steigert damit die Produktivität der Entwicklerteams und erhöht die Qualität des Endproduktes. 2 IDE Komponenten Als Kernkomponenten enthalten heutige SEU je einen Compiler, Debugger, Builder, Editor und Projekt Manager. Die allgemeine Funktion der einzelnen Komponenten wird nachfolgend beschrieben. Abbildung 1 IDE Kern Komponenten • Editor –Editoren dienen allgemein zur Texteingabe. Im Falle einer SEU handelt es sich bei dem Text um den Quellcode. Quellcode-Editoren bieten üblicherweise auch eine Unterstützung zur Überprüfung der Korrektheit der Syntax an sowie Funktionen zur Verbesserung der Lesbarkeit des Quellcodes. Die Editoren setzen hierzu Standards um, die die automatische und fehlerfreie Formatierung des Quelltextes unterstützen, zum Beispiel durch die automatische Einrückung des Textes oder die automatische Klammerplatzierung. Darüber hinaus kann die Korrektheit der Syntax durch die automatische Vervollständigung der Syntax erhöht werden, nebenbei reduziert sich dadurch die Schreibarbeit. Schließlich schaffen Features wie das Ein- und Ausblenden von Codeblöcken oder das Arrangieren mehrerer Editorfenster mehr Übersichtlichkeit. Im Sinne einer integrierten SEU kommt vor allem dem Zusammenwirken von Editor und Compiler eine besondere Bedeutung zu, um z.B. das inkrementelle Compilieren zu ermöglichen. • Projekt Manager – Der Projekt Manager unterstützt die Organisation der Informationen und der einzelnen Artefakte. Er bietet unterschiedliche Sichten (z.B. nach Klassentruktur) und Filtermöglichkeiten, die vor allem bei umfangreichen Projekten die Übersichtlichkeit steigern. Typisierte Suchfunktion, z.B. nach Klassen, Methoden und Attributen, erleichtern die sonst mühsame, textbasierte Suche. • Compiler – Heutzutage benötigt der Kompiliervorgang in SEUs nur einen Klick. Bei einigen SEUs wird der Quellcode fortlaufend im Hintergrund kompiliert, so dass eine sofortige Fehlererkennung möglich wird. Manche SEUs bieten inkrementelles Übersetzen an, wobei nur die geänderten Teile des Quellcodes übersetzt werden. • Build-Vorgang (Linker) – Die schrittweise, manuelle Erstelleung einer kompletten, ausführbaren Anwendung ist sehr komplex und aufwändig. Eine SEU verwendet dagegen einen automatisierten „Buildvorgang“. Dieser Buildvorgang kann durch einen einzigen Maus-Klick ausgeführt werden. 3 • Debugging – Um eine Analyse des Programmablaufs durchzuführen, kann ein schrittweises Debugging eingesetzt werden. Dieses Verfahren ermöglicht die Funktionsweise und die Logik jeder einzelner Zeile eines Quellcodes zu untersuchen. Eine verteilte Programmierung; bei der mehrere Teams an einem komplexen Projekt arbeiten, wird von Remote-Debugging unterstützt. Das Setzen, Entfernen und Auswerten von Haltepunkten im Quellcode wird durch das Zusammenspiel zwischen Editor und Debugger ermöglicht. Manche SEUs erlauben sogar eine grafische Darstellung der Werte, Parameter, Variablen usw. 3 Die SEU Code::Blocks (CodeBlocks) CodeBlocks ist eine integrierte SEU und Open-Source (http://www.codeblocks.org). Als Compiler unterstützt CodeBlocks unter anderem MinGW (Minimalistic GNU for Windows) Port der GCC (GNU Compiler Collection). CodeBlocks verfügt über Kernfunktionalitäten zum Editieren, Navigieren, Kompilieren, Builden und Debuggen. Die wesentlichen Features der CodeBlocks SEU umfassen: o die Benutzung GCC-basierter Compiler o integriertes Debugging o die Erstellung von Windows- und Console-Anwendungen, Static Libraries und DLLs o Syntax-Hervorhebung beim Editieren o Auto-Vervollständiger o Project Manager inkl. Klassen Browser, Funktionen Auflistung o Importieren von MSVC- und Dev-C++- Projekten möglich. 3.1 Die Benutzeroberfläche der SEU DevC++ Die im Praktikum zur Verfügung gestellte Version ist CodeBlocks v12.11. Die folgende Abbildung 2 stellt das Startfenster der SEU CodeBlocks dar. Abbildung 2 CodeBlocks Startfenster 4 Zum erstellen eines neuen Projekts wählt man "Create a new project" aus, dann den Projektypen (Abb. 3). Hier die gängigsten kurz erwähnt: • Console application: ein Programm ohne Benutzeroberfläche (GUI). Die Steuerung des Programmablaufs wird über textbasierte Befehle in eine Kommandozeile durchgeführt. • Win32 GUI project (für Windows): Die Programme und Dateien werden mit Hilfe einer grafischen Benutzeroberfläche abgebildet. Diese Benutzeroberfläche kann Symbole, Menüs oder Dialogfelder beinhalten. Der Benutzer kann diese Elemente mit der Maus oder über Tastaturbefehle markieren und aktivieren. • Static Library: Durch den Linker werden statische Bibliotheken nach dem Kompiliervorgang in einem eigenen Schritt mit dem ausführbaren Programm verbunden. Diese Bibliotheken beinhalten Funktionen, Klassen oder Ressourcen und können bei externen Programmen eingebunden werden. • Dynamic Link Library: Erst bei Bedarf wird eine dynamische Bibliothek in den Arbeitsspeicher geladen und mit dem ausführbaren Programm verbunden. Eine solche Bibliothek wird nur einmal im Speicher gehalten. • OpenGL project: Arbeiten mit erweiterten grafischen Eigenschaften sind hier möglich. Ein guter Einstieg in die Spieleprogrammierung (für Interessierte ;)) Abbildung 3 DevC++ GUI Nach Auswahl des Projekttypen folgt ihr einfach den Anweisungen des Wizards. (Typischerweise fehlt noch die Auswahl der Programmiersprache (C++), des Projektnamens und des Compilers (Hier einfach bei GNU GCC belassen). Nach Erstellen des Projekts ist nun links der Workspace mit dem Projekt abgebildet. Um die "Main"-Methode zu öffnen und mit dem programmieren zu beginnen ist ein Doppelklick auf „Sources“ und dann auf "main.cpp" nötig. Die IDE Kernfunktionalitäten die CodeBlocks unterstützt sind in Abbildung 4 dargestellt. 5 Abbildung 4 IDE Kernfunktionalitäten 3.1.1 Grundsätzliche Bedienung Hier eine kurze Übersicht der wichtigsten Funktionalitäten (Details folgen später) - Zum erstellen einer neuen Klasse: File → New → Class Hier optional: Definition von Argumenten, Superklassen, Klassen-Variablen, etc. - Build and run: Compilieren und Ausführen: Build → Build and run (Taste F9) - Debuggen: Nach dem setzen von Breakpoints / Haltepunkten: Zum starten und fortführen nach Breakpoints: Debug → Start/Continue (Taste F8) und zum abbrechen: Debug → Stop debugger (oder das rote X) (Taste Shift-F8) 6 3.1.2 Der Quellcode-Editor der SEU CodeBlocks Der in CodeBlocks integrierte Editor bietet Funktionalitäten zum Hervorheben der Syntax, zur Formatierung des Quellcodes und zur Anordnung mehrerer Editorfenster. Der Editor erkennt automatisch bestimmte Syntaxtypen und färbt dies entsprechenden Teile des Quellcodes in einer dem Typ zugeordneten Farbe ein. Beispielsweise wird der Header in Abbildung 5 grün dargestellt und eine String-Ausgabe in blau. Reservierte Wörter, wie int, return oder if, in dunkleren blau. Diese Hervorhebung kann unter Settings → Editor → "Syntax highlighting" geändert werden. Abbildung 5 Editorfenster Das Zusammenwirken zwischen Editor und Debugger ist durch die Möglichkeit zum Setzen von Haltepunkten gegeben. Ein Klick zwischen die Zeilennummer und den Zeilenanfang setzt einen Haltepunkt. Der in Abbildung 5 gesetzte Haltepunkt ist zum Beispiel rot hinterlegt. Die Formatierung des Quellcodes wird durch eine bedingte Einrückung der darauf folgenden Zeilen erleichtert. Nach der Eingabe einer Klammer „{“ und der Betätigung der „Enter“ (↵) – Taste wird diese Einrückung automatisch durchgeführt. Das Anzeigen mehrerer Editorfenster wird Reiterweise realisiert (siehe Abbildung 6). Abbildung 6 Reiter-weise Anzeige Mehrerer Editor Fenster CodeBlocks bietet Funktionen zum Ein- oder Ausblenden bestimmter Codeblöcke und liefert automatische Syntaxvervollständigung. 7 3.1.3 Der Projekt Manager Der Project-Manager Bereich bietet verschiedene Möglichkeiten und Sichten auf das Projekt an, die über einzelne Karteikartenreiter auswählbar sind. Über den Reiter „Projects“ erfolgt die Darstellung aller Artefakte eines Projekts. Der Projekt Manager Bereich unterstützt: • den Import und Export von Dateien • das Erstellen neuer Dateien, Ordner • das Entfernen von Dateien • das Setzen der Konfigurationsoptionen des Projekts (über rechten Maus-Klick) Innerhalb eines Projektes verwaltet CodeBlocks sämtliche Quellcode Dateien. 3.1.4 Compiler, Debugger und Builder Die Werkzeuge Compiler, Debugger und Builder sind über die Benutzeroberfläche durch eigene Symbole auswählbar. startet den Compiliervorgang und startet anschließend das Programm. startet das Debuggen / setzt das Debuggen nach einem Breakpoint fort. stoppt / bricht das Debuggen ab. Der Compiler in CodeBlocks wird nur aktiv sobald der Compiler-Button betätigt wird. Das Zusammenwirken zwischen Debugger und Editor ermöglicht beim Auftreten eines Fehlers durch Doppel-Klicken auf den gefundenen Fehler im Logfenster (siehe Abbildung 6), den Wechsel in das Editorfenster in dem die Zeile die den Fehler enthält farbig hervorgehoben ist. Abbildung 6 Logfenster Bedienung und Sinn des Debuggers: - Der Debugger dient dazu den eigenen Programmablauf nachzuvollziehen wenn man z.B. einen Fehler vermutet. Durch die Verfolgung des Codes mit dem Debugger können individuelle Code-Abschnitte untersucht werden. - Durch setzen von Breakpoints / Haltepunkten (Abb. 5) kann man dem Programmablauf folgen, während jeweils bei den Haltepunkten pausiert wird. Ein setzen von Haltepunkten ist z.B. sinnvoll wenn man dort einen Fehler vermutet oder wenn man sich die Iterationen einer Schleife anschauen möchte. - Zur besseren Programmablaufverfolgung können mehrere Haltepunkte gesetzt werden. - Um die Werteveränderungen von Variablen zu verfolgen muss zusätzlich folgendes Fenster geöffnet werden: Debug → Debugging Windows → Watches 8 4. Praktische Übungen Die folgenden praktischen Übungen sind von den Studierenden während der ersten beiden Praktikumstermine zu bearbeiten. Sie sollen in die Benutzung der SEU CodeBlocks einführen und einen Überblick über die bereitgestellten Funktionen und Unterstützungsmöglichkeiten geben. Weitere eigene Übungen sind möglich und wünschenswert um sowohl die Bedienung der Entwicklungsumgebung zu üben, deren Funktionsumfang zu erproben oder einfach um die eigenen Programmierkenntnisse aufzufrischen und zu vertiefen. 4.1 Erstellen eines Projektes. Erstellen Sie ein neues Projekt ("Console Application") mit dem Namen "Test-C-Projekt-1" und speichern sie es in einem Verzeichnis "TestProjekt1". 4.1a Wo haben sie das Verzeichnis "TestProjekt1" erzeugt? _________________________________________________________ 4.1b Welche Dateinamenerweiterung hat die Datei "Test-C-Projekt-1"? _________________________________________________________ 4.2. Erzeugen und Hinzufügen einer neuen Datei. Erstellen Sie eine neue Datei mit dem Namen "hello.cpp" manuell im Projektverzeichnis und fügen Sie diese acnschließend Ihrem Projekt hinzu. Löschen Sie dazu die automatisch generierte Datei "main.cpp". 4.2a Welchen Namen hat CodeBlocks standardmäßig nach dem Erzeugen einer neuen Datei dem Reiter Editor vergeben? _________________________________________________________ 4.2b Was müssen sie tun um den standardmäßig vergebenen Namen umzubenennen? _________________________________________________________ _________________________________________________________ 4.2c Erstellen Sie nun eine Klasse mithilfe von CodeBlocks (File → New → ). Was unterscheidet sich? Ist dies sinnvoller? _________________________________________________________ _________________________________________________________ 4.3 Syntax Eingabe. Geben Sie folgenden Programmcode im Editor Fenster ein: #include<stdio.h> #include<conio.h> int main () { printf (“Hello There! I’m back!!\n”); getch(); } 9 4.4 Programm Ausführung. 4.4a Speichern Sie das gesamte Projekt. Welche Dateien existieren und wo sind sie gespeichert? _________________________________________________________ _________________________________________________________ _________________________________________________________ _________________________________________________________ 4.4b Führen Sie nun das Programm aus. Notieren Sie die hierfür nötigen Schritte. _________________________________________________________ _________________________________________________________ _________________________________________________________ _________________________________________________________ 4.4c Sehen Sie sich die Projekt Optionen und die Compiler Einstellungen an. Verändern Sie einzelne Einstellungen und notieren sie deren Einfluss auf die Programmausführung. _________________________________________________________ _________________________________________________________ _________________________________________________________ _________________________________________________________ 4.5 Fehlersuche Gegeben sei das folgende Programm. #include<stdio.h> void main(void) { char Name[25]; printf("Hello! What's your name ? ); gets(Name) printf("\nWhat's your favourite colour? "); gets(Color); printf("\n%i's favourite colour is %s \n", Name, Color); getch(); } 4.5a. Erstellen Sie ein neues Projekt, bzw. eine neue Datei mit dem oben gezeigten Quelltext und compilieren Sie diese. Wie viele Fehler haben Sie festgestellt und wie lautet die richtige Syntax? 10 4.5b Speichern Sie die Datei erneut und setzen Sie Haltepunkte an folgenden Zeilen: gets(Name) und gets(Color). Führen Sie das Programm aus. Was ist der Unterschied zwischen "Continue" und "Next line"? 4.5c Entfernen Sie die Haltepunkte von 4.5b. Benutzen Sie "Run to cursor" als Haltepunkt, setzen Sie den Cursor an der Zeile gets(Color). Führen Sie das Programm noch einmal aus. Was passiert und was ist die Funktion? 11 4.6 Programmieraufgaben – Multi-Threading mit C Echtzeitsystemen sind dadurch charakterisiert dass sie ihre Aufgaben in vorgegebenen Zeitschranken lösen müssen. Dadurch entsteht oftmals der Bedarf, dass mehrere Aufgaben parallel ausgeführt werden müssen. Dies ist zum Beispiel dann der Fall, wenn ein System komplexe Berechnungen durchführen muss und dabei gleichzeitig auf Benutzereingaben oder andere Ereignisse reagieren soll. Zur Implementation der benötigten Parallelverarbeitung gibt es verschiedene Möglichkeiten. Mehrere Prozessoren Verteilung der Prozesse auf mehrere Prozessoren, die diese Prozesse dann parallel verarbeiten. In diesem Fall spricht man auch von "echter" Parallelität oder Hardwareparallelität. Diese Variante ist Teuer und nicht für alle Aufgabenstellungen angemessen. Hinweis: Die Core 2 Duo Technologie von Intel basiert basiert auf dem beschriebenen Prinzip. Multi-Tasking Multi-Tasking Systeme bieten eine günstige und effiziente Alternative zum Einsatz mehrerer Prozessoren. Bei einem Multitasking System wird die Rechenzeit eines einzelnen Prozessors -unter Einhaltung der Echtzeitbedingungen- auf alle zur Verarbeitung anstehenden Prozesse aufgeteilt. Zusätzlich können für die einzelnen Prozesse Prioritäten vergeben werden und so die Verteilung der Rechenzeit zusätzlich beeinflusst werden. Die Prozesse können unabhängig voneinander ausgeführt werden, da Sie auf verschiedene Ressourcen (Adressraüme) zugreifen. Multi-Threading Eine weitere Alternative besteht darin, Ausführungspfade einzelner Prozesse voneinander zu trennen, um diese parallel ausführen zu können. Die sogenannte Threads, auch Light Weight Processes (LWG) genannt, können sich im Gegenteil zu Prozessen den gleichen Adressraum teilen. So werden unnötige Speicherzugriffe und die aufwändige Interprozess-Kommunikationen. Eine feinere Granulierung der Ausführungseinheiten ermöglich dem Betriebssystem zusätzlich eine effizientere Verwaltung der Ressourcen, weil Threads, ähnlich wie bei Prozessen, auch auf mehrere Prozessoren verteilt werden können. Anmerkung: Im Rahmen des Praktikums kann der Einsatz von Multi-threading bei der Programmierung der Aufzugssteuerung sinnvoll sein 4.6.1 Aufgabenstellung Das Ziel dieser Aufgabe ist die Realisierung einer Aufgabe mit Multi-threading. Erstellen Sie zuerst einen Rechteck. Innerhalb dieses Rechtecks platzieren sie ein weiteres Objekt, z.B. ein kleineres Rechteck. Durch das Drücken der Tasten ↑, →, ↓, oder ← ändern Sie die Position des Objekts innerhalb des Rechtecks in die entsprechende Richtung. Eine mögliche Programmierrealisierung könnte wie folgt aussehen: 12 Abbildung 7 Programmbeispiel Für diese Aufgabe sind zwei Threads zu erstellen. Ein Thread wird für die Steuerung des Objekts benötigt, und ein Thread zur Entgegennahme und Verarbeitung der Tastatureingaben. 5. Weiterführende Quellen Code::Blocks Resource Site: http://www.codeblocks.org/ GNUs GPL (General Public License): http://www.gnu.org/copyleft/gpl.html 13