3

我正在寻找一种在同一程序单元中使用两个并发数组来处理字符信息体的方法。

例如,我想要

CHARACTER(1) Array1(40960)

CHARACTER(4096) Array2(10)

指向同一个信息体。

注意我在这个例子中一直小心,数组的维度和等级的乘积是相同的。

我希望解决方案是allocatable,所以我不认为EQUIVALENCECOMMON不会工作。

有任何想法吗?

4

2 回答 2

4

像这样的东西:

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 属性。

于 2013-09-18T01:02:05.960 回答
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 标准的某些部分 15 遍,以确保它符合要求,而不是太多。

于 2013-09-18T01:56:18.970 回答