Warum kann ich dieses C Programm nicht unter Linux kompilieren?


shutdown

Erfahrenes Mitglied
Hi!

Der Titel sagts ja eigentlich schon.

Ich bekomme folgendes C-Programm einfach nicht zu laufen.

Er bringt mir diese Fehlermeldung

tmp/ccVFXBXa.o(.text+0x111): In function `main':
: undefined reference to `sqrt'
/tmp/ccVFXBXa.o(.text+0x1c5): In function `main':
: undefined reference to `fmod'
/tmp/ccVFXBXa.o(.text+0x222): In function `main':
: undefined reference to `fmod'
/tmp/ccVFXBXa.o(.text+0x440): In function `string_to_number':
: undefined reference to `pow'
collect2: ld returned 1 exit status

Also auf gut deutsch: Er akzeptiert keine Funktion der math.h
Diese ist aber richtig installiert! (Auch bei Freunden klappt die Kompilierung einfach nicht).
(Unter Windows klappt die Kompilierung und das Programm einwandfrei!)

Vielen Dank für eure Hilfe!

cu shutdown


Hier nun das Programm:

Code:
/***************************************************************************** 
program:    prim_mit_datei.c 
            Primzahl-Test (in der Art nach Erestostrates) mit Datei-Anbindung 
author:      shutdown 
created:    14-01-2005 
modified:   15-01-2005 
compiler:   BC++ 5.02 
*****************************************************************************/ 

#include '<'stdio.h> 
#include '<'string.h>     // die '' nur fürs "dumme" Forum ;-)
#include '<'fcntl.h> 
#include '<'math.h> 
#include '<'stdlib.h> 
#include '<'conio.h> 

long double string_to_number(char string[]); 

void main(void) 
{ 
    char string[1000]; 
    long double i; 
    long double testzahl; 
    int status = 1; 
    char string_dat[1000]; 


    long double von, bis; 

    long double wurzel; 

    FILE *datei; 

    printf("***Primzahltest mit Dateianbindung***\n\n"); 

    printf("Start bei: "); 
    scanf("%Lf", &von); 

    printf("Ende bei: "); 
    scanf("%Lf", &bis); 

    for(i=von; i<=bis; i++)// while(1) 
    { 
    status = 1;   // grundsätzlich geht man davon aus, dass es eine Primzahl ist 
                   // ein Gegenbeispiel (*0) und Status ist 0 und damit nicht prim 

    testzahl = i; 

    wurzel = sqrt(testzahl);    // Es ist nur eine Überprüfung bis zur Wurzel nötig 

   // printf("Testzahl eingeben (ENDE mit 0): "); 
   // scanf("%f",&testzahl); 

    if(testzahl == 0) 
        break; 

    datei = fopen("prim.txt", "a+"); 

    while(fgets(string, sizeof(string), datei) && (string_to_number(string) <= wurzel)) 
    { 
        if(fmod(testzahl, 2) != 0) 
        { 
           if(!(fmod(testzahl, string_to_number(string))== 0.0)) 
           { 
               status *= 1;                           //ist Primzahl 
           } 
           else 
           { 
               status *= 0;                        //keine Primzahl 
               break; 
           } 
           if(testzahl == string_to_number(string)) 
               status = 1; 
        } 
        else 
        { 
            status = 0; 
            break; 
        } 
    } 

    fclose(datei);                       // fragt mich nicht warum´... 
    datei = fopen("prim.txt", "a+");     // ... aber es hilft wunder! 


    if(status == 1) 
    { 
    //    printf("\n%.0Lf ist eine Primzahl!\n", testzahl); 

        fprintf(datei, "%.0Lf\n", testzahl);     //größerer Bereich als ultoa 

        //ultoa(testzahl, string_dat, 10);       //Umwandlung unsigned long to string 

        //if(fputs(string_dat, datei)==EOF) 
        //    printf("Fehler\n");                   //Wenn Primzahl, dann in Datei 
        //fputs("\n", datei);                        //schreiben 
    } 
    else 
    { 
    // printf("\n%.0Lf\n", testzahl); 
    } 

    fclose(datei); 


    }            //ENDE while-Schleife 

    printf("Fertig!"); 
} 

long double string_to_number(char string[])  // die macht dasselbe wie atoi() 
{                                      // aber komm erstmal auf den Namen atoi! 
    int laenge; 
    long double zahl=0; 
    int i, j=0; 
    int help; 

    i = strlen(string); 


    j = 0; 
    i -= 2; 

    while(i>=0) 
    { 
        if(i<0)         // wenn string[0] überschritten (i--), dann ENDE 
            break; 
        switch(string[i]) 
        { 
             case '1': help = 1; 
                        break; 
             case '2': help = 2; 
                       break; 
             case '3': help = 3; 
                        break; 
             case '4': help = 4; 
                        break; 
             case '5': help = 5; 
                        break; 
             case '6': help = 6; 
                        break; 
             case '7': help = 7; 
                        break; 
             case '8': help = 8; 
                        break; 
             case '9': help = 9; 
                        break; 
             case '0': help = 0; 
                         break; 
        } 

        zahl += help * pow(10, j);   //erst die Einer addieren, dann die Zehner... 

    i--; 
    j++; 
    } 

    return zahl; 

}
 

RedWing

Erfahrenes Mitglied
Hallo,

verusch mal die libm beim kompilieren mit dazu zu linken:

Code:
gcc -lm your_source.c

Gruß

RedWing
 

shutdown

Erfahrenes Mitglied
super, genau das wars!

Vielen Dank!

Kennt zufällig jemand noch den Befehl, mit dem man Textdateien in ein Linuxfreundliches Format verwandeln kann (ich weiß, dass es einen gibt, ich komm jetzt einfach net drauf)

Meine unter Windows erstellte Datei sieht so aus:

2^M
3^M
4^M
...

Nur kann ich diese ^M nicht wirklich ansprechen/löschen.

Sie werden aber von Linux auf irgendeine Art und Weise interpretiert, denn wenn ich die Datei zeilenweise einlese, dann akzeptiert er diese "Eingaben" nicht.

Lass ich mein Programm die Datei erzeugen, dann steht da aber nix von ^M

(wäre ganz praktisch, es sin nämlich schon fast 2 Mio Einträge ;-) )

Danke!

shutdown
 

JohannesR

Erfahrenes Mitglied
Unter Windows ist das "^M" = CR & LF, Unix nutzt nur ein LF. Mit dem Vim koenntest du wahrscheinlich auch per
Code:
:1,$s/\\r\\n/\\n/g
alles umwandeln. Vim-VIM-VIM :)
 

shutdown

Erfahrenes Mitglied
Danke!
Jetzt klappts genau so wie ichs gern hätt :D *freu*

Und es is tatsächlich schneller als unter Windows ;-)

Vielen Dank!

cu shutdown
 

Daniel Toplak

Erfahrenes Mitglied
Kleiner Tipp am Rande entweder du nutzt std::string::getline zum einlesen oder du musst die Zeilen entsprechen verarbeiten, somit bleibt deine Datendatei portabel.

Daniel
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.613
Mitglieder
187.829
Neuestes Mitglied
AlDi31