2011-01-18 21 views
12

Fortran 90 Specification neden (5.2.8) TARGET anahtar sözcüğünün bir POINTER'ı ilişkilendirmek için kullanılması gerektiğini belirtir (5.2.8)? Neden her tür geçerli bir TARGET değil? Örneğin Fortran POINTER neden bir TARGET gerektiriyor?

,
 
INTEGER, POINTER :: px 
INTEGER, TARGET :: x 
x = 5 
px => x 
geçerli sözdizimi ama
 
INTEGER, POINTER :: px 
INTEGER :: x 
x = 5 
px => x 
geçerli değil olmasıdır.

Neden bu olmalı?

cevap

15

İşaret edilebilecek bir öğe başka bir öğeye takılabilir ve derleyici buna izin vermelidir. Hedef özniteliği olmayan öğeler takma ve derleyici, bu duruma dayalı varsayımlar yapabilmeli ve bu nedenle daha verimli kod üretebilmelidir.

+0

Önceki yorumum doğru değildi. İşaretçi/hedef birliği bazı gerçekten zor durumlara yol açabilir. Fortran'da işaretçi/hedef dernek uygulamalarıyla deneyimsiz olursanız daha fazla okuma yapmanızı tavsiye ederim. Bkz., Örneğin, bu bağlantı https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/709550 –

2

Fortran'daki işaretçiler, c. Fortran'da 90 işaretçi bir hedefe sahip olmak gibi birkaç kısıtlama ile sağlandı. Bu, hız sorununu ele almak ve işaretçi kullanımını güvenli tutmak için yapıldı. Bir çağrı, bir hedef belirtmeye gerek olmayan, ayrılabilir işaretçiler oluştursa da. Daha derine inin ve onları bulacaksınız!

0

Daha iyi derleyici optimizasyonu için. Kodunuz 1K-100K çalışırsa, hız artar.

Btw TARGET her zaman kullanılmaz. Örneğin, işaretçinin bellek ayırmak için kullanıldığı durumlarda.

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

Derleyiciye bağlı olarak, Bunun çalışması için (x (5)) ayırmanız gerekir. – AlanSE

+0

@AlanSe Hangi derleyici lütfen? Gösterilen çizgiler grubu doğru görünüyor. –

+2

@ user49734 HEDEF, burada (ve hatta yasak) gerekli değildir, çünkü bir işaretçi her zaman "hedeflenebilir" –