Fortran Coder

楼主: lcy_ouc
打印 上一主题 下一主题

[混编] 初次使用iso_c_binding实现c调用fortran出现问题,麻烦懂得指教

[复制链接]

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
板凳
 楼主| 发表于 2017-10-21 10:44:49 | 只看该作者
kyra 发表于 2017-10-21 08:31
见如下注释

[mw_shl_code=fortran,true]subroutine ricker(fz,tmax,dt,prick) Bind(C,Name="ricker")

非常感谢你的回答,解决了很大问题!如果fortran程序中不调用库函数就没有问题。
当调用库函数时,比如这里调用了exp,就出现下述错误:
sub.o: In function `ricker':
sub.f90:(.text+0x292): undefined reference to `expf'
collect2: error: ld returned 1 exit status。
请问这个问题应如何解决?

255

帖子

0

主题

0

精华

版主

World Analyser

F 币
699 元
贡献
502 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2017-10-21 08:31:19 | 只看该作者
见如下注释

[Fortran] 纯文本查看 复制代码
subroutine ricker(fz,tmax,dt,prick) Bind(C,Name="ricker")
  use,intrinsic :: iso_c_binding
  implicit none
  integer(c_int) , value :: fz,tmax !//传值
  integer(c_int) :: i
  real(c_float)  , value :: dt!//传值
  type(C_PTR)    , value :: prick !//C指针
  real(C_FLOAT)  , pointer :: rick(:) !//fortran指针
  real(C_FLOAT)  :: t
  real,parameter :: PAI=3.141593
  call c_f_pointer( prick , rick , [tmax+1]) !//转换
  rick(0:) => rick(1:)
  open(10,file='ricker.dat')
      do i=0,tmax
          t=i*dt
          !rick(i)=(1-2*(PAI*fz*(t-1.2/fz))**2)*exp(-(PAI*fz*(t-1.2/fz))**2)
          rick(i)=0.0
          write(10,*) t,rick(i)
      end do
  close(10)
end subroutine ricker


[C] 纯文本查看 复制代码
#include <stdio.h>
void ricker(int fz,int tmax,float dt,float rick[]);
int main(){
     const int tmax=500;// tmax 必须为const,否则需要malloc为rick分配空间
     int fz;
     float dt,t,rick[tmax+1];

      fz=40;
      dt=0.001;

      ricker(fz,tmax,dt,rick);

      printf("ricker wavelet is computed!");
      getchar();
      return 0;
}
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-19 21:55

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表