[C] Zastosowanie float i double pod linuxem


(niesuszek) #1

Witam. Mam do napisania program zaliczeniowy ze środowiska programisty, jest on już praktycznie skończony lecz pojawia sie mały problem pod linuxem. Mianowicie geany nie chce go skompilować (pod windowsem wszystko ładnie śmiga).

Czy mógłby ktoś pomóc dostrzec błąd w programie?

Kod programu:

#include 

#include 

#define PI 3.1415


float prostopadloscian(float dlugosc, float szerokosc, float wysokosc) 

{

	float objetosc_prostopadloscianu;

	objetosc_prostopadloscianu = dlugosc * szerokosc * wysokosc;


	return objetosc_prostopadloscianu;

}


float walec(float promien_podstawy_walca, float wysokosc_walca)

{

	float objetosc_walca;

	objetosc_walca = PI * promien_podstawy_walca * promien_podstawy_walca * wysokosc_walca;


	return objetosc_walca;

}


float stozek(float promien_podstawy_stozka, float tworzaca_stozka)

{

	float objetosc_stozka, pole_podstawy, wysokosc_stozka;

	pole_podstawy = PI * promien_podstawy_stozka * promien_podstawy_stozka;

	wysokosc_stozka = sqrt(tworzaca_stozka * tworzaca_stozka - promien_podstawy_stozka * promien_podstawy_stozka); 

    objetosc_stozka = (1.0/3.0) * pole_podstawy * wysokosc_stozka;


	return objetosc_stozka;

}


int main()

