Newsgroup: it.comp.os.linux.development
Titolo: Problemi con la funzione "sin"

Egreggi Signori.
Mi permetto di inrompere nella quiete di questo newsgroup per porgervi il
mio problema:
questo il sorgente (ancora non completo, ma già "funzionante") di un
piccolo programma per calcolare il bioritmo di una persona.
Il mio problema rigurada la funzione "sin" se non metto  "#define sin" il
compilatore mi da errore "undefined reference to 'sin'"
messo il "define" non c'è nessun errore ma la funzione non restiusce il
valori ke dovrebbe.
Alcune note sul sistema ke utilizzo:
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)
Versione delle glibc: glibc-2.2.4-24
Vi ringrazio per l'attenzione. DAMNY
#include <stdio.h>
#include <math.h>
#include <time.h>
#define sin
#define Pi 3.14159
typedef struct data{
	int dd;
	int mm;
	int yy;
} Tdata;
	Tdata birth, today;
	int dd_life; /* contiene il numero di giorni trascorsi tra birth e today */
	int T[3] = {23, 28, 33}; 
int get_days(Tdata *data1, Tdata *data2);
/* restituisce il numero di giorni tra data1 e data2 */
/* non ha importanza l'ordine col quale vengono passate le date */
int get_peak(int i);
/* il valore di i [0,1,2] indica il ciclo da prendere in consederazione */
/* restitusce il numero di giorni ke mancano per il prossimo picco */
int main(void)
{
 
	char ciclo[3][4]={ "Fis", "Emo", "Men"};
	struct tm get_today;
	int i=0;
 
	puts("\nBuon giorno questo programma calcola il tuo bioritmo");
	/* inserire qui procedura controllo data */
	puts("\nPrego inserire la tua data di nascita [dd/mm/yyyy]: ");
	scanf("%d/%d/%d", &birth.dd, &
birth.mm
, &birth.yy);
	puts("\nInserisci la data di oggi [dd/mm/yyyy] : ");
	scanf("%d/%d/%d", &today.dd, &
today.mm
, &today.yy);
	dd_life = get_days(&birth, &today);
	printf("%d", dd_life);
	for(i=0;i<3;i++)
	{
		printf("\t%e", sin(Pi/2));
		printf("\t%e", sin(Pi));
		printf("\t%e", sin(0));
		printf("\nIl tuo stato %s è del %f", ciclo[i], sin(((2*Pi)/T[i])*dd_life));
		printf("\nIl picco per lo stato %s sarà tra %d giorni", ciclo[i], get_peak(i));
	}
	return 0;
}
int get_days(Tdata *data1, Tdata *data2)
{
	int mese[12];
	const int YYSTART = 1900;
	int data1_days = 0;
	int data2_days = 0;
 
	/* inizializza vettore mese */
	mese[0]=0;
	mese[1]=31;
	mese[2]=59;
	mese[3]=90;
	mese[4]=120;
	mese[5]=151;
	mese[6]=181;
	mese[7]=212;
	mese[8]=243;
	mese[9]=273;
	mese[10]=304;
	mese[11]=334;
	/* vettore mese inizializzato */
 
	data1_days = (data1->yy - YYSTART) * 365 + mese[(data1->mm)-1] + data1->dd;
	data2_days = (data2->yy - YYSTART) * 365 + mese[(data2->mm)-1] + data2->dd;
 
	return (abs(data1_days - data2_days));
}
int get_peak(int i)
{
 
	int cursor;
 
	cursor = dd_life;
	while( !((sin(((2*Pi)/T[i])*cursor)>0.8) && (sin(((2*Pi)/T[i])*cursor))<1))
		cursor++;
	return (cursor - dd_life);
}

valori ke dovrebbe.
Infatti usando quel define scrivere "sin(x)" equivale a scrivere "(x)".
Invece devi aggiungere il -lm quando compili il programma
gcc -lm file.c -o file
infatti devi dire al linker di usare le funzioni contenute in libm.
Alessandro.

 wrote:

Ogni tanto rimbalza anke qualke altra cosa ;)
Ti ringrazio tantissimo per il tuo interessamento, ti devo una notte
insonne per fare tutti i tentativi del mondo (inutili), infatti pensavo
ad un errore nel codice.
Di nuovo tante grazie.
Damny