programmieren-3-c/a2-1
Luca Conte 82cec8e6ab rename result to readme 2023-10-04 15:35:36 +02:00
..
README.md rename result to readme 2023-10-04 15:35:36 +02:00
differenz.c a2-1 a) 2023-10-04 13:52:29 +02:00
differenz.h a2-1 a) 2023-10-04 13:52:29 +02:00
input.c a2-1 a) 2023-10-04 13:52:29 +02:00
input.h a2-1 a) 2023-10-04 13:52:29 +02:00
math.c a2-1 a) 2023-10-04 13:52:29 +02:00
summe.c a2-1 a) 2023-10-04 13:52:29 +02:00
summe.h a2-1 a) 2023-10-04 13:52:29 +02:00

README.md

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.

#include <stdio.h>

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.

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)

#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

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.

#include <stdio.h>
#include "differenz.h"
#include "summe.h"

void berechne(void) {
    printf("Ihre Wahl:\n");
    printf("<S>umme oder <D>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.