CC2

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)
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
  • ASCII GFX Dokumentation:
  • 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!

C Teil 5: Ausdrücke | | C Teil 7: Strukturen

Options: