Teil 6
← C Teil 5: Ausdrücke | ● | C Teil 7: Strukturen →
Wir lernen das Konzept von Zeigern, Adressen und Referenzen und den sog. Präprozessor kennen:
Zeiger & Adressen:
- Pointer, Null-Pointer
- Zeiger beinhaltet als Wert die Adresse von Variablen im Speicher (auch Referenz genannt)
- Adress-Operator &, Dereferenzierungs-Operator *
- Call-By-Value vs. Call-By-Reference
- Prinzip von Call-by-Value: Wertekopie erstellen
- Prinzip von Call-by-Reference: Originalwert adressieren
- Vorteile:
- Verwendung von Original nicht Kopie (Ich oder mein Zwilling?)
- Effizienter durch Nicht-Kopieren
- Zur Rückgabe mehrerer Werte
- Beispiel Swap-Funktion: void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
C-Präprozessor (für rein textuelle Ersetzungen vor der Übersetzung):
- #include … (textueller Datei-Import)
- #define … (textuelle Konstanten)
- #if/#ifdef … #else … #endif (konditionale Compilierung)
- #pragma once (Guard)
Praktikum:
Es sei folgender Code gegeben:
int x = 1, y = 0;
int *u = &x, *v = &y, **w = &v;
Evaluieren Sie von Hand auf einem Blatt Papier die folgenden Anweisungen der Reihe nach. Welche Werte haben dann nach jeder Anweisung jeweils x und y?
- *u = 0;
- *v = 1;
- v = u;
- *v = 2;
- *w = &y;
- *v = 3;
- *w = 0;
- *v = 0; Achtung: Fangfrage!
Wir verwenden das sog. ASCII GFX Framework für unser Spiel:
- Die Bibliothek stellt Sound- und Grafik-Effekte basierend auf NCurses zur Verfügung
- Ein Anwendungsbeispiel wäre z.B., einen Sound abzuspielen, wenn ein Ball gegen die Wand fliegt.
- Oder für die Grafik Sprites oder Scrolling zu verwenden - doch dazu später mehr…
- Verwenden der Bibliothek ASCII-GFX
- Herunterladen des Quellcodes von Sourceforge:
- Option 1) Per SVN die ganze Biblithek herunterladen:
- svn export https://svn.code.sf.net/p/ascii-gfx/code/ mygame
- mygame/main.cpp enthält ein rudimentäres Beispiel, das sich wie üblich mit “cmake . && make” übersetzen lässt.
- Ersetzen Sie das Beispiel durch Ihren eigenen Code, d.h. überschreiben Sie einfach das Hauptmodul main.cpp.
- Zusätzliche Module in CMakeLists.txt ergänzen
- Option 2) Nur den Quellcode der Bibliothek im eigenen Projekt ergänzen:
- svn export https://svn.code.sf.net/p/ascii-gfx/code/ ascii-gfx
- Zusätzliche Module in CMakeLists.txt ergänzen
- Option 1) Per SVN die ganze Biblithek herunterladen:
- Herunterladen des Quellcodes von Sourceforge:
- ASCII GFX Dokumentation:
- Overview: www.th-nuremberg.de/docs/html/index.html
- Basic Drawing: Dokumentation von gfx.h
- Sound: Dokumentation von sound.h
- Ncurses Dokumentation: NCurses Howto
Zum Verwenden der ASCII GFX Bibliothek machen wir folgende Modifikationen an unserem NCurses Quellcode:
Vorher (Ncurses) | Nachher (ASCII-GFX) |
---|---|
#include <ncurses.h> | #include "gfx.h" |
optional für Sound: #include "sound.h" | |
initscr() | init_gfx() |
optional für Sound: sound_init() | |
optional für Color-Terminal: init_color() | |
game_loop() | keine Änderung notwendig |
optional: sound_play("boing.wav") | |
optional: use_color(...) | |
optional für Sound: sound_exit() | |
endwin() | exit_gfx() |
Wenn Sie Sound wie z.B. mit sound_play("boing.wav")
abspielen wollen, achten Sie bitte darauf, dass Sie keine MP3s abspielen. Diese müssen vorher nach WAV konvertiert werden - z.B. mit dem Tool “ffmpeg”:
- ffmpeg -i sound.mp3 -acodec pcm_u8 -ar 11025 -ac 1 sound.wav
Weitere WAV Sounds gibt es z.B. hier:
Falls der Sound nicht abgespielt wird, so kontrollieren Sie bitte, ob der Pfad der Sound-Datei richtig angegeben ist wie z.B.: /home/roettger/mygame/boing.wav
Testweise kann man eine Sound-Datei auch wie folgt abspielen:
- ffplay boing.wav
Falls nicht sowieso bereits geschehen, wird die für Sound und Joystick erforderliche SDL Bibliothek wie folgt installiert:
- Ubuntu: sudo apt-get install libsdl1.2-dev libsdl-mixer1.2-dev joystick
- Mac: brew install SDL2 SDL2_mixer
Im Praktikum stellen Sie wie oben beschrieben auf ASCII-GFX um, testen den Sound und zeigen jeweils Ihren aktuellen Fortschritt bei der Umsetzung Ihrer Spieleidee. Bitte kontrollieren Sie auch, ob diese mit den Richtlinen für die Abgabe übereinstimmt.
Protokoll:
Beschreiben Sie mit Ihren eigenen Worten die Begriffe Zeiger, Adresse, Call-by-Value, Call-By-Reference, Präprozessor und Guards in Ihrem Übungsprotokoll.
Dokumentieren Sie Ihre Vorgehensweise während des Debuggens der obigen Handübung!
Fragen fürs Protokoll:
- Was passiert, wenn man den Null-Zeiger dereferenziert?
- Was passiert mit den Parametern bei Call-by-Value?
- Wofür benötigt man Call-by-Reference?
Hausaufgaben:
Dokumentieren Sie im Protokoll den jeweiligen Fortschritt bei der Umsetzung Ihres Spiels!