我正在寻找一种在同一程序单元中使用两个并发数组来处理字符信息体的方法。
例如,我想要
CHARACTER(1) Array1(40960)
和
CHARACTER(4096) Array2(10)
指向同一个信息体。
注意我在这个例子中一直小心,数组的维度和等级的乘积是相同的。
我希望解决方案是allocatable
,所以我不认为EQUIVALENCE
或COMMON
不会工作。
有任何想法吗?
像这样的东西:
use, intrinsic :: iso_c_binding
...
character, dimension(40960), target :: array1
character(4096), dimension(:), pointer :: array2
...
call c_f_pointer (c_loc(array1), array2, [10])
现在,array2 指向与 array1 相同的存储。如果需要,您可以使 array1 可分配 - 在对 c_f_pointer 的调用中,最后一个参数是一个数组构造函数,其中包含新分配的指针的维度信息。不要忘记array1 上的TARGET 属性。
如果出于某种令人愉快且不太可能的原因,您的编译器的默认字符类型与其 C 字符类型不同,那么您也可以使用序列关联来完成与通过 C 指针游戏相同的结果。例如:
PROGRAM len_remapping
IMPLICIT NONE
CHARACTER, ALLOCATABLE, TARGET :: array1(:)
CHARACTER(10), POINTER :: array2(:)
INTEGER :: i
ALLOCATE(array1(40))
array1 = [(ACHAR(i+'A'-1), i = 1, 40)]
CALL associate_the_pointer( &
array1, SIZE(array1) * LEN(array1), &
array2, LEN(array2) )
PRINT "(*(A,:,1X))", array1
PRINT "(*(A,:,1X))", array2
PRINT *, LEN(array2), SIZE(array2)
CONTAINS
SUBROUTINE associate_the_pointer(targ, elements, ptr, ptr_length)
INTEGER, INTENT(IN) :: elements, ptr_length
CHARACTER(ptr_length), INTENT(IN), TARGET :: targ(elements / ptr_length)
CHARACTER(ptr_length), INTENT(OUT), POINTER :: ptr(:)
ptr => targ
END SUBROUTINE associate_the_pointer
END PROGRAM len_remapping
这种方法的好处是要求您阅读 Fortran 标准的某些部分 15 遍,以确保它符合要求,而不是太多。