Ein Überblick: C

13. September 2018 von | Kategorie: Programmierung
Schlagwörter: //

In diesem Artikel sollen die Besonderheiten der Programmiersprache C aufgezeigt werden. Dazu implementierte ich einen Rechner. In diesem Programm konnten Pointer, Pointer auf Funktionen und Structs untergebracht werden.

Das Programm könnte leichter und ĂŒbersichtlicher gestaltet sein. Gewiss muss ein simpler Rechner nicht so kompliziert sein, allerdings soll der vorliegende Quelltext einige Besonderheiten der Programmiersprache C hervorheben. Außerdem wurde nicht darauf geachtet, Ausnahmen oder Eingabefehler zu ĂŒberprĂŒfen. Dieses Programm dient der reinen Demonstration.

#include<stdio.h>

struct Rechnung {
    double zahl1;
    double zahl2;
    int operation; /* 0, 1, 2, 3 */
    double ergebnis;
};

// Diese Funktionen dienen der Berechnung
void addieren(struct Rechnung *r) {
    r->ergebnis = r->zahl1 + r->zahl2;
}


void subtrahieren(struct Rechnung *r) {
    r->ergebnis = r->zahl1 - r->zahl2;
}


void multiplizieren(struct Rechnung *r) {
    r->ergebnis = r->zahl1 * r->zahl2;
}


void dividieren(struct Rechnung *r) {
    r->ergebnis = r->zahl1 / r->zahl2;
}

// MAIN
int main(void) {

    // Das Rechnungsstruct definieren
    // (ohne explizite Anfangswertzuweisung).
    struct Rechnung rechnung;

    // Pointer auf die Funktionen erzeugen.
    int (*rechenarten[4])(struct Rechnung *) = {&addieren, &subtrahieren, &multiplizieren, &dividieren};

    printf("Zahl eingeben: ");
    scanf("%lf", &rechnung.zahl1);

    printf("Rechenart eingeben (0: Addition, 1: Subtraktion, 2: Multiplikation, 3: Division): ");
    scanf("%d", &rechnung.operation);

    printf("Zahl eingeben: ");
    scanf("%lf", &rechnung.zahl2);

    // Die Rechnung durchfĂŒhren
    (*rechenarten[rechnung.operation])(&rechnung);
	
    printf("Ergebnis: %lf", rechnung.ergebnis);

    return(0);
}

Zuerst wird ein Struct „Rechnung“ definiert. Mittels diesem werden alle Daten zur Berechnung gespeichert. Anschließend werden die Funktionen zur Berechnung definiert. In der Main-Funktion, welche in jedem (!) C-Programm vorhanden sein muss (diese ist der Einstiegspunkt), wird der Benutzer aufgefordert, einige Daten zur Berechnung einzugeben.

Die Funktionen zur Berechnung erwarten einen Pointer (Zeiger) auf das Rechnungsstruct. Auf diese Weise kann Speicher gespart werden. Außerdem kann eine Funktion so auf eine Variable (struct Rechnung rechnung) der Main zugreifen (lesen & schreiben). Zeiger Ă€hneln den Referenzdatentypen (Objekten) der Sprache Java.

Jedoch geschieht die eigentliche Magie in Zeile 38. Dort werden die Speicheradressen1 der einzelnen Funktionen an einen Zeiger ĂŒbergeben. Dies kann mit einem &func_name erreicht werden. Die zweite Klammer (links des Gleichheitszeichens) dient der Spezifizierung der Parameter. In Zeile 50 sieht man diesen „Pointer auf Funktionen“ in Aktion. Mit der typischen Arrayschreibweise kann eine Funktion ausgewĂ€hlt und mit entsprechendem Parameter aufgerufen werden.

Dieser Pointer, welcher auf mehrere Funktionen zeigen kann, ist eine tolle Sache. In einer Sprache wie Java mĂŒsste erst eine switch-case-Anweisung gebastelt werden und dies kann sehr umstĂ€ndlich und lĂ€stig sein, wenn man 10 oder 20 Funktionen in AbhĂ€ngigkeit eines Integers aufrufen möchte.

Weiter möchte ich an dieser Stelle nicht auf den obenstehenden Quelltext eingehen. Ich belasse es bei diesem kurzen Überblick. Vielleicht konnte ich mit diesem dein Interesse fĂŒr diese Programmiersprache wecken. Ich lerne sie im Rahmen meines Studiums und bin doch positiv ĂŒberrascht. DarĂŒber hinaus verbergen sich noch einige interessante Sachverhalte in der Programmiersprache (z.B. die HardwarenĂ€he, Listen, Unions usw…).


1: Die Adresse der Speicherzelle (genauer der ersten Speicherzelle).

Was denkst du ĂŒber diesen Post?
  • Gut (1)
  • Hilfreich (0)
  • Nicht gut (0)
  • Lustig 😀 (0)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

42 − 34 =