Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] undefined reference to "sin"

    Sono sotto linux e alle prime armi......
    Cosa c'è che lo disturba in n= sin(x) ; per dirmi undefined reference to "sin" ?
    Mi dice che x deve essere in radianti ...quindi espresso come ( non in gradi ) ?
    Molte grazie .

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>

    main()
    {

    double sin(double x);


    double x = 0 ;
    int n = 0 ;

    n = sin(x) ;

    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    643
    Non ho capito perche' n la dichiari int, visto che sin poi restituisce un double.
    Comunque a me col dev c++ in windows non da' errori, dichiarando n come double.
    Prova cosi'
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define PI_GRECO 3.14159265
    
    main()
    {
    
    double x, n;
    x= 90.0; // angolo di cui vuoi calcolare il seno
    
    n = sin(x*PI_GRECO/180) ;
    }

  3. #3
    È inutile aggiungere quel prototipo, il prototipo di sin c'è già in math.h; infatti quello non è un errore di compilazione, ma di linking.
    Comunque, il punto è che la definizione di sin e delle altre funzioni matematiche è contenuta nella libreria libm.a (o .so), che non è linkata di default (per motivi fondamentalmente storici). Il fatto che in Dev-C++ non sia necessario dipende dal fatto che lì si compila con g++, che linka automaticamente libstdc++.a, che a sua volta si tira dietro libm.a.

    Comunque, long story short, devi aggiungere sulla linea di comando di gcc, dopo tutti i sorgenti, lo switch -lm (ad esempio:
    codice:
    gcc file.c -lm -o file.x
    ).

    Quanto al resto, ti è già stato spiegato che devi usare un double per il risultato di sin, altrimenti, dato che nella conversione a int il risultato viene troncato, otterrai come risultato solo zero (tranne forse che per i casi π/2 + nπ, a seconda della precisione con cui fornisci π ).

    Quanto ai radianti... beh, lì basta sapere due cose di geometria...
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    È inutile aggiungere quel prototipo, il prototipo di sin c'è già in math.h; infatti quello non è un errore di compilazione, ma di linking.
    Comunque, il punto è che la definizione di sin e delle altre funzioni matematiche è contenuta nella libreria libm.a (o .so), che non è linkata di default (per motivi fondamentalmente storici). Il fatto che in Dev-C++ non sia necessario dipende dal fatto che lì si compila con g++, che linka automaticamente libstdc++.a, che a sua volta si tira dietro libm.a.

    Comunque, long story short, devi aggiungere sulla linea di comando di gcc, dopo tutti i sorgenti, lo switch -lm (ad esempio:
    codice:
    gcc file.c -lm -o file.x
    ).
    Penso che tu abbia centrato il problema ma ....facendo da linea comando produce l ' object ma
    questo non esegue l 'operazione...e non da segnalazioni di errore.
    Sotto l ' IDE netbeans mi da >>>
    gcc -c -lm -g -I. -MMD -MP -MF build/Debug/GNU-Linux-x86/_ext/home/lando/Scrivania/Programmi_C/Application_1/../rmain.o.d -o build/Debug/GNU-Linux-x86/_ext/home/lando/Scrivania/Programmi_C/Application_1/../rmain.o ../rmain.c
    gcc: -lm: linker input file unused because linking not done .

    Ho dato double invece che int alla variabile n ( anche se " man sin" dice che deve essere un intero) .

    Grazie .

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Lo switch -c è utilizzato per compilare senza linkare. Perchè mai lo utilizzi?

    ( anche se " man sin" dice che deve essere un intero) .
    Ma sei sicuro?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Originariamente inviato da oregon
    Lo switch -c è utilizzato per compilare senza linkare. Perchè mai lo utilizzi?
    Ho dei problemi col makefile nel progetto con Netbeans ....
    do un makefile come sotto e mi dice che manca separatore ,non so cosa intenda... >>>>

    rmain: rmain.o
    cc -o -g -lm
    rmain: rmain.c
    cc -c -o -g


    ciao , grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.