gpt4 book ai didi

c - 如何创建一个接口(interface)来为 fortran 转换 c 字符数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:32:36 25 4
gpt4 key购买 nike

我正在用 c 为 fortran 程序编写一个模块,我需要将一些字符串传递给 fortran 程序。我无法修改 Fortran 代码,但可以编写自己的 Fortran 代码来调用现有代码。我试过用谷歌搜索这个,有很多不同的方法是在我不理解的水平上编写的。

c 字符串是可变长度的(尽管它是在传递之前设置的)。 Fortran“字符串”被声明为字符*(*),所以我看不到字符数组需要填充到的长度。下面是一些代码片段,看看我需要做什么。

我写的c函数:

void c_func(int db_handle) {
char *geom_name;
int geom_handle = 0;

size_t geom_name_len = db_get_len(db_handle); !gets the length of the name
geom_name = (char *)malloc(sizeof(char*(geom_name_len+1)));
db_pull(db_handle, geom_name); !pulls geom_name from db as a null terminated string
call_fortan_function(geom_handle, geom_name); !The fortran function will set the integer
...}

我无法修改的 fortran 函数用名称做一些事情,然后为句柄设置一个值:

logical function f_fn(handle, name)

integer handle
character*(*) name

我假设最好的方法是创建一个单独的 c 函数,将 geom_name 解析为一些 fortran 将使用的东西,然后一个 fortran 函数来创建 fortran 字符串并将其传递给我不能的函数改变,但我不知道该怎么做。有帮助吗?

最佳答案

您不能从 C 中可移植地调用需要 character(*) 的 Fortran 过程。这是不可能的,因为该过程通常采用另一个定义字符串长度的参数。您可能会尝试猜测它的格式,可能它是附加的 int 作为最后一个参数。

我会制作另一个 Fortran 包装器,它将采用一个具有长度的 int 和一个长度为 length 的字符数组,最好没有尾随 \0.

logical function f_wrap(handle, name, length) bind(C,name="f_wrap")
use iso_c_binding
integer(c_int),value :: handle
integer(c_int),value :: length
character(1,kind=c_char),intent(in) :: name(length)
character(length) :: tmp

tmp = name
f_wrap = f_fn(int(handle), tmp)
end function

tmp 可能不需要,因为二进制表示是一样的,试试吧。

关于c - 如何创建一个接口(interface)来为 fortran 转换 c 字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19034668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com