# Aufgabe: Finde den Fehler. Fehlt die Funktion?



## ElMadridano (5. Jul 2018)

Hallo,

ich bin Student und im 1.Semester mit C Programmieren, also noch ein Anfänger. Folgende Themen haben wir schon durchgenommen: Arrays, Schleifen, if-Bedingungen usw.
Nun sind wir im Teil Funktionen. Da ist eine Aufgabe, da solll ich was abtippen und sagen warum man es nicht compilieren kann. Nachfolgend ist das was ich abtippen soll:


```
int main ()
{
    char choice;
    do
    {
        choice = Menu ();
        switch (choice)
        {
            case 'a':
                SquaeArea (); break;
            case 'b':
                CircleArea (); break;
            case 'c':
                CubeVolume (); break;
            case 'd':
                SphereVolume (); break;
            case 'e':
                TriangleArea (); break;
            case 'q':
                printf("Good bye\n");
        }
    }
    while (choice != 'q');
    return 0;
}
```


Warum kann man es nicht Compilieren? Es ist eine Aufgabe im Teil der Funktionen. Kann es sein das da die Funktion fehlt?

Leider gibt es keine Einführungs Aufgaben zu den Funktionen und ich bin nicht richtig reingekommen. Also wäre es nicht schlecht, wenn ihr mir Seiten empfehlen könntet, wo es dazu Einführungs Aufgaben mit Lösungen gibt.

Danke


----------



## mihe7 (6. Jul 2018)

ElMadridano hat gesagt.:


> Kann es sein das da die Funktion fehlt?


"Die" Funktion ist gut. Welche Funktionen sind denn im Code deklariert? Es sind nicht allzu viele


----------



## Dompteur (6. Jul 2018)

ElMadridano hat gesagt.:


> ...Warum kann man es nicht Compilieren?...


Natürlich macht es auch Sinn, sich das am Papier zu überlegen bzw. zu üben.
Aber du solltest dich nicht scheuen, den Compiler anzuwerfen und selbst schauen, was der dir für Fehler liefert.
Da bekommst du auch viel schneller eine Rückmeldung als auf eine Antwort im Forum zu warten.


----------



## ElMadridano (7. Jul 2018)

Danke für die antworten. @Dompteur ich hab den Compiler angeschmissen, aber den Fehler den er mir anzeigt nicht verstanden. Da steht "undefined reference to 'Menu' und dann 5 weitere Fehler mit squareArea usw.
@mihe7 ich gehe davon aus das 6 Funktionen deklariert sind, dementsprechend würde ich vor der main Funktion die anderen Funktionen aufschreiben, z.B so:
 Menu ()
SquaeArea ()
CircleArea ()
CubeVolume ()
SphereVolume()
TriangleArea ()
und dann int main usw. vorher muss noch vor jeder Funktion der Rückgabetyp stehen, aber ich weiß nicht welcher. in den Klammern müsste man noch die Parameterliste angeben, aber auch da kann ich nicht sagen welche gebraucht werden.
Also soweit bin ich schonmal, 
aber ich freue mich über jeden weiteren tipp, der mich zum Ziel bringt.
Danke sehr


----------



## mrBrown (7. Jul 2018)

ElMadridano hat gesagt.:


> ich gehe davon aus das 6 Funktionen deklariert sind,


Jein - die sechs Funktionen sind eben nicht deklariert, genau das ist das Problem. Durch hinschreiben deklarierst du sie. 



ElMadridano hat gesagt.:


> vorher muss noch vor jeder Funktion der Rückgabetyp stehen, aber ich weiß nicht welcher.


Das kannst du aus dem Code ableiten: Wird irgendwo ein Rückgabewert verwendet?



ElMadridano hat gesagt.:


> in den Klammern müsste man noch die Parameterliste angeben, aber auch da kann ich nicht sagen welche gebraucht werden.


Kannst du auch ableiten: welche Parameter werden denn übergeben?


----------



## mihe7 (7. Jul 2018)

ElMadridano hat gesagt.:


> Da steht "undefined reference to 'Menu' und dann 5 weitere Fehler mit squareArea usw.



