c - 在 C 中使用 Fortran 函数会导致启动时出现段错误

标签 c gcc fortran gfortran fortran-iso-c-binding

我尝试使用 iso_c_binding 实现 Fortran 派生类型 C 绑定(bind)的基本示例。

circle.f90

module class_circle

use iso_c_binding

implicit none
private
public :: Circle, init_Circle

real(c_double), parameter :: pi = 3.1415926535897932384626433832795

type, bind(C) :: Circle
   real(c_double) :: radius = 1
   real(c_double) :: area
end type Circle

contains

type(Circle) function init_Circle(r) bind(C, name='init_Circle')
   implicit none
   real(c_double), intent(in) :: r

   init_Circle%radius = r
   init_Circle%area = pi * r * r
end function init_Circle

end module class_circle

main_c.c

#include <stdio.h>

struct circle {
    double radius, area;
};

struct circle* init_Circle(double* r);

int main() {
    double r = 10;
    struct circle* c = init_Circle(&r);
    double area = c->area;
    printf("%lg", area);
    return 0;
}

编译:

gcc -g -c main_c.c -o main_c.o
gfortran -g -c circle.f90
gcc -g main_c.o circle.o -o main_c

结果:

[1]    99081 segmentation fault  ./main_c

最佳答案

你的 C 函数原型(prototype)说函数返回一个指向结构的指针

struct circle* init_Circle(double* r);

但是Fortran函数直接返回一个struct

type(Circle) function init_Circle(r) bind(C, name='init_Circle')

你必须保持一致。

另请注意@evets 的评论,无论3.1415926535897932384626433832795 有多少位,它都只是一个单精度数。并且可以使用 value 属性简化函数及其从 C 的调用。

module class_circle

use iso_c_binding

implicit none
private
public :: Circle, init_Circle

real(c_double), parameter :: pi = 3.1415926535897932384626433832795_c_double

type, bind(C) :: Circle
   real(c_double) :: radius = 1
   real(c_double) :: area
end type Circle

contains

type(Circle) function init_Circle(r) bind(C, name='init_Circle')
   implicit none
   real(c_double), value :: r

   init_Circle%radius = r
   init_Circle%area = pi * r * r
end function init_Circle

end module class_circle

.

#include <stdio.h>

struct circle {
    double radius, area;
};

struct circle init_Circle(double r);

int main() {
    double r = 10;
    struct circle c = init_Circle(r);
    double area = c.area;
    printf("%lg", area);
    return 0;
}

.

> gfortran circle.f90 main_c.c
> ./a.out 
314.159

关于c - 在 C 中使用 Fortran 函数会导致启动时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51645961/

相关文章:

fortran - 为什么 MPICH 3.0's ' mpi' 模块省略了某些过程的显式接口(interface)?

mp4转mpeg ts,视频和音频播放速度过快

用 GCC 编译 C 文件会产生错误?

c++ - 与字符串一起使用时对函数模板的 undefined reference (GCC)

c - 如果在参数列表中使用了另一个类型定义的名称,则发出警告

linux - 命名管道和 Fortran 的问题

gcc - 使用gfortran编译: undefined reference to iargc_

关于 IEC 60559 附录的说明

c - 尝试解析 xml 文件时出现段错误

c - 如何快速确定文本文件中的行数?