Mam program, który przypisuje tablicy poza jej granicami i oczekiwałem, że zostanie zgłoszony błąd podczas wykonywania. Jednak w ogóle nie popełniono błędu, a program zapisuje się w pamięci nierejestrowanej. Czy jest jakaś opcja kompilatora, aby się przed tym zabezpieczyć? Po wyświetleniu zrzutu pamięci jasne jest, że ten nadmierny zasięg jest prawdziwy. Czy istnieje sposób na zadeklarowanie zmiennych lub specyfikacji argumentów, aby to złapać? Oczywiście jest to oczywisty przypadek, ale kiedy ma się utrzymywać tysiące linii kodu pochodzącego z F77, nie zawsze jest jasne (dla mnie), czy to się dzieje.Dlaczego nie występuje błąd środowiska wykonawczego, gdy wyraźnie zapisuje się na granicach tablicy?
PROGRAM TEST_CODE
IMPLICIT NONE
INTEGER*4 :: R(5) ! Array of 5
CALL R_TEST(R, 10)
END PROGRAM
SUBROUTINE R_TEST(R, J)
IMPLICIT NONE
INTEGER*4, INTENT(INOUT) :: R(1) ! Dummy is array of 1
INTEGER*4, INTENT(IN) :: J
INTEGER*4 :: K
DO K=J-5,J+5 ! K=5..15
R(K) = K ! No Runtime Error
END DO
END SUBROUTINE
kompilator Intel Fortran 2011 XE, i tak używam spec bajtowy INTEGER*4
bo wiem, co mam z nim.
Oto opcje kompilatora do sprawdzania czasu wykonywania.
Dzięki za odpowiedź. Jeśli kompilator nie może przyjąć ciągłej pamięci, to w jaki sposób obsługuje indeksowanie tablicy. Czy nie każda tablica zwiększa się o stałą odległość od poprzedniej, tak jak z tablicami C? – ja72
Nie, założone tablice kształtów, takie jak R (:), nie mają ciągłości. C nie ma tablic (wskaźniki nie są liczone!). Istnieją jednak metody w C do tworzenia ciągłych wskaźników tablicy (zobacz http://stackoverflow.com/questions/5196318/reallocation-of-contiguous-2d-array). W Fortranie możesz to sprawdzić po prostu. Testowałem i uzyskuję 10-15% wzrost wydajności, gdy używam atrybutu allocatable. Kiedy wykonujesz mieszane programowanie C/Fortran, możesz odwzorować R (:) na tablicę wskaźników typu C. –