2011-01-18 11 views
12

Dlaczego Fortran 90 Specification określa (5.2.8), że słowo kluczowe TARGET musi zostać użyte do powiązania z nim POINTERa? Dlaczego każdy typ nie jest prawidłową CELEM?Dlaczego POINTER Fortranu wymaga DOCELOWEJ TARGETY?

Na przykład

 
INTEGER, POINTER :: px 
INTEGER, TARGET :: x 
x = 5 
px => x 
jest Poprawna składnia ale
 
INTEGER, POINTER :: px 
INTEGER :: x 
x = 5 
px => x 
jest nie ważne.

Dlaczego to musi być?

Odpowiedz

15

Element, który może być wskazywany, może być aliasowany na inny element, a kompilator musi na to zezwalać. Elementy bez docelowego atrybutu nie powinny być wygładzane, a kompilator może na tej podstawie opierać się na założeniach, a tym samym tworzyć bardziej efektywny kod.

+0

Mój poprzedni komentarz był niepoprawny. Związek wskaźnika/celu może prowadzić do naprawdę trudnych sytuacji. Polecam dalsze czytanie, jeśli nie masz doświadczenia w praktykowaniu powiązań wskaźnika/celu w Fortranie. Zobacz na przykład ten link: https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/709550 –

2

Wskaźniki w Fortranie różnią się od wskaźników w c. W Fortranie dostarczono 90 wskaźników z kilkoma ograniczeniami, jak posiadanie celu. Zostało to zrobione, aby rozwiązać problem z prędkością i utrzymać bezpieczeństwo wskaźnika. Chociaż jedno wywołanie umożliwia przydzielanie wskaźników, które nie muszą określać celu. Kop głębiej, a znajdziesz je !!

0

Dla lepszej optymalizacji kompilatora. Kiedy twój kod działa na prędkości rdzenia 1K-100K ma znaczenie.

Btw TARGET nie zawsze jest używany. Na przykład w sytuacjach, gdy wskaźnik jest używany do przydzielania pamięci.

... 
real, pointer :: p(:), x 
... 
allocate(p(15)) 
... 
x => p(1:5) 
... 
nullify(x) 
deallocate(p) 
... 
+0

W zależności od kompilatora, musisz przydzielić (x (5)), aby to zadziałało. – AlanSE

+0

@AlanSe Który kompilator proszę? Pokazany zestaw linii wydaje się być właściwy. –

+2

@ user49734 TARGET nie jest tu potrzebny (a nawet zabroniony), ponieważ wskaźnik jest zawsze "możliwy do zaatakowania" –