2014-07-03 23 views

Odpowiedz

32

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.

+8

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

+0

Edytowałem odpowiedź. – Fortranner

+3

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

11

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.