Die Fehlermeldung hat mich doch etwas überrascht. Sie kommt nämlich erst vom Linker und bedeutet, dass es eine Referenz auf Menu gibt, der Linker zu Menu aber keine Definition finden konnte. Ich hätte dagegen einen Compilerfehler erwartet, der besagt, dass die Funktion Menu nicht deklariert ist.

Daher erstmal Recherche...

Tatsächlich kennt C die "implizite Funktionsdeklaration". Eine Funktion wird implizit deklariert, indem sie verwendet wird, ohne dass sie zuvor explizit deklariert worden wäre. In den älteren C-Standards war das möglich, in C99 und C++ ist es dagegen verboten (Quelle).

Nachdem das in neueren C-Varianten und C++ nicht erlaubt ist, meinen wir natüüürlich "explizit deklariert", wenn wir nur von "deklariert" reden ;-)

In Deinem Code ist also genau eine Funktion deklariert (und definiert), nämlich "int main()". Wenn Du Deine Funktionen vor main deklarierst, lässt sich der Code zwar übersetzen, Du wirst aber vom Linker - wieder - die gleiche Fehlermeldung bekommen, so lange die Funktionen nicht auch definiert wurden.


----------



## ElMadridano (7. Jul 2018)

Hallo und danke für die antworten,
@mihe7 Der Fehler am Anfang kam also daher, das die Funktionen nicht deklariert und auch nicht definiert worden sind, hab ich das richtig verstanden. Das habe ich jetzt gemacht und meine Funktionen vor main deklariert und danch definiert.
@mrBrown ich habe jetzt char gewählt, weil es ja um Buchstaben geht und die Parameterliste hab ich jetzt erstamal freigelassen.
Das Programm soll wahrscheinlich durch eingabe bestimmter Zahlen die jeweiligen Flächen usw. weiter berechnen, aber ich habs jetzt erstmal einfach gemacht. Ist der Aufbau so ungefähr Richtig oder was würdet ihr anders machen oder verbessern?

Danke


```
char Menu ();
char SquaeArea ();
char CircleArea ();
char CubeVolume ();
char SphereVolume ();
char TriangleArea ();
int main ()
{
    char choice;
    do
    {
        choice = Menu ();
        switch (choice)
        {
            case 'a':
                SquaeArea (); break;
            case 'b':
                CircleArea (); break;
            case 'c':
                CubeVolume (); break;
            case 'd':
                SphereVolume (); break;
            case 'e':
                TriangleArea (); break;
            case 'q':
                printf("Good bye\n");
        }
    }
    while (choice != 'q');
    return 0;
}
char Menu ()
{
    char buchstabe;
    printf("tippen sie einen Buchstaben ein:");
    scanf("%c", &buchstabe);
    return buchstabe;
}
char SquaeArea ()
{
    printf("squareArea\n");
}
char CircleArea ()
{
    printf("CircleArea\n");
}
char CubeVolume ()
{
    printf("CubeVolume\n");
}
char SphereVolume ()
{
    printf("SphereVolume\n");
}
char TriangleArea ()
{
    printf("TriangleArea\n");
}
```


----------



## mrBrown (7. Jul 2018)

ElMadridano hat gesagt.:


> @mrBrown ich habe jetzt char gewählt, weil es ja um Buchstaben geht und die Parameterliste hab ich jetzt erstamal freigelassen.


Geht es um Buchstaben? Wenn eine Funktion SquareArea heißt, würde ich eher nicht erwarten, dass sie einen buchstaben zurück gibt 
Aber: die Funktion werden alle ohne verwendeten Rückgabewert aufgerufen und geben bei dir auch nichts zurück, sodass man auch einfach void hätte nehmen können.


----------



## mihe7 (8. Jul 2018)

ElMadridano hat gesagt.:


> Der Fehler am Anfang kam also daher, das die Funktionen nicht deklariert und auch nicht definiert worden sind, hab ich das richtig verstanden.



Ja. Es hätte also nicht gereicht, wenn Du die Funktionen nur deklariert hättest, denn dann hättest Du den gleichen Fehler bekommen.

Die Definition gilt im übrigen auch als Deklaration. Es wäre also nicht falsch, wenn Du die Deklarationen am Anfang gleich durch die Definitionen ersetzt. Allerdings ist es so, wie Du es jetzt gemacht hast, m. E. die sauberere Variante.


----------

