我正在寻找一种方法来在同一个程序单元中使用两个并发数组来处理一组字符信息。
例如,我想要
CHARACTER(1) Array1(40960)
和
CHARACTER(4096) Array2(10)
指向相同的信息。
注意我在这个例子中一直小心,数组的维度和等级的乘积是相同的。
我希望解决方案为allocatable
,因此我认为EQUIVALENCE
或COMMON
不起作用。
有什么想法吗?
答案 0 :(得分:3)
这样的事情:
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属性。
答案 1 :(得分:0)
如果由于某些令人愉快的模糊和不太可能的原因,您的编译器的默认字符类型与其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标准的某些部分十五次,以确保它符合要求,而不是其他。