Fortran Coder

查看: 14881|回复: 14
打印 上一主题 下一主题

[混编] FORTRAN与C#混合编程的调用约定

[复制链接]

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

楼主
发表于 2016-10-29 18:54:38 | 显示全部楼层
楼上说得很对,你看到的资料都是比较古老的版本,其中基本都是不规范的用法(IVF或部分编译器扩展支持)

现在,建议用 ISO_C_Binding 模块来统一与 C 语言混编。这样做的好处是规范,适合与所有编译器。
有关 ISO_C_Binding 可以参考《Modern Fortran Explained》第12章  Interoperability with C 与C语言交互
我对 C# 不懂,但是想来它调用 C 语言的 DLL 是非常简单的。如果你用了 ISO_C_Binding 那么接口就是和 C 的接口一样了。

部分问题:
1、如果我在FORTRAN代码中输入:
! DEC $ ATTRIBUTES StdCALL: : Filename
那在C#代码中需要输入CallingConvention Cdel还是CallingConvention StdCall?


当然是 StdCall ,两边要一致。但是用了 ISO_C_Binding 以后,不再用这个语句,那么 C# 应该用 cdel

2.关于FORTRAN调用约定的详细说明,在哪里能找到呢(我在帮助文件中找过,感觉介绍得不是特别详细)
帮助文档里有专门的 mix language 章节。

3.我只需要在FORTRAN中使用ALIAS 修改变量A的定义,而在C#不需要做任何修改就可以吗?
是的。C# 代码就视为 alias 里面的名字就好。
用了 ISO_C_Binding 以后,C# 视为 Bind( C ,Name="这里的名字" )

4、有哪些变量需要修改其定义,与动态链接库有关的变量是否都需要修改(我在FORTRAN中用到了IMSL动态链接库和其他动态链接库)?
你只需要修改想让 C# 操作的那些符号(变量或函数)就可以,内部使用了其他的函数库,不与混编问题发生关联。

5、我只需要在C#中使用ALIAS 修改变量A的定义,而在FORTRAN不需要做任何修改就可以吗?
6、两种解决方案中,哪种更加合适,比如运行更加稳定,不容易出错。
建议在 Fortran 里使用 ISO_C_Binding,以后不管是 C# 还是 Delphi 或者其他语言,均视为 C 接口
实际上,这些解决方案都可行,都稳定,只要方法得当,都不容易出错。就好像夫妻两个人不协调,那么丈夫迁就妻子,妻子迁就丈夫。都是可以的。
区别只是,ISO_C_Binding 是规范的。

7、如果我采用这种解决方案,变量A的已经是使用值传递了,那为什么还要在C#中再次声明呢?
混编就好像插头和插座,如果插头定义了是双孔,而插座依然是三孔,那还是无法匹配。
8、有哪些变量需要设置值传递,与动态链接库有关的变量是否都需要修改(我在FORTRAN中用到了IMSL动态链接库和其他动态链接库)?
同4

9.如果我采用这种解决方案,已经使用C#的ref 关键字,那为什么还要在FORTRAN中声明为[VALUE]?
同7

10、需要协调的二维数组包括哪些,比如FORTRAN代码中主程序范围内的,还是子程序范围内的,或者是我在我在FORTRAN中用到了IMSL动态链接库和其他动态链接库都要协调?
同4

11、协调字符串的具体代码及方法。
字符串建议 C# 里面用指针,Fortran 里面用 C_PTR 定义,用 C_F_Pointer 和 C_LOC 转换。因为这是标准的语法规范。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

沙发
发表于 2016-10-30 22:03:56 | 显示全部楼层
确实没有中文资料。
本论坛“编程工具”区,混编分类下面有一些帖子,你或许可以参考。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-7 02:03

Powered by Tencent X3.4

© 2013-2024 Tencent

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