diff --git a/a2-1/differenz.c b/a2-1/differenz.c new file mode 100644 index 0000000..8d521a1 --- /dev/null +++ b/a2-1/differenz.c @@ -0,0 +1,7 @@ +#include "input.h" + +int differenz(void) { + int min = get_input("Minuend"); + int sub = get_input("Subtrahend"); + return min - sub; +} diff --git a/a2-1/differenz.h b/a2-1/differenz.h new file mode 100644 index 0000000..ba39d1d --- /dev/null +++ b/a2-1/differenz.h @@ -0,0 +1 @@ +extern int differenz(void); diff --git a/a2-1/input.c b/a2-1/input.c new file mode 100644 index 0000000..feba950 --- /dev/null +++ b/a2-1/input.c @@ -0,0 +1 @@ +int dummy; \ No newline at end of file diff --git a/a2-1/input.h b/a2-1/input.h new file mode 100644 index 0000000..02cf18c --- /dev/null +++ b/a2-1/input.h @@ -0,0 +1,10 @@ +#include + +extern int get_input(char prompt[]); + +int get_input(char prompt[]) { + printf("%s: ", prompt); + int in; + scanf("%d", &in); + return in; +} \ No newline at end of file diff --git a/a2-1/math.c b/a2-1/math.c new file mode 100644 index 0000000..cc4a301 --- /dev/null +++ b/a2-1/math.c @@ -0,0 +1,26 @@ +#include +#include "differenz.h" +#include "summe.h" + +void berechne(void) { + printf("Ihre Wahl:\n"); + printf("umme oder ifferenz? "); + char input; + scanf("%c", &input); + int ergebnis; + if (input == 'S') { + ergebnis = summe(); + } else if (input == 'D') { + ergebnis = differenz(); + } else { + printf("Ungueltige Eingabe\n"); + return; + } + printf("Ergebnis: %d\n", ergebnis); + return; +} + +int main(void) { + berechne(); + return 0; +} diff --git a/a2-1/results.md b/a2-1/results.md new file mode 100644 index 0000000..7498e76 --- /dev/null +++ b/a2-1/results.md @@ -0,0 +1,102 @@ +# A2-1 Ergebnisse + +## a) + +### `input.c` + +Die `input.c` Datei enthält lediglich die `get_input` Funktion. + +Wichtig ist, dass in der `input.c` Datei die `stdio.h` Header Datei eingebunden wird. Auch wenn diese Header Datei bereits durch die `math.h` Datei inkludiert wird, werden diese Dateien zunächst unabhängig voneinander in Objektcode umgewandelt, weshalb auch hier die Einbindung notwendig ist. + +```c +#include + +int get_input(char prompt[]) { + printf("%s: ", prompt); + int in; + scanf("%d", &in); + return in; +} +``` + +Des weiteren wird die `input.h` Datei benötigt, um von den `differenz.c` und `summe.c` Modulen eingebunden zu werden. + +```c +extern int get_input(char prompt[]); +``` + +### `summe.c` und `differenz.c` + +Der Aufbau der `summe.c` und der `differenz.c` Dateien ist überaus simpel, dank der Auslagerung der `get_input` Funktion in die `input.c` Datei. + +Es müssen lediglich diese `input.c` Datei eingebunden werden, und anschließend zwei Integer eingelesen und addiert bzw. subtrahiert werden. + +(Da sich die beiden Dateien sehr ähnlich sind, hier nur die `summe.c` Datei) + +```c +#include "input.h" + +int summe(void) { + int s1 = get_input("Erster Summand"); + int s2 = get_input("Zweiter Summand"); + return s1 + s2; +} +``` + +Da auch diese Dateien von der `math.c` Datei eingebunden werden müssen, sind wieder Header Dateien nötig + +```c +extern int summe(void); +``` + +### `math.c` + +In der `math.c` Datei müssen nun die zuvor geschriebenen `summe.c` und `differenz.c` Dateien eingebunden werden. Des weiteren wird auch die `stdio` Library benötigt, da hier nicht alle Ein- und Ausgaben von der `input.c` Datei übernommen werden können. + +```c +#include +#include "differenz.h" +#include "summe.h" + +void berechne(void) { + printf("Ihre Wahl:\n"); + printf("umme oder ifferenz? "); + char input; + scanf("%c", &input); + int ergebnis; + if (input == 'S') { + ergebnis = summe(); + } else if (input == 'D') { + ergebnis = differenz(); + } else { + printf("Ungueltige Eingabe\n"); + return; + } + printf("Ergebnis: %d\n", ergebnis); + return; +} + +int main(void) { + berechne(); + return 0; +} +``` + +Die `berechne(void)` Funktion fragt lediglich eine Benutzereingabe ab und führt abhängig von dieser die `summe()` bzw `differenz()` Funktion aus und gibt das Ergebnis auf der Konsole aus. Für den Fall dass weder `S` noch `D` eingegeben wurden, wird eine Fehlemeldung ausgegeben und die Ausführung wird frühzeitig abgebrochen. + +## b) + +Wird die `get_input` Funktion in der Header Datei implementiert, so entsteht folgende Fehlermeldung: + +``` +/tmp/cc0MAOBV.o: In function `get_input': +summe.c:(.text+0x0): multiple definition of `get_input' +/tmp/cciE9B24.o:differenz.c:(.text+0x0): first defined here +collect2: error: ld returned 1 exit status +``` + +Dieser Fehler entsteht beim **Linken** der Objektcode Dateien. + +**Begründung:** + +Beim Kompilierungsprozess wird zunächst der Präprozessor ausgeführt. Dieser wird hier keine Fehler zurückgeben, da alle Dateien Problemlos eingebunden werden Können. Die Definitionen innerhalb dieser Dateien sind hier noch nicht wirklich entscheident. diff --git a/a2-1/summe.c b/a2-1/summe.c new file mode 100644 index 0000000..16f2026 --- /dev/null +++ b/a2-1/summe.c @@ -0,0 +1,7 @@ +#include "input.h" + +int summe(void) { + int s1 = get_input("Erster Summand"); + int s2 = get_input("Zweiter Summand"); + return s1 + s2; +} diff --git a/a2-1/summe.h b/a2-1/summe.h new file mode 100644 index 0000000..acd0c0f --- /dev/null +++ b/a2-1/summe.h @@ -0,0 +1 @@ +extern int summe(void);