Fortran Coder

查看: 10419|回复: 6
打印 上一主题 下一主题

[混编] fortran调用c生成的dll出现问题

[复制链接]

4

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
7 点
跳转到指定楼层
楼主
发表于 2017-4-25 00:45:43 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
fortran在调用一个开源软件的dll时,发生错误,请大家指教。
fortran代码如下:
[Fortran] 纯文本查看 复制代码
module cprog
interface
integer function SWMMSTEP(elpTime)                      
!DEC$ ATTRIBUTES C, ALIAS:'swmm_step'::SWMMSTEP
!DEC$ ATTRIBUTES REFERENCE::elpTime
real(kind=8)::elpTime
end function
end interface
real(kind=8)::elpTime       !全局变量
end module cprog

program F90useVCdll
use cprog
implicit none
integer::errorNum
do                    !do_01
      errorNum=SWMMSTEP(elpTime)
       if ((elpTime <= 0.0).or.(errorNum .ne. 0)) exit
enddo
end program

SWMMSTEP的c语言代码如下(DateTime就是double)
[C] 纯文本查看 复制代码
int DLLEXPORT swmm_step(DateTime* elapsedTime)
{
    ...(代码太长)
            *elapsedTime = NewRoutingTime / MSECperDAY;
    return ErrorCode;
}

程序一开始可以运行,运行到一段时间就会出现以下错误,现在检查到主要是SWMMSTEP在do循环中发生问题,请大家指教。

121212.jpg (12.69 KB, 下载次数: 352)

报错提示

报错提示
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

7#
发表于 2017-4-25 10:26:09 | 只看该作者
winston2017 发表于 2017-4-25 09:03
1、在module那里定义的elpTime不是全局变量吗?为什么还需要按照这个来定义?
2、不好意思误导您了,贴出 ...

不加额外申明,C程序哪里认得elpTime这个全局变量

4

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
7 点
6#
 楼主| 发表于 2017-4-25 09:36:46 | 只看该作者
很奇怪,现在有时候调试提示错误又变成了访问冲突



4

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
7 点
5#
 楼主| 发表于 2017-4-25 09:03:01 | 只看该作者
pasuka 发表于 2017-4-25 08:48
1、通过ISO C BINDING可以让C访问Fortran的全局变量,虽然不推荐,参考:
Interoperable Global Variables  ...

1、在module那里定义的elpTime不是全局变量吗?为什么还需要按照这个来定义?
2、不好意思误导您了,贴出来的是我代码的一部分,在原代码中前面有赋值的。
3、非常感谢您的回答!

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

地板
发表于 2017-4-25 08:48:31 | 只看该作者
1、通过ISO C BINDING可以让C访问Fortran的全局变量,虽然不推荐,参考:
Interoperable Global Variables - The GNU Fortran Compiler
https://gcc.gnu.org/onlinedocs/g ... le-Global-Variables
2、elpTime变量为啥没有赋初值?

4

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
7 点
板凳
 楼主| 发表于 2017-4-25 08:14:28 | 只看该作者
fcode 发表于 2017-4-25 07:58
看起来似乎没有问题(在混编接口部分)。断点单步调试一下吧,也许是开源软件的事儿。

此外,你这种混编方 ...

您好,试了您说的新方法,程序直接提示错误了

2233.jpg (28.58 KB, 下载次数: 371)

提示错误

提示错误

2022

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1598 元
贡献
689 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2017-4-25 07:58:02 | 只看该作者
看起来似乎没有问题(在混编接口部分)。断点单步调试一下吧,也许是开源软件的事儿。

此外,你这种混编方法太老土了。有更新潮(主要是规范)的混编方式:

[Fortran] 纯文本查看 复制代码
module cprog
  interface
    integer function SWMMSTEP(elpTime) Bind(C,Name="swmm_step")
      use , intrinsic :: ISO_C_Binding
      real(kind=C_DOUBLE)::elpTime
    end function
  end interface
  real(kind=8)::elpTime       !全局变量
end module cprog

program F90useVCdll
  use cprog
  implicit none
  integer::errorNum
  do        
    errorNum=SWMMSTEP(elpTime)
    if ((elpTime <= 0.0).or.(errorNum .ne. 0)) exit
  enddo
end program F90useVCdll
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-24 01:58

Powered by Tencent X3.4

© 2013-2024 Tencent

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