{

	float dlugosc, szerokosc, wysokosc, objetosc_prostopadloscianu;

	float promien_podstawy_walca, wysokosc_walca;

	float promien_podstawy_stozka, tworzaca_stozka, pole_podstawy;

	float objetosc_walca, objetosc_stozka;

	/*PROSTOPADLOSCIAN*/

    printf ("Podaj 'dlugosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

	while(!(scanf("%f", &dlugosc)==1 && getchar()=='\n' && dlugosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

	printf ("Podaj 'szerokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

	while(!(scanf("%f", &szerokosc)==1 && getchar()=='\n' && szerokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

	printf ("Podaj 'wysokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

	while(!(scanf("%f", &wysokosc)==1 && getchar()=='\n' && wysokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

	printf ("\nPodane wymiary prostopadloscianu:\n");

	printf ("Dlugosc: %f cm\n", dlugosc);

	printf ("Szerokosc: %f cm\n", szerokosc);

	printf ("Wysokosc: %f cm\n\n", wysokosc);

	printf ("Objetosc prostopadloscianu wynosi: %f cm3\n\n", prostopadloscian(dlugosc, szerokosc, wysokosc));

    /*WALEC*/

	printf ("Podaj 'promien podstawy' naczynia w ksztalcie WALCA [w cm]: ");

	while(!(scanf("%f", &promien_podstawy_walca)==1 && getchar()=='\n' && promien_podstawy_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

	printf ("Podaj 'wysokosc' naczynia w ksztalcie WALCA [w cm]: ");

	while(!(scanf("%f", &wysokosc_walca)==1 && getchar()=='\n' && wysokosc_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

	printf ("\nPodane wymiary walca:\n");

	printf ("Promien podstawy: %f cm\n", promien_podstawy_walca);

	printf ("Wysokosc: %f cm\n\n", wysokosc_walca);

	printf ("Objetosc walca wynosi: %f cm3\n\n", walec(promien_podstawy_walca, wysokosc_walca));

    /*STOZEK*/

	printf ("Podaj 'promien podstawy' naczynia w ksztalcie STOZKA [w cm]: ");

	while(!(scanf("%f", &promien_podstawy_stozka)==1 && getchar()=='\n' && promien_podstawy_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

	printf ("Podaj 'tworzaca' naczynia w ksztalcie STOZKA [w cm]: ");

	while(!(scanf("%f", &tworzaca_stozka)==1 && getchar()=='\n' && tworzaca_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

	printf ("\nPodane wymiary stozka:\n");

	printf ("Promien podstawy: %f cm\n", promien_podstawy_stozka);

	printf ("Tworzaca stozka: %f cm\n\n", tworzaca_stozka);

	printf ("Objetosc stozka wynosi: %f cm3\n\n", stozek(promien_podstawy_stozka, tworzaca_stozka));


	float suma_objetosci;

	suma_objetosci = prostopadloscian(dlugosc, szerokosc, wysokosc) + walec(promien_podstawy_walca, wysokosc_walca) + stozek(promien_podstawy_stozka, tworzaca_stozka);

	printf ("Suma objetosci trzech naczyn wynosi: %f", suma_objetosci);


	return 0;

}

(Sawyer47) #2

U mnie się świetnie kompiluje zarówno na clang jak i gcc

gcc plik.c -lm

Podaj komunikat jaki daje Geany przy próbie instalacji, nikt tu nie jest wróżką.


(niesuszek) #3
gcc -Wall -o "bez nazwy" "bez nazwy.c" (w katalogu .)

bez nazwy.c: In function ‘main’:

bez nazwy.c:36: warning: unused variable ‘objetosc_stozka’

bez nazwy.c:36: warning: unused variable ‘objetosc_walca’

bez nazwy.c:35: warning: unused variable ‘pole_podstawy’

bez nazwy.c:33: warning: unused variable ‘objetosc_prostopadloscianu’

/tmp/ccf3OYSc.o: In function `stozek':

bez nazwy.c:(.text+0x81): undefined reference to `sqrt'

collect2: ld returned 1 exit status

Kompilacja nie powiodła się

(Sawyer47) #4

Patrz wyżej, dołącz bibliotekę matematyczną za pomocą -lm


(niesuszek) #5

No faktycznie działa. Tylko jak dziele ten plik na dwa i chce stworzyć makefile to nie idzie tego zrobić, wyskakuje sporo błędów.


(Sawyer47) #6

Pokaż więc te błędy i opisz co robisz.


(niesuszek) #7

Podzieliłem ten wcześniejszy kod na dwa pliki *.c

Plik1.c

#include 

#include 

#define PI 3.1415


float prostopadloscian(float dlugosc, float szerokosc, float wysokosc) 

{

   float objetosc_prostopadloscianu;

   objetosc_prostopadloscianu = dlugosc * szerokosc * wysokosc;


   return objetosc_prostopadloscianu;

}


float walec(float promien_podstawy_walca, float wysokosc_walca)

{

   float objetosc_walca;

   objetosc_walca = PI * promien_podstawy_walca * promien_podstawy_walca * wysokosc_walca;


   return objetosc_walca;

}


float stozek(float promien_podstawy_stozka, float tworzaca_stozka)

{

   float objetosc_stozka, pole_podstawy, wysokosc_stozka;

   pole_podstawy = PI * promien_podstawy_stozka * promien_podstawy_stozka;

   wysokosc_stozka = sqrt(tworzaca_stozka * tworzaca_stozka - promien_podstawy_stozka * promien_podstawy_stozka); 

    objetosc_stozka = (1.0/3.0) * pole_podstawy * wysokosc_stozka;


   return objetosc_stozka;

}

Plik2.c

int main()

{

   float dlugosc, szerokosc, wysokosc, objetosc_prostopadloscianu;

   float promien_podstawy_walca, wysokosc_walca;

   float promien_podstawy_stozka, tworzaca_stozka, pole_podstawy;

   float objetosc_walca, objetosc_stozka;

   /*PROSTOPADLOSCIAN*/

    printf ("Podaj 'dlugosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &dlugosc)==1 && getchar()=='\n' && dlugosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'szerokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &szerokosc)==1 && getchar()=='\n' && szerokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'wysokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &wysokosc)==1 && getchar()=='\n' && wysokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary prostopadloscianu:\n");

   printf ("Dlugosc: %f cm\n", dlugosc);

   printf ("Szerokosc: %f cm\n", szerokosc);

   printf ("Wysokosc: %f cm\n\n", wysokosc);

   printf ("Objetosc prostopadloscianu wynosi: %f cm3\n\n", prostopadloscian(dlugosc, szerokosc, wysokosc));

    /*WALEC*/

   printf ("Podaj 'promien podstawy' naczynia w ksztalcie WALCA [w cm]: ");

   while(!(scanf("%f", &promien_podstawy_walca)==1 && getchar()=='\n' && promien_podstawy_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'wysokosc' naczynia w ksztalcie WALCA [w cm]: ");

   while(!(scanf("%f", &wysokosc_walca)==1 && getchar()=='\n' && wysokosc_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary walca:\n");

   printf ("Promien podstawy: %f cm\n", promien_podstawy_walca);

   printf ("Wysokosc: %f cm\n\n", wysokosc_walca);

   printf ("Objetosc walca wynosi: %f cm3\n\n", walec(promien_podstawy_walca, wysokosc_walca));

    /*STOZEK*/

   printf ("Podaj 'promien podstawy' naczynia w ksztalcie STOZKA [w cm]: ");

   while(!(scanf("%f", &promien_podstawy_stozka)==1 && getchar()=='\n' && promien_podstawy_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'tworzaca' naczynia w ksztalcie STOZKA [w cm]: ");

   while(!(scanf("%f", &tworzaca_stozka)==1 && getchar()=='\n' && tworzaca_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary stozka:\n");

   printf ("Promien podstawy: %f cm\n", promien_podstawy_stozka);

   printf ("Tworzaca stozka: %f cm\n\n", tworzaca_stozka);

   printf ("Objetosc stozka wynosi: %f cm3\n\n", stozek(promien_podstawy_stozka, tworzaca_stozka));


   float suma_objetosci;

   suma_objetosci = prostopadloscian(dlugosc, szerokosc, wysokosc) + walec(promien_podstawy_walca, wysokosc_walca) + stozek(promien_podstawy_stozka, tworzaca_stozka);

   printf ("Suma objetosci trzech naczyn wynosi: %f cm3 \n", suma_objetosci);


   return 0;

}

Utworzyłem makefile:

naczynia: plik1.o plik2.o

	cc -o naczynia plik1.o plik2.o -lm

plik1.o: plik1.c

	cc -c plik1.c

plik2.o: plik2.c

	cc -c plik2.c

Makefile wyrzuca mi kilka błędów:

cc -c plik1.c

cc -c plik2.c 

plik2.c: In function ‘main’:

plik2.c:8: warning: incompatible implicit declaration of built-in function ‘printf’

plik2.c:9: warning: incompatible implicit declaration of built-in function ‘scanf’

plik2.c:30: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

plik2.c:47: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

plik2.c:64: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

cc -o naczynia plik1.o plik2.o -lm

(Sawyer47) #8

Co zrobić? Przeczytać treść ostrzeżenia, przejść do linijki o której mowa w ostrzeżeniu (na początku PLIK:NUMER_LINII) i zastanowić się co jest nie tak. Często nie trzeba się w ogóle zastanawiać, bo komunikat mówi dokładnie co jest nie tak.

plik2.c: In function ‘main’:

plik2.c:8: warning: incompatible implicit declaration of built-in function ‘printf’

plik2.c:9: warning: incompatible implicit declaration of built-in function ‘scanf’

Nie dołączasz odpowiednich nagłówków dla tych funkcji. Nie dołączasz również żadnego nagłówka dla funkcji z 1 pliku, stąd te mylące komunikaty o typach.


(niesuszek) #9

Nie rozumiem, co tam jest nie tak? Treść błędu za wiele mi nie mówi. Mam usunąć floaty w pierwszej funkcji?


(Sawyer47) #10

Nie dołączasz stdio.h dla printf i scanf w drugim pliku. Nie dołączasz deklaracji funkcji z plik1 do plik2 - stąd problem.


(niesuszek) #11

Jeżeli dobrze rozumiem mam usunąć stdio.h i zamienić deklaracje

prostopadloscian(dlugosc, szerokosc, wysokosc)

na

prostopadloscian()

?


(Sawyer47) #12

Nie.

W plik2 nie dołączasz stdio.h, stąd błąd. Musisz więc dołączyć. Dodaj na początku plik2.c

#include 

#include "plik1.h"

plik1.h to plik z deklaracjami funkcji z plik1.c


([alex]) #13

Tak a propos poco definiujesz PI skoro jest już zdefiniowana w pod nazwą:

M_PI


(Sawyer47) #14

M_PI jest w C89, w C99 nie wiem czemu, ale wyrzucono.


(niesuszek) #15

Nie poszło.

Plik1.c

#include 

#define PI 3.1415


float prostopadloscian(float dlugosc, float szerokosc, float wysokosc) 

{

   float objetosc_prostopadloscianu;

   objetosc_prostopadloscianu = dlugosc * szerokosc * wysokosc;


   return objetosc_prostopadloscianu;

}


float walec(float promien_podstawy_walca, float wysokosc_walca)

{

   float objetosc_walca;

   objetosc_walca = PI * promien_podstawy_walca * promien_podstawy_walca * wysokosc_walca;


   return objetosc_walca;

}


float stozek(float promien_podstawy_stozka, float tworzaca_stozka)

{

   float objetosc_stozka, pole_podstawy, wysokosc_stozka;

   pole_podstawy = PI * promien_podstawy_stozka * promien_podstawy_stozka;

   wysokosc_stozka = sqrt(tworzaca_stozka * tworzaca_stozka - promien_podstawy_stozka * promien_podstawy_stozka); 

    objetosc_stozka = (1.0/3.0) * pole_podstawy * wysokosc_stozka;


   return objetosc_stozka;

}

Plik2.c

#include 

#include "plik1.h"


int main()

{

   float dlugosc, szerokosc, wysokosc, objetosc_prostopadloscianu;

   float promien_podstawy_walca, wysokosc_walca;

   float promien_podstawy_stozka, tworzaca_stozka, pole_podstawy;

   float objetosc_walca, objetosc_stozka;

   /*PROSTOPADLOSCIAN*/

    printf ("Podaj 'dlugosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &dlugosc)==1 && getchar()=='\n' && dlugosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'szerokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &szerokosc)==1 && getchar()=='\n' && szerokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'wysokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &wysokosc)==1 && getchar()=='\n' && wysokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary prostopadloscianu:\n");

   printf ("Dlugosc: %f cm\n", dlugosc);

   printf ("Szerokosc: %f cm\n", szerokosc);

   printf ("Wysokosc: %f cm\n\n", wysokosc);

   printf ("Objetosc prostopadloscianu wynosi: %f cm3\n\n", prostopadloscian(dlugosc, szerokosc, wysokosc));

    /*WALEC*/

   printf ("Podaj 'promien podstawy' naczynia w ksztalcie WALCA [w cm]: ");

   while(!(scanf("%f", &promien_podstawy_walca)==1 && getchar()=='\n' && promien_podstawy_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'wysokosc' naczynia w ksztalcie WALCA [w cm]: ");

   while(!(scanf("%f", &wysokosc_walca)==1 && getchar()=='\n' && wysokosc_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary walca:\n");

   printf ("Promien podstawy: %f cm\n", promien_podstawy_walca);

   printf ("Wysokosc: %f cm\n\n", wysokosc_walca);

   printf ("Objetosc walca wynosi: %f cm3\n\n", walec(promien_podstawy_walca, wysokosc_walca));

    /*STOZEK*/

   printf ("Podaj 'promien podstawy' naczynia w ksztalcie STOZKA [w cm]: ");

   while(!(scanf("%f", &promien_podstawy_stozka)==1 && getchar()=='\n' && promien_podstawy_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'tworzaca' naczynia w ksztalcie STOZKA [w cm]: ");

   while(!(scanf("%f", &tworzaca_stozka)==1 && getchar()=='\n' && tworzaca_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary stozka:\n");

   printf ("Promien podstawy: %f cm\n", promien_podstawy_stozka);

   printf ("Tworzaca stozka: %f cm\n\n", tworzaca_stozka);

   printf ("Objetosc stozka wynosi: %f cm3\n\n", stozek(promien_podstawy_stozka, tworzaca_stozka));


   float suma_objetosci;

   suma_objetosci = prostopadloscian(dlugosc, szerokosc, wysokosc) + walec(promien_podstawy_walca, wysokosc_walca) + stozek(promien_podstawy_stozka, tworzaca_stozka);

   printf ("Suma objetosci trzech naczyn wynosi: %f cm3 \n", suma_objetosci);


   return 0;

}

Błąd makefile:

cc -c plik2.c 

plik2.c:2: fatal error: plik1.h: Nie ma takiego pliku ani katalogu

compilation terminated.

make: *** [plik2.o] Błąd 1

(Sawyer47) #16

Bo nie stworzyłeś/napisałeś pliku plik1.h z deklaracjami funkcji z plik1.c

Myślałem, że jeśli napiszę, że musisz dołączyć plik z deklaracjami to oczywiste będzie, że ten plik musi istnieć i te deklaracje zawierać...


([alex]) #17

niesuszek , czy ty umiesz czytać?

przecież kompilator mówi po ludzku:

plik1.h: Nie ma takiego pliku ani katalogu

którego słowa nie rozumiesz?


(niesuszek) #18

Plik1.h

#include 

#include 

#define PI 3.1415


float prostopadloscian(float dlugosc, float szerokosc, float wysokosc) 

{

   float objetosc_prostopadloscianu;

   objetosc_prostopadloscianu = dlugosc * szerokosc * wysokosc;


   return objetosc_prostopadloscianu;

}


float walec(float promien_podstawy_walca, float wysokosc_walca)

{

   float objetosc_walca;

   objetosc_walca = PI * promien_podstawy_walca * promien_podstawy_walca * wysokosc_walca;


   return objetosc_walca;

}


float stozek(float promien_podstawy_stozka, float tworzaca_stozka)

{

   float objetosc_stozka, pole_podstawy, wysokosc_stozka;

   pole_podstawy = PI * promien_podstawy_stozka * promien_podstawy_stozka;

   wysokosc_stozka = sqrt(tworzaca_stozka * tworzaca_stozka - promien_podstawy_stozka * promien_podstawy_stozka); 

    objetosc_stozka = (1.0/3.0) * pole_podstawy * wysokosc_stozka;


   return objetosc_stozka;

}

Plik2.c

#include 

#include "plik1.h"


int main()

{

   float dlugosc, szerokosc, wysokosc, objetosc_prostopadloscianu;

   float promien_podstawy_walca, wysokosc_walca;

   float promien_podstawy_stozka, tworzaca_stozka, pole_podstawy;

   float objetosc_walca, objetosc_stozka;

   /*PROSTOPADLOSCIAN*/

    printf ("Podaj 'dlugosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &dlugosc)==1 && getchar()=='\n' && dlugosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'szerokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &szerokosc)==1 && getchar()=='\n' && szerokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'wysokosc' naczynia w ksztalcie PROSTOPADLOSCIANU [w cm]: ");

   while(!(scanf("%f", &wysokosc)==1 && getchar()=='\n' && wysokosc>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary prostopadloscianu:\n");

   printf ("Dlugosc: %f cm\n", dlugosc);

   printf ("Szerokosc: %f cm\n", szerokosc);

   printf ("Wysokosc: %f cm\n\n", wysokosc);

   printf ("Objetosc prostopadloscianu wynosi: %f cm3\n\n", prostopadloscian(dlugosc, szerokosc, wysokosc));

    /*WALEC*/

   printf ("Podaj 'promien podstawy' naczynia w ksztalcie WALCA [w cm]: ");

   while(!(scanf("%f", &promien_podstawy_walca)==1 && getchar()=='\n' && promien_podstawy_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'wysokosc' naczynia w ksztalcie WALCA [w cm]: ");

   while(!(scanf("%f", &wysokosc_walca)==1 && getchar()=='\n' && wysokosc_walca>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary walca:\n");

   printf ("Promien podstawy: %f cm\n", promien_podstawy_walca);

   printf ("Wysokosc: %f cm\n\n", wysokosc_walca);

   printf ("Objetosc walca wynosi: %f cm3\n\n", walec(promien_podstawy_walca, wysokosc_walca));

    /*STOZEK*/

   printf ("Podaj 'promien podstawy' naczynia w ksztalcie STOZKA [w cm]: ");

   while(!(scanf("%f", &promien_podstawy_stozka)==1 && getchar()=='\n' && promien_podstawy_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("Podaj 'tworzaca' naczynia w ksztalcie STOZKA [w cm]: ");

   while(!(scanf("%f", &tworzaca_stozka)==1 && getchar()=='\n' && tworzaca_stozka>=0)) 

    { 

        printf("Podales zle dane sprobuj ponownie\n"); 

        while(getchar()!='\n'); 

    } 

   printf ("\nPodane wymiary stozka:\n");

   printf ("Promien podstawy: %f cm\n", promien_podstawy_stozka);

   printf ("Tworzaca stozka: %f cm\n\n", tworzaca_stozka);

   printf ("Objetosc stozka wynosi: %f cm3\n\n", stozek(promien_podstawy_stozka, tworzaca_stozka));


   float suma_objetosci;

   suma_objetosci = prostopadloscian(dlugosc, szerokosc, wysokosc) + walec(promien_podstawy_walca, wysokosc_walca) + stozek(promien_podstawy_stozka, tworzaca_stozka);

   printf ("Suma objetosci trzech naczyn wynosi: %f cm3 \n", suma_objetosci);


   return 0;

}

Błąd makefile:

cc -o naczynia plik1.o plik2.o -lm

plik2.o: In function `prostopadloscian':

plik2.c:(.text+0x0): multiple definition of `prostopadloscian'

plik1.o:plik1.c:(.text+0x0): first defined here

plik2.o: In function `walec':

plik2.c:(.text+0x1d): multiple definition of `walec'

plik1.o:plik1.c:(.text+0x1d): first defined here

plik2.o: In function `stozek':

plik2.c:(.text+0x46): multiple definition of `stozek'

plik1.o:plik1.c:(.text+0x46): first defined here

collect2: ld returned 1 exit status

make: *** [naczynia] Błąd 1

(Sawyer47) #19

Nie, definicja to nie to samo co deklaracja. Znasz w ogóle C? Rozumiesz ideę plików nagłówkowych?


(niesuszek) #20

No właśnie nie do końca rozumiem o co w tym chodzi?