|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2003
Città: Palermo
Messaggi: 596
|
debug (funzioni modificano indici del ciclo iterativo)
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.
__________________
Athlon II X2 240e 45watt, MB gigabyte nForce 720d, 4 giga ram ddr2 800mhz, ati 5750 1giga ram ddr5, ssd intel x25-m 80giga 2° gen. + ssd OCZ 60 giga, dual boot Windows xp sp3 e Windows seven ultimate 64 bit. Sistema raffreddamento attivo 3 ventole noctua ultralow voltage. Ultima modifica di angel110 : 19-10-2008 alle 17:01. Motivo: errore |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:44.