PDA

View Full Version : debug (funzioni modificano indici del ciclo iterativo)


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.

gugoXX
19-10-2008, 17:45
Prima cosa, se nessuna cella di margine cambia all'interno del ciclo, e se quindi neppure margine(j) cambia, perche' non prendi il calore di margine(j) prima di iniziare il ciclo?
E' solo per questione di pulizia e di prestazioni, certo non risolve il tuo problema.

Se margine e' un vettore normalissimo, la colpa e' da cercarsi all'interno del ciclo.

cionci
19-10-2008, 18:31
http://www.hwupgrade.it/forum/showthread.php?t=1649196