Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

repta2

problem z programem w c

Polecane posty

Otóż... mam zadanie na uczelni, gdzie dostałem kod programu w którym są błędy i mam je znaleźć, no i część błędów poprawiłem ale nadal program się nie kompiluje, wyskakują takie błędy:

-In function 'main'

-undefinied reference to 'sqrt'

Kod programu to:

#include <stdio.h>

#include <math.h>

int main() {

float a,b,c,delta;

printf("Program oblicza pierwiastki rownania w postaci\n");

printf(" 2\n");

printf(" a x + b x +c =0\n");

printf("Podaj wartosc a:");

scanf("%f",&a);

printf("Podaj wartosc b:");

scanf("%f",&b);

printf("Podaj wartosc c:");

scanf("%f",&c);

if (a==0.0) /*przypadek rownania liniowego */

if (b!=0.0)

printf("Jest to równanie liniowe o rozwiazaniu x=%f\n",-c/b);

else if (c==0.0) /* oraz a==b==0.0 */

printf("Rozwiazaniem jest dowolne x\n");

else /* a==b==0.0 != c */

printf("Brak rozwiazan\n");

else { /*przypadek rownania kwadratowego */

delta=pow(b,2)-4.0*a*c;

if (delta<0)

printf("Brak rozwiazan rzeczywistych\n");

else /* delta>=0 */

if (delta>0)

printf("Rozwiazaniem sa x1=%f i x2=%f\n",(-b-sqrt(delta))/(2*a),(-b+sqrt(delta))/(2*a));

else

printf("Rozwiazaniem sa x1=x2=%f\n",-b/(2*a));

}

return 0;

}

Ma ktoś pomysły dlaczego wyskakują te błędy?

PS Program kompiluję na linuxie komendą gcc

Link do komentarza
Udostępnij na innych stronach

Masz na myśli gcc -lm [nazwa pliku]? Jeśli tak, to niestety nic nie daje... wyskakują te same błędy

Dokładniej:

/tmp/cciwinqM.o: In function `main':

trojmian.c:(.text+0x1fb): undefined reference to `sqrt'

trojmian.c:(.text+0x248): undefined reference to `sqrt'

collect2: ld returned 1 exit status

Link do komentarza
Udostępnij na innych stronach

Pierwszy raz widzę, żeby trzeba było ręcznie linkować bibliotekę ze standardu. Ciekawe czemu ja nigdy nie miałem takiego problemu?

Generalnie sam kod jest poprawny i etap kompilacji kończy się sukcesem. Błąd jest na etapie konsolidacji. Linker nie potrafi odnaleźć symbolu sqrt. Co jest bardzo ciekawe, bo powinien on się znajdować w bibliotece libm.a i opcja "-lm" powinna spowodować użycie właśnie biblioteki libm.a.

Można tak:

gcc -lm -otrojmian trojmian.c

Można tak:

gcc -c -otrojmian.o trojmian.c
gcc -otrojmian -lm trojmian.o

Czy oprócz tego błędu są jeszcze jakieś inne komunikaty?

Raczej kompilujesz to jako C, więc "implicit declaration" jest jedynie ostrzeżeniem. Sprawdź czy nie popełniłeś literówki w nazwie funkcji sqrt. Tak, widzę, że jest dobrze napisane, ale edytory tekstu czasem potrafią zrobić dowcip i zapisać znaki z jakimś dziwacznym kodowaniem. W efekcie kompilator przykładowo zamiast znaku q, "widzi" jakiś chiński znaczek.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...