[C] gcc non compila

Messaggioda UeCiccio » 23/10/2019, 18:08

Salve, sto appena imparando il C. Ho scritto un programma in questo linguaggio ma il compilatore non me lo compila, restituendomi un messaggio che non riesco a capire:
Codice:
gcc -o energia.exe energia.c
energia.c:6:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main(){
 ^~~~
/tmp/ccOSaN4b.o: nella funzione "main":
energia.c:(.text+0xe7): riferimento non definito a "pow"
energia.c:(.text+0x135): riferimento non definito a "pow"
collect2: error: ld returned 1 exit status


Il programma è questo:
Codice:
#include <stdio.h>
#include <math.h>

#define G 9.81
/* Questo programma calcola i valori dell'energia cinetica T = 1/2mv^2 e dell'energia potenziale U = mhg in funzione del tempo di un punto materiale di massa m soggetto a una gravità. Le grandezze sono quelle del sistema metrico internazionale. */
main(){
    double m;                       /* massa del punto materiale */
    double v0;                      /* velocità iniziale del punto materiale */
    double h0;                      /* quota iniziale */
    double t;                       /* tempo */
    double U, T;                    /* energia potenziale e cinetica */
    double v;                       /* velocità in funzione del tempo */
    double h;                       /* quota in funzione del tempo */
   
    printf ("Inserisci la massa del punto materiale espressa in kg: ");
    scanf ("%lf", &m);
    printf ("\n Inserisci la velocità iniziale espressa in m/s: ");
    scanf ("%lf", &v0);
    printf ("\n Inserisci la quota iniziale in m: ");
    scanf ("%lf", &h0);
    /* calcola v e h */
    v = v0 - G*t;
    h = h0 + v0*t + G / 2. * pow(t, 2.0);
    /* calcola i valori di T e U */
    T = m / 2.* pow(v, 2.0);
    U = m*G*h;
    printf ("\n L'energia cinetica è %f J", T);
    printf ("\n L'energia potenziale è %f J", U);
}


Sapete spiegarmi dove sta l'errore?
UeCiccio
Starting Member
Starting Member
 
Messaggio: 1 di 12
Iscritto il: 23/10/2019, 17:47

Re: [C] gcc non compila

Messaggioda claudio86 » 24/10/2019, 20:20

La compilazione va a buon fine, ma il linker non trova il riferimento alla funzione pow().
Quando usi funzioni dall'header <math.h> con GCC, devi specificare esplicitamente la libreria "m" (per "math") passando come argomento "-lm" (elle minuscola seguita dalla libreria, in questo caso "m").

Codice:
gcc -o energia.exe -lm energia.c
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Senior Member
Senior Member
 
Messaggio: 529 di 1130
Iscritto il: 09/01/2011, 15:12

Re: [C] gcc non compila

Messaggioda UeCiccio » 25/10/2019, 12:17

Codice:
gcc -o energia.exe -lm energia.c
energia.c:6:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main(){
 ^~~~
/tmp/ccRJFsHc.o: nella funzione "main":
energia.c:(.text+0xe7): riferimento non definito a "pow"
energia.c:(.text+0x135): riferimento non definito a "pow"
collect2: error: ld returned 1 exit status


purtroppo mi restituisce lo stesso messaggio :(
UeCiccio
Starting Member
Starting Member
 
Messaggio: 2 di 12
Iscritto il: 23/10/2019, 17:47

Re: [C] gcc non compila

Messaggioda Raptorista » 25/10/2019, 12:27

Questo è uno scherzo che fa gcc. Prova con
Codice:
gcc -o energia.exe energia.c -lm

cioè mettendo -lm dopo il nome del file sorgente
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5348 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C] gcc non compila

Messaggioda Raptorista » 25/10/2019, 12:29

Tra parentesi, meglio andare sul sicuro e usare una compilazione più puntigliosa: usa
Codice:
gcc -o energia.exe -Wall -Wextra -Werror -pedantic energia.c -lm

finché stai iniziando.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5349 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C] gcc non compila

Messaggioda vict85 » 25/10/2019, 12:52

E poi ovviamente manca l'int prima del main... Ho l'impressione che tu stia imparando C su un libro pre-standard (cioè pubblicato prima del 1989).
vict85
Moderatore
Moderatore
 
Messaggio: 9917 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] gcc non compila

Messaggioda claudio86 » 25/10/2019, 13:05

Raptorista ha scritto:Prova [...] mettendo -lm dopo il nome del file sorgente

Grazie della correzione, dimenticavo che l'ordine degli argomenti è importante in questo caso.

Raptorista ha scritto:Tra parentesi, meglio andare sul sicuro e usare una compilazione più puntigliosa: usa
Codice:
gcc -o energia.exe -Wall -Wextra -Werror -pedantic energia.c -lm

finché stai iniziando.

Aggiungerei anche -std=c11, dato che di default GCC usa estensioni fuori standard.
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Senior Member
Senior Member
 
Messaggio: 530 di 1130
Iscritto il: 09/01/2011, 15:12

Re: [C] gcc non compila

Messaggioda UeCiccio » 26/10/2019, 14:58

vict85 ha scritto:E poi ovviamente manca l'int prima del main... Ho l'impressione che tu stia imparando C su un libro pre-standard (cioè pubblicato prima del 1989).

Il libro è del 2006.

Sono riuscito a creare il file .exe scrivendo -lm alla fine. Grazie mille per l'aiuto.
Vorrei sapere a che servono le opzioni -Wall -Wextra -Werror -pedantic
UeCiccio
Starting Member
Starting Member
 
Messaggio: 3 di 12
Iscritto il: 23/10/2019, 17:47

Re: [C] gcc non compila

Messaggioda Raptorista » 26/10/2019, 16:09

Quelle opzioni servono a dire al compilatore di segnalare tutti i warning, anche quelli extra, segnalarteli come errori e di essere pedante nel seguire lo standard. In pratica ti aiutano a trovare errori nel tuo codice che altrimenti non vedresti. Per esempio, ce n'è uno che io vedo e che quelle flag fanno saltare fuori.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5350 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C] gcc non compila

Messaggioda vict85 » 26/10/2019, 17:48

UeCiccio ha scritto:
vict85 ha scritto:E poi ovviamente manca l'int prima del main... Ho l'impressione che tu stia imparando C su un libro pre-standard (cioè pubblicato prima del 1989).

Il libro è del 2006.

Sono riuscito a creare il file .exe scrivendo -lm alla fine. Grazie mille per l'aiuto.
Vorrei sapere a che servono le opzioni -Wall -Wextra -Werror -pedantic


Il punto è che quel codice sembra vecchio e ritengo che sia colpa del libro. Le variabili possono ormai essere definite in qualsiasi punto del codice e ci sono reali vantaggi a definirle solo quanto servono. Inoltre è utile sempre inizializzare le variabili a qualche valore quando le definisci. Questi due piccoli accorgimenti rendono il codice più leggibile, più facile da mantenere ed eliminano il rischio di alcuni errori insidiosi.

Inoltre, a mio avviso, la funzione pow non andrebbe insegnata. Infatti, non ha alcun senso usare pow per calcolare potenze basse, calcolabili con uno o due prodotti. E spesso viene usata all'interno di cicli, anche se sarebbe possibile calcolare la nuova potenza a partire dalla vecchia con una singola moltiplicazione.
vict85
Moderatore
Moderatore
 
Messaggio: 9921 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite