gcc-Compilererror



  • Hey Leute,
    ich habe gerade angefangen mit dem Programmieren in C und wollte nun ein Programm zur Berechnung der p-q-Formel schreiben. Leider bekomme ich immer einen Compilerfehler und habe wirklich keine Ahnung, warum es nicht funktioniert.

    #include <stdio.h>
    #include <math.h>
    
    float zahl_p;
    float zahl_q;
    float Ergebnis1;
    float Ergebnis2;
    
    float Berechnung()
    {
      if (((zahl_p) / 2 - zahl_q) >= 0)	//Diskriminante < 0 ?
      {
        Ergebnis1 = (-1) * zahl_p / 2 + sqrt((zahl_p) / 2 - zahl_q);	//+ Variante
        Ergebnis2 = (-1) * zahl_p / 2 - sqrt((zahl_p) / 2 - zahl_q);	//- Variante
      }
      else
      {
        printf("Keine Lösung!");
      }
      if (Ergebnis1 == Ergebnis2)
      {
    	printf("eine Lösung: %.2f\n", Ergebnis1);
      }
      else
      {
    	printf("zwei Lösungen:\nx1: %.2f\nx2: %.2f\n", Ergebnis1, Ergebnis2);
      }
    }
    
    int main(void)
    {
      printf("Geben Sie p und q ein: ");
        scanf("%f %f", &zahl_p, &zahl_q);
      printf("Eingebene Gleichung: x² + %.2fx + %.2f\n", zahl_p, zahl_q);
    
      printf("%.2f\n", Berechnung);	//Funktion von oben wird aufgerufen
    
      return 0;
    }
    

    Geschrieben ist es mit Kwrite unter Ubuntu 13.10...

    MfG



  • Fast das wichtigste vergessen... 😃 der Error:

    loesung2.c: In function ‘main’:
    loesung2.c:49:3: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float (*)()’ [-Wformat=]
       printf("%.2f\n", Berechnung); //Funktion von oben wird aufgerufen
       ^
    


  • lprulzcrossover schrieb:

    Fast das wichtigste vergessen... 😃 der Error:

    loesung2.c: In function ‘main’:
    loesung2.c:49:3: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float (*)()’ [-Wformat=]
       printf("%.2f\n", Berechnung); //Funktion von oben wird aufgerufen
       ^
    

    Das 49:3 bedeutet: Die Warnung ist in Zeile 49 Spalte 3
    Diese Zeile gibt es aber gar nicht bei dir, also hast du ein anderes Programm compiliert.

    Aber zunächst zu den Fehlern.
    - du benutzt globale Variablen.
    - deine Funktion Berechnung hat kein return . Wie soll also der Wert zurück gegeben werden?
    - Funktionen bekommen beim Aufruf Paramter in Klammern übergeben. Parameter müssen nicht sein, aber die Klammern sind notwendig.
    - Wenn du eine Funktion ohne Paramter definierst, dann schreib void als Parameter

    Aber du kannst die Funktion auch ohne printf aufrufen:

    Berechnung();
    


  • Oben sind noch einige Zeilen Kommentar, deswegen ist Zeile 49 Spalte 3 eigentlich schon richtig(sorry, hier nicht abgebildet...).
    Ich weiß, man sollte globale Variablen meiden, aber funktionieren sollte es doch trotzdem, oder?
    Und was sollte ich dem Befehl return als Zusatz geben? return 0; gibt ja nicht das Ergebnis zurück, das ich möchte, oder?



  • Du musst doch wissen was du zurück geben willst. Schließlich hast du das float dahin geschrieben.
    Das Problem ist mehr, das du mit return nur einen Wert zurück geben kannst.

    Du kannst ja die Anzahl der (reellen) Lösungen zurück geben.
    Also 0 oder 1 oder 2 (Dann aber den Typ vom Rückgabewert auf int ändern).[/b]



  • Brauche ich denn überhaupt eine Rückgabe an main? Ich meine ausgegeben wird das Ergebnis ja sowieso schon in der Funktion Rechnung...
    Oder kann ich auch Gleitkommazahlen in der Funktion Rechnung benutzen, wenn ich ihr int zuweise?

    Edit: Funktioniert jetzt, danke für die Hilfe! 🙂

    #include <stdio.h>
    #include <math.h>
    
    float zahl_p;
    float zahl_q;
    float Ergebnis1;
    float Ergebnis2;
    
    float Berechnung()
    {
    
      if (((zahl_p) / 2 - zahl_q) >= 0)	//Diskriminante < 0 ?
      {
        Ergebnis1 = (-1) * (zahl_p / 2) + (sqrt(((zahl_p) / 2)*((zahl_p)/2) - zahl_q));	//+ Variante
        Ergebnis2 = (-1) * (zahl_p / 2) - (sqrt(((zahl_p) / 2)*((zahl_p)/2) - zahl_q));	//- Variante
      }
      else
      {
        printf("Keine Lösung!\n");
        return 0;
      }
      if (Ergebnis1 != Ergebnis2)	//eine oder zwei Lösungen?
      {
    	printf("zwei Lösungen:\nx1 = %.2f\nx2 = %.2f\n", Ergebnis1, Ergebnis2);
    	return 2;
      }
      else
      {
    	printf("eine Lösung: x = %.2f\n", Ergebnis1);
    	return 1;
      }
    }
    
    int main(void)
    {
    
      printf("Geben Sie p und q ein: ");
        scanf("%f %f", &zahl_p, &zahl_q);
      printf("Eingebene Gleichung: x² + %.2fx + %.2f\n", zahl_p, zahl_q);
    
      Berechnung();	//Funktion von oben wird aufgerufen
    
      return 0;
    }
    

Log in to reply