C Fehler beim Kompilieren?


11.05.2020, 21:32
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
    //Datei öffnen etc.
    FILE *fp;
    fp = fopen("Mathe_11.5.txt", "w");
    
    //Definieren der erforderlichen Variablen
    int a, b, pn, bQuadrat, bMal2, Platzhalter;
    char Variablenname;
    double WurzelPlatzhalter;
    //Anfang des Programms
    printf("Datei geöffnet\n");
    do{
        //Einlesen der erforderlichen Daten
        //Einlesen: pn
        printf("postiv oder negativ?:");
        scanf("%d", &pn);
        
        //Einlesen: B Quadrat
        printf("B Quadrat:");
        scanf("%d", &bQuadrat);

        //Einlesen: B Mal 2
        printf("B mal 2:");
        scanf("%d", &bMal2);

        //Einlesen: X
        printf("Variablenname:");
        scanf("%c", &Variablenname);

        printf("Alle Zahlen eingelesen\n");

        //weitere Berechnungen
        Platzhalter = (bMal2 / 2);
        if(bQuadrat < 0){
            Platzhalter = Platzhalter - bQuadrat;
//            if(Platzhalter < 0)
//                Platzhalter = Platzhalter * -1;
        }
        else
            Platzhalter = Platzhalter - bQuadrat;
        WurzelPlatzhalter = sqrt(Variablenname);
        printf("Schreibvorgang beginnt");
        fprintf(fp,"%c² + %d%c + %d = 0\n", Variablenname, bMal2, Variablenname, bQuadrat);
        fprintf(fp,"%c² + %d%c + %d + %d - %d = 0\n", Variablenname, bMal2, Variablenname, bQuadrat, Platzhalter, Platzhalter);
        fprintf(fp,"(%c + %d)² - %d\n", Variablenname, bMal2 / 2, Platzhalter);
        fprintf(fp,"(%c + %d)² = %d\n", Variablenname, bMal2 / 2,Platzhalter);
        fprintf(fp,"%c + %d = %f   oder  %d + %d = %f\n", Variablenname, bMal2 / 2 , WurzelPlatzhalter, Variablenname, bMal2 / 2, WurzelPlatzhalter * -1);
        fprintf(fp,"%c = %f              %c = %f",Variablenname, (bMal2 /2) + WurzelPlatzhalter, Variablenname, (bMal2 /2) + WurzelPlatzhalter * -1);
    }while(a == 0);



    fclose(fp);
    return 0;
}

11.05.2020, 21:54

Danke für eure Hilfe.

Der Link von DonkeyShot hat mir die Lösung gebracht, wie auch die Antwort von ralphdieter kurze Zeit später

Die Frage ist also gelöst

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Zu Fehler: Link

Und zu der Warnung: Link

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer

Die Funktion sqrt ist in libm definiert. Compiliere also mit der Option -lm.

Eigentlich sollte das automatisch passieren, wenn Du math.h inkludiert hast.

KarlRanseierIII  11.05.2020, 21:55

Einige Compiler linken tatsächlich automatisch die Standard libm. Aber es ist schon üblich, daß Du beim Einbinden einer Bibliothek diese explizit angeben mußt, denn woher soll der Compiler aus dem Einbinden von weiterem Quelltext ableiten, welche Bibliotheken denn nun zu linken sind?

Da bräuchte es dann einen (implementierungsabhängigen) Syntax, den der Compiler auf Linkeroptionen abbildet.

1
ralphdieter  11.05.2020, 22:13
@KarlRanseierIII

Ja, aber da die Header mit dem Compiler geliefert werden, versteht er das entsprechende "#pragma link libm" (oder so) auch. Normalerweise funktioniert das alles prima. Ich vermute, dass hier eine Code-Optimierung quer schießt...

1
KarlRanseierIII  11.05.2020, 22:22
@ralphdieter

Ja, zumindest für die 'Internen' Header der Standarbibliothek wäre das umsetzbar, bei externen Bibliotheken wäre das dann doch schwierig.

Bei gcc war das schon immer so, daß libm explizit angegeben werden muß, man hat das beibehalten. Ich kann nur vermuten, daß in grauer Vorzeit, als FPUs noch selten waren, verschiedene Implementierungen da waren, und man dadurch leicht (bei gleichem Header) verschiedene Varianten der Bibliothek einbinden konnte.

So konnte man dann im Zweifelsfall auf Systemen ohne FPU auf eine Bibliothek ohen FPU-Intruktionen zurückgreifen, notfalls indem man ein 'relink' machte?

0

Fehlerhafter Aufruf des Compilers, der Linker kann ein Smybol nicht finden. Versuch mal -lmath hinzuzufügen...

Und bitte, Fehlermeldungen in Originalsprache (C locale).

Nachtrag *hust* laut man-page -lm

Wieso sollen wir das ohne den Code zu kennen lösen?

Woher ich das weiß:Studium / Ausbildung – Informatikstudent
MRMINEDE 
Fragesteller
 11.05.2020, 21:31

Natürlich, füge ihn ein...

0