Kyl*_*S-C 5 string fortran character-arrays fortran-iso-c-binding
我必须编写一个可以由 C 和 Fortran 调用的子例程。该子例程将文件名作为其参数之一。我知道为了与 C 良好地互操作,ISO C 绑定建议使用字符数组进行互操作。
我的问题是:是否存在易于编写的字符数组文字之类的东西?我有一个这样的子程序:
subroutine my_sub(char_array)
use iso_c_binding, only: c_char
char(kind=c_char, len=1), dimension(:), intent(in) :: char_array
...
end subroutine my_sub
Run Code Online (Sandbox Code Playgroud)
是否可以通过以下方式调用它:
call my_sub('Hello World!')
Run Code Online (Sandbox Code Playgroud)
或者我必须做一些可怕的事情,比如:
call my_sub((/ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' /))
Run Code Online (Sandbox Code Playgroud)
我的主要问题似乎是它不喜欢假定形状的数组,并且给它一个设定的(大)大小也会输出随后拾取的所有垃圾内存。
有更好的方法吗?
序列关联规则允许类似的情况。您可以使用
call my_sub('Hello World!')
Run Code Online (Sandbox Code Playgroud)
但前提是您使数组假定大小dimension(*)或明确的形状。
通常,在 Fortran 2008 中,您不能将假定形状数组用于 C 互操作过程。这将改变未来,但会更加复杂。
另一件重要的事情。仅使用iso_c_binding模块并不能使过程具有 C 互操作性。您必须使用bind(C),可能与绑定名称一起使用。这才是重要的事情。即使没有模块(仅限有限的模块),您也可以创建可互操作的过程。传递字符串而不是1字符数组的特性也取决于此。
这就是为什么我不喜欢说“使用 iso_c_binding 来创建可互操作的过程”。
该过程的接口必须在 Fortran 中明确。
| 归档时间: |
|
| 查看次数: |
6869 次 |
| 最近记录: |