Obecnie próbuję zakodować mały podprogram w Fortranie, aby zwolnić wszystkie przydzielone zmienne w pamięci, gdy mój program dojdzie do błędu, tj. Nie udało się załadować pliku lub nieistniejący potrzebny plik. W tym momencie wykonanie musi zostać zakończone, ale nie wszystkie alokatory są przydzielane w sposób konieczny (zależy to od tego, gdzie na kodzie pojawił się błąd), więc nie mogę wykonać czyszczenia, usuwając wszystkie z nich.Fortran DEALLOCATE
Moje obecne podejście jest następujące:
SUBROUTINE Cleanup(A)
REAL(8), ALLOCATABLE, DIMENSION(:) :: A
IF (ALLOCATED(A)) THEN
DEALLOCATE(A)
END IF
END SUBROUTINE
i nazywają "Oczyszczanie" dla każdego allocatable. Problem polega na tym, że nie wszystkie moje zmienne są wymiarami 1. W niektórych z nich mam do trzech wymiarów.
Najpierw pomyślałem o napisaniu 3 różnych podprogramów dla różnych wymiarów i przy użyciu przeciążenia, ale to nie wydaje się być bardzo eleganckie.
Wtedy przyszło mi do głowy, że może mógłbym przekazać wskaźnik zamiast argumentu A, ale mam google'a i wygląda na to, że nie można zwolnić zmiennej docelowej za pomocą wskaźnika.
Wszelkie pomysły na temat tego, jak to zrobić prawidłowo?
Dzięki.
Po zakończeniu wykonywania wszystkie zasoby wykorzystywane przez Twój kod są automatycznie zwalniane w dowolny sposób, więc nie musisz się martwić o jednoznaczne zwolnienie ich. –
Wiem, że Fortran automatycznie zwalnia pamięć, ale w tym przypadku piszę bibliotekę dll, która jest wywoływana z Labview, więc to właśnie zarządza pamięcią. Gdy biblioteka DLL dojdzie do błędu, Labview nagle zatrzymuje się, a jeśli spróbuję ponownie wykonać, wyświetli komunikat "Array is already allocation" i zostanie wyłączony. Oznacza to, że pamięć nie jest prawidłowo przydzielana. – derkomai
Uwaga: "rzeczywisty (8)" nie ma 8 bajtów. Przenośny sposób to 'use ISO_FORTRAN_ENV',' real (real64) 'dla 64 bitów. –