Czy istnieje jakaś różnica między tymi dwoma metodami deklarowania tablicy o założonym rozmiarze?Zakładane tablice rozmiarów: Colon kontra gwiazdka - DIMENSION (:) arr vs. arr (*)
np.
real, dimension(:) :: arr
i
real :: arr(*)
Czy istnieje jakaś różnica między tymi dwoma metodami deklarowania tablicy o założonym rozmiarze?Zakładane tablice rozmiarów: Colon kontra gwiazdka - DIMENSION (:) arr vs. arr (*)
np.
real, dimension(:) :: arr
i
real :: arr(*)
Postać
real, dimension(:) :: arr
deklaruje przyjąć kształt tablicę, podczas gdy postać
real :: arr(*)
deklaruje przyjęta wielkość tablicy.
I, tak, są różnice między ich użyciem. Różnice powstają, ponieważ, w przybliżeniu, kompilator "zna" kształt tablicy o założonym kształcie, ale nie o tablicy o założonym rozmiarze. Dodatkowe informacje dostępne dla kompilatora oznaczają, że między innymi tablice o założonym kształcie mogą być używane w wyrażeniach tablicowych. Tablica o założonym rozmiarze może być używana tylko w wyrażeniach całej tablicy, gdy jest to faktyczny argument w odwołaniu do procedury, który nie wymaga kształtu tablicy. Aha, a także w połączeniu z wewnętrznym lbound
- ale nie w wywołaniu do wewnętrznego ubound
. Są jeszcze inne subtelne i niezbyt subtelne różnice, które ujawni twoja bliska lektura normy lub dobrej książki Fortran.
Niektóre porady dla nowych programistów Fortran polegają na wykorzystywaniu tablic o przewidywanym kształcie, jeśli to możliwe. Nie były dostępne przed Fortranem 90, więc w starym kodzie zobaczysz wiele tablic o założonym rozmiarze. Zakładane kształty są lepsze w nowym kodzie, ponieważ funkcje shape
i size
mogą być używane do sprawdzania ich wielkości, aby uniknąć błędów poza obszarem i do tablic o wymiarach zależnych od wymiarów tablic wejściowych.
High Performance Mark's answer wyjaśnia różnicę między tymi dwoma stwierdzeniami - w skrócie: tak, jest różnica; tylko jeden deklaruje tablicę o założonym rozmiarze - i implikacje.
Jednak jako dimension(:)
, ale wspomniano, pozornie przeciwko nie dimension(*)
, dodam jedną rzecz.
real, dimension(:) :: arr1
real, dimension(*) :: arr2
jest równoważna
real :: arr1(:)
real :: arr2(*)
lub nawet przy użyciu dimension
oświadczenia. [Nie chcę zachęcić, że tak nie będę pisać przykład.]
Ważną różnicą w tej kwestii jest użycie *
i :
, nie dimension
.
Być może było pewne połączenie założonego rozmiaru z argumentem atrapa? Jest to fałszywy argument, w którym ten wybór jest najczęstszy.
Porady dla nowych programistów Fortran - jeśli to możliwe, używaj macierzy o określonych kształtach.Nie były dostępne przed Fortranem 90, więc sprzedajesz dużo tablic o założonym rozmiarze w starym kodzie, ale założony kształt jest lepszy w nowym kodzie. Wolę formę real :: arr (:) deklarowania macierzy o założonym kształcie, bez słowa kluczowego DIMENSION, ale to kwestia gustu. – Fortranner
Edytowałem odpowiedź. – Fortranner
należy zauważyć, że nowoczesna założona postać '(:)' forma wymaga jawnego interfejsu. Jeśli pracujesz nad starym kodem z zewnętrznymi podprogramami, musisz użyć '*' lub podać interfejs. – agentp