Fortran Coder

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

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

[复制链接]

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
楼主
发表于 2016-12-13 11:03:32 | 显示全部楼层
最简单的方法,还是用参数传递.
可以把输入参数都写在一个 struct 里,传递给 fortran,当做 type 使用.
fortran 里把这个 type 的成员值赋给对应的module中的变量.
(如果有必要,执行完,再把这些值放回type里)
(或者通过另一个输出的 type 返给 C# , C# 显示在界面上)

通过 type / struct 传递,需要注意结构字节对齐.其他的都很方便.我一直都是这么做的.

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2016-12-13 12:41:17 | 显示全部楼层
你说的是"显式链接"和"隐式链接"
这与是否使用type和派生类型没有关系的.都可以的.

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
板凳
发表于 2016-12-13 13:01:23 | 显示全部楼层
本帖最后由 vvt 于 2016-12-13 13:02 编辑

我这里有一个和 C++  混编用结构体的例子.可以借鉴



[C++] 纯文本查看 复制代码
#include <iostream>
using namespace std;
extern "C" int myfortran( struct in *a , struct out *b);

struct in{
  int i;
  double rr;
};
struct out{
  char a[4];
  double rr;
};
int main()
{
  struct in X;
  struct out Y;
  X.i = 3;
  X.rr= 6.0;    
  int c = myfortran( &X , &Y );
  cout << "C++输出" << Y.a << Y.rr << endl;
  //printf("c=%s,r=%f\n",Y.a,Y.rr);
  return 0;
}

[Fortran] 纯文本查看 复制代码
Integer Function my(pA,pB)  Bind(C,Name="myfortran")
  use , Intrinsic :: ISO_C_Binding
  implicit none
  type T_IN
    integer(C_INT) :: i
    real(C_DOUBLE) :: rr 
  end type T_IN
  type T_OUT
    character(len=4) :: a
    real(C_DOUBLE) :: rr 
  end type T_OUT
  type(T_IN) , pointer :: A
  type(T_OUT), pointer :: B
  type(C_PTR) , value :: pA , pB
  call c_f_pointer( pA , A )
  call c_f_pointer( pB , B )
  write(*,*) '给Fortran输入',A
  B%rr = A%rr + 1.d0
  B%a  = "OUT" // c_null_char
end Function my

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2016-12-13 14:02:53 | 显示全部楼层
通过 obj 或 lib 或 dll 都是可以的,没有多大区别。
VS应该只能用两个工程,不能用同一个工程。(需要把 fortran工程的输出(比如obj或lib)放入C的工程)
也可以用 dll 动态加载方式。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-4 15:15

Powered by Tencent X3.4

© 2013-2024 Tencent

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