gpt4 book ai didi

c - 传播错误字符串 : Fortran > C

转载 作者:行者123 更新时间:2023-12-02 08:25:24 25 4
gpt4 key购买 nike

问题陈述

我代码的主要部分是 C 语言(从 Python 调用)。 C 部分调用用 Fortran 编写的函数。使用错误代码和带有错误描述的错误字符串传播可能的错误。

问题是我似乎无法获得正确的接口(interface)来在 Fortran 中编写字符串并在 C 中读取/复制/操作它。下面的代码概述了我想要做的事情,注释带有 * ... * 指出需要扩展的地方。

C

// global variable: read from Python if an error is encountered
char* error_string;

// template for the Fortan-subroutine
void fortran_calculation_( double* , int* );


int heavy_calculation( double* x )
{

int error_code;


// ... some code ...


// * should accept and write "error_string" *
fortran_calculation_( x , &error_code );

if ( error_code )
{
error_string = "TO BE WRITTEN BY FORTRAN > REMOVE!!";
return 1;
}


// ... some code ...


return 0;

}

中文

subroutine fortran_calculation_(x,error_code)

implicit none

! * include "error_string" as argument *
real*8 :: x
integer :: error_code


! ... some code ...


if ( ... ) then
! * write "error_string" *
error_code = 1
return
end if


return
end subroutine

我已经尝试了很多东西,但我似乎无法让它工作......

最佳答案

你有两个问题。一,如何从 Fortran 访问 C 全局变量。这个比较简单,用 iso_c_binding 在模块中创建一个接口(interface)。参见 https://gcc.gnu.org/onlinedocs/gfortran/Interoperable-Global-Variables.html举个例子。

然而,更棘手的问题是您将 error_string 定义为指向 char 的指针。这意味着您的 Fortran 代码必须在写入之前分配字符串。 Fortran 可分配变量和指针变量使用描述符,而不是原始指针,因此您必须首先创建 C malloc 函数的接口(interface)。只有在那之后你才能写信给它。像这样的东西:


module my_error_string
use iso_c_binding
interface
type(c_ptr) function c_malloc(size) bind(C, name="malloc")
use iso_c_binding
integer(kind=c_size_t), value :: size
end function c_malloc
end interface
type(c_ptr), bind(C) :: error_string

contains
subroutine write_error(str)
character(len=*) :: str
character, pointer :: fstr(:)
integer(c_size_t) :: strlen
integer :: i

strlen = len(str, kind=c_size_t) + 1_c_size_t
error_string = c_malloc(strlen)
if (.not. c_associated(error_string)) then
call perror("error_string is a null pointer => malloc failed?!")
stop 1
end if
call c_f_pointer(error_string, fstr, shape=[strlen])
do i = 1, len(str)
fstr(i) = str(i:i)
end do
fstr(strlen) = c_null_char
end subroutine write_error
end module my_error_string

(更改接口(interface)可能很简单,这样您就可以将分配的 C 字符串传递给 Fortran 函数进行填充,或者使用回调函数。但是如果您想要的话,上述方法是可行的。)

关于c - 传播错误字符串 : Fortran > C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32710234/

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