2011-03-20 22 views
6

Büyük bir ana diziye sahip olmak ve alt dizileri kullanarak farklı bölümlerine başvurmak istiyorum. Şu anda bunu yapmak için ofset indisleri kullanıyorum, ancak bu şekilde yapmak çok karmaşık olabilir.Fortran'da işaretçiler kullanarak alt diziler oluşturabilir miyim?

Bir alt boyut dizisi (9) ve alt_diziler1 ana_dizisinin ilk 3 öğesine işaret eden alt_diziler2 alt_dizisi2'nin sonraki 3 öğeye ve alt_dizge3 noktalarına işaret edecek şekilde bir alt boyut dizisi (3) alabilir miyim? son 3 öğe?

Örneğin, diziler şöyle tanımlanacaktır:

integer, dimension(9) :: master_array 
integer, dimension(3) :: sub_array1, sub_array2, sub_array3 

dizileri arasındaki ilişki şöyle olacaktır: Bundan başka

sub_array1(1) -> master_array(1) 
sub_array1(2) -> master_array(2) 
sub_array1(3) -> master_array(3) 

sub_array2(1) -> master_array(4) 
sub_array2(2) -> master_array(5) 
sub_array2(3) -> master_array(6) 

sub_array3(1) -> master_array(7) 
sub_array3(2) -> master_array(8) 
sub_array3(3) -> master_array(9) 

, sahip olacak şekilde karıştırılarak veri türleri olması mümkündür Daha büyük bir ana dizi tamsayı içinde bir alt alt dizisi?

cevap

11

Evet, kullanabilirsiniz yardım için şimdiden

Teşekkür kesinlikle bir dizinin alt bölgelere işaret etmek işaretçileri kullanır. onlar Dizi boyutunu, adım içerir FORTRAN

program pointerviews 
    real, dimension(10), target :: alldata 
    real, dimension(:), pointer :: left 
    real, dimension(:), pointer :: centre 
    real, dimension(:), pointer :: right 

    alldata = (/ (i, i=1,10) /) 

    left => alldata(1:8) 
    right => alldata(3:10) 
    centre=> alldata(2:9) 


    print *, alldata 
    print *, left 
    print *, centre 
    print *, right 
    print *, (left - 2*centre + right) 
end program pointerviews 

Dizi işaretçileri sadece bir adres daha vardır ve çok bilgileri yazın: Bu tür KDDlerin için şablon hesaplamalar için olduğu gibi durumların, bir çok çok kullanışlı olabilir. Yani böyle daha delice şeyler yapmak (C işaretçiler için kullanılan konum) ve içerebilir atılımlar:

program pointerviews2 
    real, dimension(10), target :: alldata 
    real, dimension(:), pointer :: left 
    real, dimension(:), pointer :: centre 
    real, dimension(:), pointer :: right 

    alldata = (/ (i, i=1,10) /) 

    left => alldata(1:8:2) 
    right => alldata(3:10:2) 
    centre=> alldata(2:9:2) 

    print *, alldata 
    print *, left 
    print *, centre 
    print *, right 

    print *, 'Changing alldata(4) = 9999' 
    alldata(4) = 9999. 

    print *, alldata 
    print *, left 
    print *, centre 
    print *, right 

end program pointerviews2 

Ancak, farklı bir türdedir bir dizinin bölümlere sahip olamaz verilerin geri kalanı, tanımı gereği. Birkaç türden veri içeren bir değişken istiyorsanız, türetilmiş türler veya polimorfizm kullanmanız gerekecektir.

+0

Teşekkürler, bu tam olarak aradığım şey. GPU programlama ve CUDA hakkında bir şey biliyor olsaydınız, geziyordum? CUDA'daki paylaşılan bellek dizileri için aynı şeyi yapmaya çalışıyorum, ancak 'işaretçi' ve 'hedef' özniteliklerinin 'paylaşılan' öznitelikle çakışması mümkün görünmüyor – Eddy

+0

Paylaşılan belleğe işaretçiler biraz CUDA C'de bile garip (OpenCL'de iyi olmasına rağmen); Onlara desteklerin pg fortran ile nasıl olduğu hakkında hiçbir fikrim yok. –

İlgili konular