Fortran Coder

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

[混编] FORTRAN与C#中数据传递方式的请教

[复制链接]

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
跳转到指定楼层
楼主
发表于 2016-12-12 16:02:05 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhuhuanlai 于 2016-12-12 20:10 编辑

大侠好,小弟有事请赐教!
我有一个成熟的FORTRAN小程序,输入量几十个,输出量几百个。程序的结构为主程序,若干子程序和用MODULE定义的全局变量(程序的输入量,这些变量在主程序和各个子程序中都有用到)。
现想用C#做一个界面,通过FORTRAN输出DLL(初想用显示链接),把用MODULE定义的全局变量(输入量)从C#界面中输入,不知道该如何传递数据。
周老师的书(Intel_Visual_Fortran(周振红))上介绍过三种:
如果使用例程参数,我想传递的是MODULE定义的全局变量,好像不相符。同时好像不能直接用!$DEC导出MODULE
如果使用模块,我看周老师的书中说要把.LIB文件链接到执行文件,不太方便。
如果使用全局变量,感觉有点复杂了。
补充一句,传递数据的同时还会把fortran中需由C#操作的程序用!$DEC导出
小弟是一枚非专业程序猿,提问中不专业的地方,还请谅解!


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

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
沙发
 楼主| 发表于 2016-12-13 10:03:23 | 显示全部楼层
pasuka 发表于 2016-12-12 22:25
不妨试试将输入参数转换成namelist,简单易用

感谢您热心的回复,非常感谢!
我在彭国伦的书上了解到NAMELIST类似于COMMOM。通常用于读取文件,很少用在键盘输入,因为用键盘输入会很麻烦。而我的想法是在C#界面中通过键盘输入变量,如果我用NAMELIST,实现起来会不会麻烦一点,同时NAMELIST也可以用!$DEC输出吗?
我主要的想法还是用周振红老师三种方法中选择一种,只是实在是看不明白了。

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
板凳
 楼主| 发表于 2016-12-13 11:48:56 | 显示全部楼层
vvt 发表于 2016-12-13 11:03
最简单的方法,还是用参数传递.
可以把输入参数都写在一个 struct 里,传递给 fortran,当做 type 使用.
fortr ...

感谢您及时且详尽的回复,非常感谢!

感觉您是常用混合编程,我的理解是:
输入量:C#的struct---FORTRAN的type---FORTRAN的module
输出量:FORTRAN的type---C#的struct,再显示在C#界面上
还请指教一下:周振红老师的书上(312页)说由于用到了自派生类型,要把.LIB运行库链接到执行文件,操作起来是不是不太方便,我想用显示链接,有其他的解决办法吗?
另外,您能分享一下这种数据传递的简单例程代码吗,先谢谢了!

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
地板
 楼主| 发表于 2016-12-13 11:49:12 | 显示全部楼层
vvt 发表于 2016-12-13 11:03
最简单的方法,还是用参数传递.
可以把输入参数都写在一个 struct 里,传递给 fortran,当做 type 使用.
fortr ...

感谢您及时且详尽的回复,非常感谢!

感觉您是常用混合编程,我的理解是:
输入量:C#的struct---FORTRAN的type---FORTRAN的module
输出量:FORTRAN的type---C#的struct,再显示在C#界面上
还请指教一下:周振红老师的书上(312页)说由于用到了自派生类型,要把.LIB运行库链接到执行文件,操作起来是不是不太方便,我想用显示链接,有其他的解决办法吗?
另外,您能分享一下这种数据传递的简单例程代码吗,先谢谢了!

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
5#
 楼主| 发表于 2016-12-13 13:57:06 | 显示全部楼层
本帖最后由 zhuhuanlai 于 2016-12-13 14:01 编辑
vvt 发表于 2016-12-13 13:01
我这里有一个和 C++  混编用结构体的例子.可以借鉴

感谢您的分享!我先消化一下。
您这种混编方式可以不通过DLL输出也能实现,是把两种语言的代码放到一个解决方案的两个工程中,设置启动程序后在运行吧?我用的IVF+VS

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
6#
 楼主| 发表于 2016-12-24 23:57:29 | 显示全部楼层
pasuka 发表于 2016-12-15 10:40
若是成熟Fortran代码,程序的输入文件肯定有规范,C#程序生成一个输入文件,通过dos命令调用Fortran的可 ...

感谢您的热心指导,这几天在消化帖子里的东西,没有及时回复,请谅解,祝您圣诞快乐!!!

58

帖子

9

主题

0

精华

熟手

F 币
256 元
贡献
163 点
7#
 楼主| 发表于 2016-12-25 00:19:10 | 显示全部楼层
本帖最后由 zhuhuanlai 于 2016-12-25 00:20 编辑
fcode 发表于 2016-12-13 22:29
c# 这样写
[mw_shl_code=csharp,true]using System;
using System.Collections.Generic;

感谢雪球如此详尽的指导,我都不好意思再提问了,真心感谢雪球和VVT的帮助!
这半个月时间我消化了本帖子的内容,在C#中也做成了一个简单界面,如下图一所示:

计算Y.a的结果是正确的,但是Y.rr的结果看不明白,还请指点!
如果我如此赋值:Y.a ="A"将出现无法将类型“string”隐式转换为“int”的错误。这可能是由于函数的返回值是整数类型。
细看程序,我发现对下边的语句理解不够:
int c=myfortran(ref X, ref Y);
中C的含义不太明白。
同时,X的修饰方式为引用修饰,与C#中结构的类型不一致(下图二所示,来自C#语法教材),是否也可以(从Y.a的运行结果来看,应该是可以的)?

最后:Fortran和C#之间可能要传递整数类型,浮点数类型,甚至还有字符串和数组(B%a  = "OUT" // c_null_char似乎也是返回字符串给B.a)。如何传递浮点数类型,还有字符串和数组,还请抽空帮忙指点,不胜感激!
祝圣诞节快乐!!!

图一.png (2.74 KB, 下载次数: 266)

图一

图一

图二.png (111.71 KB, 下载次数: 256)

图二

图二
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-4 20:08

Powered by Tencent X3.4

© 2013-2024 Tencent

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