Teil 2
← C Teil 1: Main & NCurses | ● | C Teil 3: NCurses Basics →
Wir werden anhand eines einfachen Programmbeispiels die folgenden Begrifflichkeiten kennenlernen:
- C Module bzw. Modularisierung
- Vorwärtsdeklarationen
- Implementierung und Prototypen
- Symbole und Referenzen
- Undefinierte Referenzen (Kommandozeilen-Tool nm)
- Compilieren, Linken (Kommandozeilen-Tool “gcc -c” und “gcc -o”)
- Bibliotheken
Ausgangs-Code als Beispiel für die Modularisierung: main.cpp CMakeLists.txt
#include <unistd.h> // for sleep()
#include <ncurses.h> // for ncurses functions
// forward declaration (prototype) of function
int myflash();
// main function
int main()
{
// init
initscr();
clear();
// render flash with ncurses
int c = myflash();
// restore initial window
endwin();
printf("The value of i is %d\n", c);
return(0);
}
// implementation of function
int myflash()
{
int i;
const int n = 3;
for (i=0; i<n; i++)
{
flash();
refresh();
clear();
refresh();
sleep(1);
}
return(i);
}
Angenommen, wir wollen ein weiteres Modul implementieren, was die Funktion msleep() als Weiterentwicklung von sleep() enthalten soll:
// sleep for a period of time given in milli seconds
void msleep(float ms)
{
int us = ms*1000; // micro secs
usleep(us);
}
- Wir benötigen für die Modularisierung ein neues Nebenmodul bestehend aus den Dateien module.cpp (Implementierung) und module.h (Header), in welche z.B. die Funktion myflash() wandern kann oder eine weitere Funktion wie z.B. msleep() implementiert werden kann:
- module.cpp muss die Implementierung z.B. von myflash() enthalten
- module.h muss den Prototypen (bzw. die Vorwärtsdeklaration oder auch Signatur) z.B. von myflash() enthalten
- module.cpp und main.cpp müssen entsprechende #includes der Header enthalten
Dann sind die Schritte zum Ãœbersetzen mit CMake:
- Alle zusätzlichen Dateien in CMakeLists.txt eintragen (nur HDRS und SRCS anpassen)
- cmake .
- make VERBOSE=1
Bzw. dann sind die manuellen Schritte zum Ãœbersetzen:
gcc -c main.cpp
gcc -c module.cpp
gcc main.o module.o -lncurses -o main
Durch die Modularisierung wird der Quelltext nicht nur in handhabbare Scheibchen zerlegt, sondern es erfolgt dadurch auch die Trennung von Implementierung und Anwendung (Aufruf).
NB: Eine Bibliothek ist nicht anderes als eine Sammlung von mehreren Modulen.
Praktikum:
Ãœbersetzen Sie ein C Programm, das eine main() und eine weitere Funktion enthält (z.B. der NCurses Test mit der Funktion myflash() aus der Vorlesung). Modularisieren dieses Programm, d.h. fügen Sie weitere zwei Dateien “module.cpp” und “module.h” hinzu, welche die Implementierung bzw. den Prototypen der Funktion enthalten. Passen Sie das CMakeLists.txt entsprechend an.
Nehmen Sie in Ihr Protokoll den Source-Code und einen Screenshot der Kommandozeile beim Übersetzen und Ausführen auf!
Wieviele Zeilen Code haben Sie produziert? Verwenden Sie dafür z.B. das linesofcode.sh Skript. Hint: Damit es im Terminal gestartet werden kann, muss es ausführbar sein → “chmod +x linesofcode.sh”
Protokoll:
Realisieren Sie wie oben beschrieben beispielhaft die Modularisierung Ihres Codes, protokollieren Sie die dafür benötigten Schritte und beschreiben Sie weiteren mit Ihren eigenen Worten die obigen Fachbegriffe in Ihrem Übungsprotokoll - bitte nur ein, zwei Sätze oder Kurzbeispiele pro Begriff!