Attualmente sto provando a codificare una piccola subroutine in Fortran per deallocare tutte le variabili allocate in memoria quando il mio programma arriva a un errore, cioè un file non caricato o un file necessario inesistente. A questo punto, l'esecuzione deve essere terminata, ma non tutti gli allocataboli sono necessariamente allocati (dipende da dove è apparso sul codice l'errore è apparso), quindi non posso fare una pulizia deallocandoli tutti.Fortran DEALLOCATE
Il mio approccio attuale è la seguente:
SUBROUTINE Cleanup(A)
REAL(8), ALLOCATABLE, DIMENSION(:) :: A
IF (ALLOCATED(A)) THEN
DEALLOCATE(A)
END IF
END SUBROUTINE
e chiamare "pulizia" per ogni allocatable. Il problema con questo è che non tutte le mie variabili sono dimensione-1. Ho un massimo di tre dimensioni in alcuni di essi.
Prima ho pensato di scrivere 3 diverse subroutine per diverse dimensioni e l'utilizzo di overload, ma questo non sembra essere molto elegante.
Poi mi è venuto in mente che forse potevo passare un puntatore anziché l'argomento actuall A, ma ho cercato su Google e sembra che non sia possibile deallocare una variabile di destinazione tramite un puntatore.
Qualche idea su come farlo correttamente?
Grazie.
Quando l'esecuzione viene interrotta, tutte le risorse utilizzate dal codice vengono automaticamente liberate in qualsiasi modo, quindi non devi preoccuparti di rilasciarle esplicitamente. –
So che Fortran libera automaticamente la memoria, ma in questo caso sto scrivendo una DLL che viene chiamata da Labview, quindi questo è chi gestisce la memoria. Quando la DLL giunge a un errore, Labview si interrompe improvvisamente e, se provo a rieseguire, mostrerà il messaggio: "La matrice è già allocata" e si spegne. Ciò significa che la memoria non viene deallocata correttamente. – derkomai
Nota: 'reale (8)' non è garantito che sia 8 byte. Un modo portabile è 'usa ISO_FORTRAN_ENV',' real (real64) 'per 64 bit. –