Aufgabe: Finde den Fehler. Fehlt die Funktion?

ElMadridano

Mitglied
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:

C:
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
 
Zuletzt bearbeitet von einem Moderator:

ElMadridano

Mitglied
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

Super-Moderator
Mitarbeiter
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. ;)

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?

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

Top Contributor
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.
 
Zuletzt bearbeitet von einem Moderator:

ElMadridano

Mitglied
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

C:
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");
}
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
@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

Top Contributor
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.
 

Ähnliche Java Themen

Neue Themen


Oben