Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+的访问数组+;来自Fortran的结构? C++中,我在Fortran中分配了一个S数组,我想访问这个数组的元素。我该怎么做_C++_Fortran_Dynamic Arrays_Language Interoperability - Fatal编程技术网

C+的访问数组+;来自Fortran的结构? C++中,我在Fortran中分配了一个S数组,我想访问这个数组的元素。我该怎么做

C+的访问数组+;来自Fortran的结构? C++中,我在Fortran中分配了一个S数组,我想访问这个数组的元素。我该怎么做,c++,fortran,dynamic-arrays,language-interoperability,C++,Fortran,Dynamic Arrays,Language Interoperability,C++: Fortran 2003: USE ISO_C_Binding TYPE, BIND(C) :: SFortran REAL(c_double) :: a,b END TYPE SFortran S和SFortran现在应该是互操作的,但我也需要有一种方法来访问C++中声明的数组元素。我希望在FORTRAN中有SC(5)%A对应于ArayOFS(4)。C++中的一个。如何声明和设置具有此访问权限的Fortran数组SC的正确值?您可以: 1)将C++数组传递给一个FORTRAN绑

C++:

Fortran 2003:

USE ISO_C_Binding
TYPE, BIND(C) :: SFortran
REAL(c_double) :: a,b
END TYPE SFortran

S和SFortran现在应该是互操作的,但我也需要有一种方法来访问C++中声明的数组元素。我希望在FORTRAN中有SC(5)%A对应于ArayOFS(4)。C++中的一个。如何声明和设置具有此访问权限的Fortran数组SC的正确值?

您可以:

1)将C++数组传递给一个FORTRAN绑定(C)过程,该过程采用适当的数组参数。

SUBROUTINE proc(array) BIND(C, NAME='proc')
  ...
  TYPE(SFortran) :: array(*)
使用这种方法,您可能还希望传递数组的大小,并使数组参数显式化

b)将C++中的数组指针作为外部“C”全局,然后通过Fortran模块变量与Bin(C)进行互操作。 同样,它可能适合单独使用数组的大小,以避免在C_F_指针引用中对其进行硬编码


哪种方法最好取决于您的需求

不需要在C++中转换<代码>新< /COD>的返回值。在我吹毛求疵的时候,把初始值设定项和声明放在一起是惯用的:
s*arrayOfS=new s[123]而不是在单独的行上。演员阵容是为了清晰。同一行与不同行是一个“圣战”问题。但这也不是生产代码;这是一个简化的示例,可以让问题变得清晰。使用英特尔Fortran编译器XE 12.1.3.300,我得到一个链接错误“未定义的外部符号c\u f\u指针\u集合\u标量”。导致此错误的源代码行是“调用C_F_指针(scPtr,sc,1)”,其中scPtr对应于您的数组,sc对应于您的“数组”。无论是在英特尔的文档中还是通过谷歌,我都找不到任何关于c_f_指针_集合_标量的引用。有什么建议吗?这向我表明,链接步骤中没有包含任何英特尔Fortran运行库。在Windows上,该过程在ifmodintr.lib中定义。右上!链接正在使用IVF 11.1.065中的库。我将其更改为Composer XE 2011 SP1\Compiler\lib\ia32,链接错误消失。
SUBROUTINE proc(array) BIND(C, NAME='proc')
  ...
  TYPE(SFortran) :: array(*)
MODULE some_module
  USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_F_POINTER
  ...
  TYPE(C_PTR), BIND(C, NAME='arrayOfS') :: array_ptr
  ...
  ! In a procedure in the module...
  TYPE(SFortran), POINTER :: array(:)
  CALL C_F_POINTER(array_ptr, array, [123])