0

我用C写一个模块Fortran程序的接口,我需要一些字符串传递给Fortran程序。我无法修改fortran代码,但可以编写我自己的fortran代码来调用现有代码。我曾试着用google搜索,并且有很多不同的方法是我不了解的级别。如何创建转换为C字符数组用于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 

我假设要做到这一点,是要创造一个分析geom_name到一些东西,FORTRAN将使用,然后一个FORTRAN函数来创建FORTRAN字符串,并将其传递给我不能改变功能的单独的C函数的最佳方式,但我不知道该怎么做。任何帮助?

回答

3

不能便携地调用的Fortran程序由C.它需要character(*)是不可能的,因为该过程通常需要限定字符串的长度的另一个理由。你可以尝试猜测它的格式,可能它是额外的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可能是不必要的,因为二进制表示法是一样的,只是尝试。

相关问题