angel110
20-10-2008, 17:25
Premetto che il problema in esame è uguale per qualunque linguaggio!
Attualmente sono nella fase di debug, uso visual studio 2008,
la parte che non va è un ciclo iterativo:
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 dopo un pò il programma 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 su 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?
Quale strategia posso usare per capire cosa non va?
p.s.
L'istruzione "call C06EKF(1,Temp2, In_Vect, D, IFAIL)" è una chiamata ad una libreria esterna la quale modifica solamente i suoi parametri.
Attualmente sono nella fase di debug, uso visual studio 2008,
la parte che non va è un ciclo iterativo:
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 dopo un pò il programma 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 su 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?
Quale strategia posso usare per capire cosa non va?
p.s.
L'istruzione "call C06EKF(1,Temp2, In_Vect, D, IFAIL)" è una chiamata ad una libreria esterna la quale modifica solamente i suoi parametri.