anomalia funzione
Von: adriano meis (umiumiumi@invalid.it) [Profil]
Datum: 03.07.2008 19:36
Message-ID: <w68bk.20324$Ca.14702@twister2.libero.it>
Newsgroup: it.comp.lang.c
Datum: 03.07.2008 19:36
Message-ID: <w68bk.20324$Ca.14702@twister2.libero.it>
Newsgroup: it.comp.lang.c
Salve,
ho il dev c++ e win98.
avviene un fenomeno stranissimo.
Ho realizzato una funzione:
void inizializza_vettori(struct parametri_elettrici *p,double *v, double *k,
double *m, double *q, double *mi, double *qi, double *a,double *b, double
*c, double *ai, double *bi,double *ci, int N)
Il suo obiettivo è inizializzare i vettori v e k, ecc. con gli opportuni
valori (lasciate perdere
il fatto che passo alla funzione dei puntatori che non vengono mai
impiegati. Nel codice che riporto ho tolto la parte finale )
I valori per i=0 e per i=1 vengono ricavati a parte. Gli altri con il ciclo
for.
//////////////////////////////////////////////////////////////////////////
void inizializza_vettori(struct parametri_elettrici *p,double *v, double *k,
double *m, double *q, double *mi, double *qi, double *a,double *b, double
*c, double *ai, double *bi,double *ci, int N)
{
int i;
double base;
base=0.83333;
v[0]=-9;
v[1]=0;
printf("v[0]=%f\n", v[0]); getchar();
printf("v[1]=%f\n", v[1]); getchar();
k[0]=exp(v[0]/(p->vt))-1;
k[1]=exp(v[1]/(p->vt))-1;
printf("k[0]=%f\n", k[0]); getchar();
printf("k[1]=%f\n", k[1]); getchar();
for(i=2;i<N; i++)
{
v[i]=9*pow(base,(N-i));
k[i]=exp(v[i]/(p->vt))-1;
printf("v[%d]=%f\n", i, v[i]); getchar();
printf("k[%d]=%f\n", i, k[i]); getchar();
}
printf("v[1]=%f\n", v[1]); getchar();
printf("v[2]=%f\n", v[2]); getchar();
printf("v[3]=%f\n", v[3]); getchar();
printf("v[4]=%f\n", v[4]); getchar();
/*
ora vengono riportati gli esiti della stampa a video dei vettori v[] e k[]:
v[0]=-9;
v[1]=0;
v[2]=0.037910;
v[3]=0.045492;
v[4]=0.054591;
v[5]=0.065509;
v[6]=0.078611;
v[7]=0.094334;
v[8]=0.113201;
v[9]=0.135842;
v[10]=0.163011;
k[0]=-1;
k[1]=0;
k[2]=3.555782;
k[3]=5.169909;
k[4]=7.878473;
k[5].740752;
k[6]".206949;
k[7]B.525945;
k[8]‘.577558;
k[9]"7.98989;
k[10]g7.87687;
*/
}
////////////////////////////////////////////////////////////////////////////
Ebbene, se testo questa funzione da sola, a parte, allora ogni printf
inserita mi stampa a video i valori
corretti.
Se invece inserisco questa funzione in un programma lunghissimo che impiega
una decina di altre
funzioni, allora avviene un fenomeno stranissimo:
1)
la printf che sta dentro il ciclo for:
printf("v[%d]=%f\n", i, v[i]); getchar();
mi stampa i valori esatti per ogni valore di "i:
v[1]=0;
v[2]=0.037910;
v[3]=0.045492;
v[4]=0.054591;
...
Diversamente le quattro printf appena dopo il ciclo for :
printf("v[1]=%f\n", v[1]); getchar();
printf("v[2]=%f\n", v[2]); getchar();
printf("v[3]=%f\n", v[3]); getchar();
printf("v[4]=%f\n", v[4]); getchar();
mi stampano i valori errati:
v[1].740752;
v[2]".206949;
v[3]B.525945;
v[4]‘.577558;
L'aspetto singolarissimo è che questi valori non sono casuali, ma
conincidono con gli opportuni
valori di K[i], come potete appurare voi stessi.
Infatti, non capisco per quale strano meccanismo, avviene che:
v[1]=k[5].740752;
v[2]=k[6]".206949;
v[3]=k[7]B.525945;
v[4]=k[8]‘.577558;
La stranezza è che ciò capita solo se questa funzione venga impiegata
all'interno del programma
lungo generale, ma non se la testo da sola, con l'opportuno main che serve
solo per passargli i
parametri.
Inoltre, se io rimuova all'interno del ciclo for la istruzione:
k[i]=exp(v[i]/(p->vt))-1;
allora questo prooblema scompare, e tutte le quattro printf appena dopo il
ciclo for, mi
restituiscono i valori corretti!
Ora io chiedo: come si spiega ciò? è errata la funzione riportata? Sono
errate le funzioni
intorno ad essa nel codice circostante nel programma lunghissimo?
Il mio dubbio è che possa essere errato il compilatore o il computer, perchè
questo stamparmi i
valori di K[i], quando gli chiedo di stamparmi i valori di v[i], francamente
non si sipiega,
anche perchè un attimo prima li ha stampati corretti.
La causa di diverso passaggio dei parametri dal main alla funzione nei due
casi(se la testo da
sola, o nel programma lungo), lo esluderei. Infatti ho ricontrollato varie
volte, ed è identico nei
due casi.
Quale potrebbe essere il motivo di questo fenomeno bizzarro ?
grazie,
adriano
[ Auf dieses Posting antworten ]Antworten
- fnegroni (04.07.2008 00:30)
