【问题标题】:How to copy a fortran pointer value to an array after pointer is assigned分配指针后如何将fortran指针值复制到数组
【发布时间】:2021-11-17 03:46:40
【问题描述】:

代码是 Fortran 主程序调用 C 函数并返回整数数组指针的示例。问题是我想将 Fortran 指针分配给具有 C 数组值的 Fortran 数组,所以我让 Fortran 指针同时指向两个目标。我现在知道这是错的。但是由于 Fortran 没有像 *p 这样的操作,我怎样才能使 Fortran 数组与分配的 Fortran 指针具有相同的值?

fortran 主要代码在这里:

 program Test
    use, intrinsic :: iso_c_binding, only : c_ptr,        &
                    c_f_pointer,  &
                    c_int
  USE FTN_C
  type(c_ptr) :: c_p
  integer(c_int), pointer :: f_p(:)
  integer, target :: Solution(10)

 
  c_p = C_LIBRARY_FUNCTION()
  call c_f_pointer(c_p, f_p, [10]) 
  !c_f_pointer assigns the  target, cptr, to the Fortran pointer, 
  fptr, and specifies its shape.
  
  f_p => Solution ! Solution cannot be pointed
  print *, f_p
  print *, Solution

end program Test

C代码在这里:

int* C_Library_Function(){
  static int  r[10];
  for (int i = 0; i < 10; ++i){
        r[i] = i;
  }
  return r;
}

结果显示:

 ./a.out
      0      1      2       3       4        5        6        7        8         9
 337928192   1   338811792  1    1073741824  0    337933009    1   338567264      1

仅供参考,ISO_C_Binding 模块代码是

  MODULE C_Binding
  USE, INTRINSIC :: ISO_C_BINDING
END MODULE C_Binding 

module FTN_C
INTERFACE
    FUNCTION C_LIBRARY_FUNCTION() BIND(C,& 
                     NAME='C_Library_Function')
        USE C_Binding
        IMPLICIT NONE
        type(C_PTR) :: C_LIBRARY_FUNCTION 
    END FUNCTION C_LIBRARY_FUNCTION
END INTERFACE 
end module FTN_C

【问题讨论】:

  • 欢迎您,我建议使用tour

标签: pointers fortran fortran-iso-c-binding


【解决方案1】:

你从未初始化过Solution。它没有理由包含一些特定的值。它是未定义的。只需将值设置为有意义的值。

f_p 曾经指向Solution 的事实无关紧要。

你的问题的标题很奇特。它提到了一些分配,但您的代码示例中没有分配。所有数据都是静态的。你那边一定有什么误会。 C 函数不分配任何东西。它只包含一个静态本地数组,并返回一个指向该本地数组的指针。

首先,使f_p 指针指向主程序本地的Solution 数组。但随后您将指针更改为指向 C 函数中的 r 本地数组。指针不再指向Solution,而是指向C 函数内部的rSolutionr 是两个不同的独立静态数组。

如果你想从 C 函数返回一个数组,就像你可以从 Fortran 函数返回一样——这是不可能的。你可以做各种其他的事情,而不是Returning an array using C,但是你会以某种方式将结果中的数据复制到你想要自己设置的数组中。您还将负责为结果分配的任何临时内存管理。相反,最好将指向 Fortran 数组的指针传递给 C 函数并让它直接设置值。

【讨论】:

  • 感谢您的回复!我会再次编辑它
  • 对不起,我想我将解决方案初始化为指针目标。所以它应该在 f_p =>Solution 之后包含相同的值。你能再解释一下吗?
  • Solution 是一些静态数组。你让指针指向它。但是随后您将指针更改为指向 C 函数中的本地数组。指针不再指向Solution,它指向C 函数内部的rSolutionr 是两个不同的独立静态数组。
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多