2014-11-12 2 views
1

Есть ли способ иметь в Fortran указатель на массив, указывающий разные цели?Форвард-указатель массива для нескольких целей

Следующий код показывает, что я пытаюсь сделать, что не работает, как я хочу, так как вторая ассоциация перезаписывает первый

implicit none 
integer, parameter :: n = 3 
integer, target  :: a(n), b(n) 
integer, pointer :: c(:) => NULL() 

a = 4 
b = 5 

c(1:n) => a(1:n) 
c(n+1:2*n) => b(1:n) 

c(1:2*n) = 1 

print*, a 
print*, b 

OUTPUT (ifort) 
     4   1   1 
     1   1   1 
OUTPUT (gfortran) 
     4   4   4 
     1   1   1 

И, любая идея, почему ifort и gfortran ведут себя по-разному в этом случае?

ответ

2

Нет, нет простого способа сделать это, по крайней мере, насколько я могу судить. Может быть, если вы скажете , почему вы пытаетесь сделать это, то кто-то может придумать подходящий ответ, например, в моих мыслях производные типы и/или конструкторы массивов могут быть способом, но без контекста это трудно сказать.

А почему вы получите разные ответы, которые вы обращались массив из пределов, так что все может случиться:

[email protected]:~/test/stack$ cat point.f90 
Program point 

    implicit none 
    integer, parameter :: n = 3 
    integer, target  :: a(n), b(n) 
    integer, pointer :: c(:) => NULL() 

    a = 4 
    b = 5 

    c(1:n) => a(1:n) 
    c(n+1:2*n) => b(1:n) 

    c(1:2*n) = 1 

    print*, a 
    print*, b 

End Program point 
[email protected]:~/test/stack$ nagfor -C=all -C=undefined point.f90 
NAG Fortran Compiler Release 5.3.1(907) 
[NAG Fortran Compiler normal termination] 
[email protected]:~/test/stack$ ./a.out 
Runtime Error: point.f90, line 14: Subscript 1 of C (value 1) is out of range (4:6) 
Program terminated by fatal error 
Aborted (core dumped) 

Подумайте, какие линии

c(1:n) => a(1:n) 
    c(n+1:2*n) => b(1:n) 

делают. В первой строке говорится о том, что c было раньше, c (1: n) является псевдонимом для (1: n). Обратите внимание, что допустимые индексы для c выполняются от 1 до n. Аналогично вторая строка отбрасывает ссылку на a и говорит, что c (n + 1: 2 * n) является псевдонимом для b (1: n). Обратите внимание, что индексы C работают от n + 1: 2 * n, тогда как для b они выполняются от 1: n, но это нормально, поскольку у обоих есть n элементов, и это все имеет значение. Однако следующая строка говорит

c(1:2*n) = 1 

, который не может быть правильным, как вы только что сказали, самый низкий показатель позволил для C равно п + 1, а при п = 3 1 не является допустимым индексом. Таким образом, вы находитесь вне пределов, и все может случиться.

Я настоятельно рекомендую при разработке использовать параметры отладки в компиляторе - по моему опыту он может сэкономить вам часы, избегая такого рода вещей!

Смежные вопросы