angel110
19-10-2008, 17:00
Salve a tutti sono nella fase di debug, uso visual studio 2008,
più o meno sono riuscito ad isolare la parte che non va:
C'è un ciclo iterativo che riassumo:
do i=1, margine(j)
{
funzione 1
funzione 2
call C06EKF(1,Temp2, In_Vect, D, IFAIL)
assegnamento1..
.
.
}
end do
"margine" è un vettore di interi, in questo caso il ciclo deve concludersi quando "i" raggiunge il valore "margine(j)"... Naturalmente j entra nei limiti del vettore. J ad esempio è 1 e quindi margine(1) è uguale ad esempio a 5 quindi, 5 iterazioni da fare.
Il problema sta nel fatto che le funzioni all'interno del ciclo
modificano i valori del vettore "margine", e di conseguenza,
il programma dopo un pò va in crash .. Se tutto funzionasse il programma dovrebbe fare circa 5 iterazioni. Ho controllato e ricontrollato la funzione1 e funzione2 non fanno assolutamente riferimento al vettore margine, eppure ho visto con i miei occhi che quando esco da quella funzione i valori del vettore margine sono cambiati.
Per farvi capire
la funzione1 è del tipo
funzione1(par1, par2)
{
int i, j;
successiva elaborazione sui par1 e par2;
return par1;
}
Nella fase di debug controllando tutte le istruzioni una alla volta, dopo il return ho visto che i valori del vettore "margine" sono tutti cambiati più o meno in questo modo:
margine(1) = 43534
margine(2) = 322
margine(3) = 323
.
.
e così via
Che si fa in questi casi?
Il problema è da cercare all'interno delle funzioni o altrove?
p.p.s.
Io programmo in fortran ma il concetto è uguale anche per gli altri linguaggi.
L'istruzione "call C06EKF(1,Temp2, In_Vect, D, IFAIL)" è una chiamata ad una libreria esterna la quale modifica solamente i suoi parametri.
più o meno sono riuscito ad isolare la parte che non va:
C'è un ciclo iterativo che riassumo:
do i=1, margine(j)
{
funzione 1
funzione 2
call C06EKF(1,Temp2, In_Vect, D, IFAIL)
assegnamento1..
.
.
}
end do
"margine" è un vettore di interi, in questo caso il ciclo deve concludersi quando "i" raggiunge il valore "margine(j)"... Naturalmente j entra nei limiti del vettore. J ad esempio è 1 e quindi margine(1) è uguale ad esempio a 5 quindi, 5 iterazioni da fare.
Il problema sta nel fatto che le funzioni all'interno del ciclo
modificano i valori del vettore "margine", e di conseguenza,
il programma dopo un pò va in crash .. Se tutto funzionasse il programma dovrebbe fare circa 5 iterazioni. Ho controllato e ricontrollato la funzione1 e funzione2 non fanno assolutamente riferimento al vettore margine, eppure ho visto con i miei occhi che quando esco da quella funzione i valori del vettore margine sono cambiati.
Per farvi capire
la funzione1 è del tipo
funzione1(par1, par2)
{
int i, j;
successiva elaborazione sui par1 e par2;
return par1;
}
Nella fase di debug controllando tutte le istruzioni una alla volta, dopo il return ho visto che i valori del vettore "margine" sono tutti cambiati più o meno in questo modo:
margine(1) = 43534
margine(2) = 322
margine(3) = 323
.
.
e così via
Che si fa in questi casi?
Il problema è da cercare all'interno delle funzioni o altrove?
p.p.s.
Io programmo in fortran ma il concetto è uguale anche per gli altri linguaggi.
L'istruzione "call C06EKF(1,Temp2, In_Vect, D, IFAIL)" è una chiamata ad una libreria esterna la quale modifica solamente i suoi parametri.