Fortran Coder

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

[混编] C#与fortran混合编程的问题

[复制链接]

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

楼主
发表于 2016-11-22 09:24:07 | 显示全部楼层
Fortran不区分大小写,反之 c/c++/c# 区分大小写。
因此,Fortran里的 Bind(c,Name="Add") 此处的 Add 区分大小写。其他的都不区分。比如参数是 A 和 B,但是我写成 a+b 也可以。
[Fortran] 纯文本查看 复制代码
Integer Function Add(A,B)  Bind(C,Name="Add")!//要返回的话,请用 Function
!DEC$ ATTRIBUTES DLLEXPORT :: Add
  use , Intrinsic :: ISO_C_Binding
  implicit none
  integer , value :: A , B !/c#默认是传值,而fortran默认传址。因此要用value修饰
  Add = a + b !// Add(函数名)用于返回,而不能写 return a+b
end Function Add





1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

沙发
发表于 2016-11-22 21:48:04 | 显示全部楼层
1. 不同的语言(甚至同一个语言的不同编译器),都会对函数名字进行修饰(符号修饰),比如把 Add 变成 _Add@8
  对于面向对象语言,由于存在“函数重载”“多态”,可能同一个函数有不同的版本(函数签名不同),或者不同的“namespace”有同名的函数
  因此,它们的符号修饰更夸张,比如把 func 修饰为 _ZN1C2C24funcEi
  在涉及混编的时候,需要把“符号修饰”统一起来(否则一个语言找不到另一个语言的某个函数的真实名字)
  Bind( C ,Name="某某" 就是实现把 fortran 的函数名,用 C 标准的符号修饰。因此,它必须与C#里 dllimport 的名字相同。
2. 一旦找到了函数名,那么参数的名字不需要保持一致。即 C# 里传递的实参是 x y ,而fortran的虚参可以是 a b(或其他名字)
3. 在 Fortran 里 function 与 C# 的 func(){} 类似。subroutine 与 void func() {} 类似。区别仅仅在于此。
   用 function 也可以,用 subroutine 也可以。(虽然 subroutine 没有返回值,但可以通过指针传递参数,或引用传递参数来交换数据)
4. ISO_C_Binding 只规定需要统一的内容,不需要规定的内容由程序员自己控制。
   比如传址还是传值?fortran默认传址,但是可以用 value 修饰变成传值。
   c/c++/c# 默认传值,但可以通过 引用调用(或指针)变成传值。
   因此,ISO_C_binding并不规定到底如何传递,由程序员按需求使用。(但是调用者和被调用者要保持一致)例如此例子,你可以不用 value 修饰,而在 C# 里面把
extern static int Add( int A , int B);
更改为
extern static int Add( ref int A , ref int B);
也是可以的。
5. 就数据类型而言,fortran是比较少的,远远不如 c/c++/c# 多。
   但是,在底层,数据类型其实只有一种(二进制),上层规定出来这么多种。是因为解释和操作的方式不一样。
   c#把自己的任何数据类型传递过来,在底层都是传递了若干字节的二进制。然后 fortran 再用它自己识别的数据类型来解释和操作这些二进制数据。
   
   规定 C_INT , C_SHORT , C_LONG_LONG 这些类型,只是为了消除不同平台(不同编译器)的差异。
   因为某些编译器的 short 占2字节,long 占4字节。但是某些平台的 short占4字节,long占8字节
   
   不管你用何种平台,何种编译器。ISO_C_binding 可以保证在相同平台下的 C/C++/C# 编译器与对应的 ISO_C_binding 中规定的相应类型一致。
   而不需要专门为某种平台修改代码。
   
   它并不能解决哪些“fortran”语言不识别的数据类型(例如unsigned,wchar,tchar)
   
ISO_C_Binding 其实是与 C 语言的交互,而非 C#。所以,在需要两者相互传递的时候,应该把各自上层(面向对象,类)数据转换到较底层的数据进行交互。

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

本版积分规则

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

GMT+8, 2024-5-8 09:57

Powered by Tencent X3.4

© 2013-2024 Tencent

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