Fortran Coder

楼主: zhuhuanlai

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

[复制链接]

1086

帖子

12

主题

5

精华

论坛跑堂

Fcode跑堂

F 币
772 元
贡献
711 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2016-12-13 22:29:51 | 显示全部楼层
c# 这样写
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace ConsoleApplication1
{
  class Program
  {
    public struct inx
    {
      public int i;
      public double rr;
    }
    public struct outx
    {
      public int a;
      public double rr;
    }
    [DllImport("fortran_lib")] extern static int myfortran(ref inx A, ref outx B);
    static void Main(string[] args) 
    {
      inx X;
      outx Y;
      X.i = 3;
      X.rr= 6.0;
      Y.a = 1;    
      Y.rr=3.0;
      int c = myfortran( ref X , ref Y );
      Console.WriteLine("c# return:");
      Console.WriteLine(Y.rr);
      Console.Read();
    }
  }
}
回复 支持 反对

使用道具 举报

325

帖子

2

主题

0

精华

宗师

F 币
2239 元
贡献
1362 点

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

发表于 2016-12-15 10:40:04 | 显示全部楼层
zhuhuanlai 发表于 2016-12-13 10:03
感谢您热心的回复,非常感谢!
我在彭国伦的书上了解到NAMELIST类似于COMMOM。通常用于读取文件,很少用 ...

若是成熟Fortran代码,程序的输入文件肯定有规范,C#程序生成一个输入文件,通过dos命令调用Fortran的可执行程序即可
那么问题就拆解为:C#程序如何生成Fortran的输入文件
namelist只是简化Fortran输入文件读写的一种途径

58

帖子

9

主题

0

精华

熟手

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

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

58

帖子

9

主题

0

精华

熟手

F 币
254 元
贡献
162 点
 楼主| 发表于 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)。如何传递浮点数类型,还有字符串和数组,还请抽空帮忙指点,不胜感激!
祝圣诞节快乐!!!

图一

图一

图二

图二

1086

帖子

12

主题

5

精华

论坛跑堂

Fcode跑堂

F 币
772 元
贡献
711 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2016-12-25 17:57:07 | 显示全部楼层
Y.a ="A"将出现无法将类型“string”隐式转换为“int”的错误
这是 C# 的问题,我无法解决。猜想是因为 Y.a 是 int 类型,不能直接赋予 "A" 的值(因为它是 string 类型)

int c=myfortran(ref X, ref Y);
这里的 c 是一个int变量,赋予它 myfortran 的返回的值。
8楼的代码里并没有明确返回值是多少,如果你想要返回值,可以在 fortran 代码里操作 my
比如 my = 30
返回之后,c 就会等于 30

X 修饰为 ref,是因为结构体一般都比较大,用 ref 传递比较节约空间。并且可以传回。
(传值是无法传回的)
我也不知道你看的那本书为什么说,结构是值类型。感觉很莫名其妙。(当然我对C#并不了解)

整数,浮点数,字符串,数组,都是可以相互传递或返回的。
之所以放到一个结构体里,是因为简单,易于扩展。(比如增加新的成员变量)

本坛的混编分类里有不少帖子,应该也有不少传递数组和字符串的例子,多看看。就学会了。
虽然不一定是 C# 的,但是有相通之处。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|QQ群|Fcode

GMT+8, 2017-7-26 22:50

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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