Нет, нет простого способа сделать это, по крайней мере, насколько я могу судить. Может быть, если вы скажете , почему вы пытаетесь сделать это, то кто-то может придумать подходящий ответ, например, в моих мыслях производные типы и/или конструкторы массивов могут быть способом, но без контекста это трудно сказать.
А почему вы получите разные ответы, которые вы обращались массив из пределов, так что все может случиться:
[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 не является допустимым индексом. Таким образом, вы находитесь вне пределов, и все может случиться.
Я настоятельно рекомендую при разработке использовать параметры отладки в компиляторе - по моему опыту он может сэкономить вам часы, избегая такого рода вещей!