指针阵列到一个不连续的数组部分

arg*_*asm 3 arrays fortran pointers

我可以有一个指向目标数组的不连续部分的指针数组吗?在以下程序中:

program test
  implicit none

  integer :: i
  integer, dimension(4), target :: orig
  integer, dimension(:), pointer :: ref

  orig = (/ (i , i = 1,4) /)

  ref(1:2) => orig(1:2)   
  ref(3:3) => orig(4:4)

  print *, 'orig = ', orig
  print *, 'ref = ', ref

end program test
Run Code Online (Sandbox Code Playgroud)

我希望指针ref指向(/1,2,4/)目标数组的不连续部分orig.代码编译时没有警告,但是输出不是所希望的:

code output:
 orig =            1           2           3           4
 ref =            4
Run Code Online (Sandbox Code Playgroud)

看起来编译器强制指针指向一个连续的子部分,即使我首先指向索引1:2但编译器只强制指向4:4.结果,我在末尾的指针只指向一个条目.

我可以将条目打包(/1,2,4/)到另一个数组中然后连续使用它,但这对于大数据集来说不是有效的Fortran编码.你知道怎么做这个吗?

Ian*_*anH 5

指针赋值具有所谓的边界重映射."整个"指针对象是指定的指针,但它给出了左侧括号中指示的边界.这使得您具有除1之外的下限,并且指针的等级与目标不同.当虚拟数组是显式或假定大小时,此功能类似于数组参数关联所具有的功能.

你不能指向目标数组的任意元素 - 目标中的元素必须是"常规" - 它们之间有一个恒定的步幅.

作为重新打包的替代方法,您显然可以将这些索引存储在数组中,并使用整个目标和索引数组的组合来获取所需的行为,可能是通过将指针包装到整个目标和索引数组中具有已定义赋值的派生类型.

  • 您将源代码的简单性与性能混淆. (2认同)