Fortran Coder

查看: 18040|回复: 11
打印 上一主题 下一主题

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

[复制链接]

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
跳转到指定楼层
楼主
发表于 2017-10-20 21:42:43 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

程序如下:

[Fortran] 纯文本查看 复制代码
subroutine ricker(fz,tmax,dt,rick) Bind(C,Name="ricker")

  use,intrinsic :: iso_c_binding

  implicit none
  integer(c_int) i,fz,tmax
  real(c_float) dt,t,rick(0:tmax)
  real,parameter :: PAI=3.141593

  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()

{
     int fz,tmax;
     float dt,t,rick[tmax+1];

      fz=40;
      tmax=500;
      dt=0.001;


      ricker(fz,tmax,dt,rick);

      printf("ricker wavelet is computed!");
      getchar();
      return 0;

}





分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

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。
请问这个问题应如何解决?

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
板凳
 楼主| 发表于 2017-10-21 12:06:33 | 显示全部楼层

这个没写错,就是错误提示expt了,很奇怪。
[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
  real(c_float)  ,pointer :: rick(:)
  real(c_float) :: t
  real,parameter :: PAI=3.1415926
  
  call c_f_pointer(prick,rick,[tmax+1])
  rick(0:)=>rick(1:)


  !integer(c_int) i,fz,tmax
  !real(c_float) dt,t,rick(0:tmax)
  !real,parameter :: PAI=3.141593

  !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

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
地板
 楼主| 发表于 2017-10-21 14:11:52 | 显示全部楼层
kyra 发表于 2017-10-21 13:31
我这里一切正常,可以运行,并且得到结果

我是用这三个命令编译的:
gfortran -c sub.f90;
gcc -c main.c;
gcc -o main.exe main.o sub.o。
gfortran与gcc版本是4.8.4。是否存在问题?

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
5#
 楼主| 发表于 2017-10-22 08:53:54 | 显示全部楼层
kyra 发表于 2017-10-21 17:18
没问题。我觉得你应该仔细的检查代码。是否自己编辑的,编译的,不是同一个。 ...

好的,再次感谢kyra!

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
6#
 楼主| 发表于 2017-10-23 20:29:49 | 显示全部楼层
kyra 发表于 2017-10-21 17:18
没问题。我觉得你应该仔细的检查代码。是否自己编辑的,编译的,不是同一个。 ...

kyra,你好,今天偶然看到了我之前的问题在哪里。在最后一步连接为exe文件时,应该用gfortran,而不是gcc。

11

帖子

3

主题

0

精华

入门

F 币
75 元
贡献
44 点
7#
 楼主| 发表于 2017-10-23 21:25:44 | 显示全部楼层
kyra 发表于 2017-10-23 21:16
哦,对。
其实用 gcc 也可以。加上
gcc -o main.exe main.o sub.o -lgfortran

学习了,谢谢!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-8 02:16

Powered by Tencent X3.4

© 2013-2024 Tencent

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