Newsgroup: it.comp.lang.c
Titolo: anomalia funzione

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]=12.740752;
k[6]=22.206949;
k[7]=42.525945;
k[8]=91.577558;
k[9]=227.98989;
k[10]=677.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]=12.740752;
v[2]=22.206949;
v[3]=42.525945;
v[4]=91.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]=12.740752;
v[2]=k[6]=22.206949;
v[3]=k[7]=42.525945;
v[4]=k[8]=91.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

 adriano
Ci dai la dichiarazione dei vettori al di fuori della funzione? prima
che tu chiami la funzione.

che tu chiami la funzione.
ecco il main() con la dichiarazione dei vettori:
////////////////////////////////////////////////////////////////////////////
///////////////////
main()
{
int N=32, n, n_regime, T;
struct parametri_elettrici  r;
double
v[N],k[N],m[N-1],q[N-1],mi[N-1],qi[N-1],a[N-1],ai[N-1],b[N-1],bi[N-1],c[N-1]
,ci[N-1],vcb1, veb1, Icb2, Ieb2;
r.vt=0.025;
inizializza_vettori(&r,
&v[0],&k[0],&m[0],&q[0],&mi[0],&qi[0],&a[0],&b[0],&c[0],&ai[0],&bi[0],&ci[0]
,N);
}
////////////////////////////////////////////////////////////////////////////
///////////////////
grazie,
adriano