主题:教一个fortran和vb混合编程的问题,请大家帮帮
happyholiday
[专家分:0] 发布于 2008-06-04 15:27:00
环境:CVF6.6 和vb6.0企业版
现在手头有一个fortran77源程序(主程序,及13个子程序,1个函数)
需要用vb做一个界面,传递31个参数,并把运算结果传回。
请问:这个fortran dll生成的时候需要特殊注意什么? 比如fortran中源主程序需要如何修改,传31参数可否type一个类型,以怎样的方式传递,我是新手,请大家一定帮帮忙回答一下,越详细越好! 感谢
回复列表 (共12个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2008-06-04 15:52:00
如果F程序不是很长的话,你在vb里重新写一遍来的更快、简单。
板凳
okbaby [专家分:100] 发布于 2008-06-04 18:18:00
刚好最近在搞一些数值计算方面的程序,Fortran、VB混合编程虽然不象C++和Fortran那样直接在源代码里相互调用,但也是比较容易的。需要注意的地方有以下几项:
1、Fortran编译成的DLL文件,函数名默认都是大写,不知道的话根本就调不起来,如果要更改的话需要适用Alias来更改,例如:
!下面是某函数的导出定义
!DEC$ ATTRIBUTES DLLEXPORT::FUNCTION1
!更改大小写如下:
!DEC$ ATTRIBUTES ALIAS "Function1"::FUNCTION1
2、Fortran的字符串和VB中不同,Fortran字符串包括字符串内容和字符串长度,因此在传递时需要额外传递字符串长度信息(一个32位整型变量),例如:
!函数在Fortran中的原型:
SUBROUTINE FUNCTION1(s)
'在VB中声明时需要如下形式:
Declear Sub FUNCTION1 Lib "libName.Dll" (ByVal s As String,Byval i As Long)
'使用方式如下:
FUNCTION1(s,Len(s)) '注意s不要包含Unicode字符。
3、你说的能否采用结构来代替,原则上是可以的,只要保证传递给Fortran函数的参数在内存中的次序和长度一致就行。关于VB中结构体在内存中的形式,你可以查阅相关资料。不过最好还是按照定义的参数来。
4、另外要注意Fortran中的数据类型,保证VB中的和Fortran中的一致,Fortran在数据精度方面要比VB灵活的多,如果Fortran中声明的数据类型在VB中没有对应类型就比较麻烦了。这个就要看你的程序了。
5、最后参数传递方式,Fortran中变量都是按址传递的(字符串除外,参考第2条),就像VB中的ByRef,VB声明只需采用ByRef即可。不过注意数组也是按址传递的,这个在VB中比较麻烦,例如要传递的是IntArray的第5个元素的地址,在VB中就需要一定的技巧,相关内容上网搜搜VB指针。
3 楼
happyholiday [专家分:0] 发布于 2008-06-06 09:12:00
那么fortran源码中的主程序我怎么处理??必须用vb写么
4 楼
okbaby [专家分:100] 发布于 2008-06-06 15:12:00
Fortran中的每一个程序包括主程序都可以通过在声明后添加如下的语句来标识为到处函数:
!DEC$ ATTRIBUTES DLLEXPORT::FUNCTION1
你需要将你的Fortran程序设置成DLL,而不是可执行程序,然后在需要导出的函数声明后加上如上语句即可。
5 楼
happyholiday [专家分:0] 发布于 2008-06-10 10:12:00
--------------------Configuration: slabcall - Win32 Debug--------------------
Compiling Fortran...
C:\MSDev\MyProjects\slabcall\slabcall.for
C:\MSDev\MyProjects\slabcall\slabcall.for(2) : Error: Conflicting attributes or multiple declaration of name. [STATE]
cDEC$ ATTRIBUTES DLLEXPORT::STATE
----------------------------^
Error executing df.exe.
slabcall.dll - 1 error(s), 0 warning(s)
6 楼
happyholiday [专家分:0] 发布于 2008-06-10 10:13:00
program state 是主程序
7 楼
happyholiday [专家分:0] 发布于 2008-06-10 10:16:00
请教这dll编译为啥过不去呢?
如果可以 能不能加msn 或者qq 呢 真诚求助
msn:bate0829@msn.com
QQ:9547227
8 楼
happyholiday [专家分:0] 发布于 2008-06-12 10:33:00
将原有主程序改写成相应的子函数或子
过程,这个子函数或子过程再调用其他子函数或
子过程,因此其他的子函数或子过程就不能仅仅
用RETURN语句返回,而应用“RETURN选择项”.
相应的在子函数或子过程定义时除了虚参表还应
加上RETURN返回选择项的定义以*表示:子函
数(或子过程)(虚参表,*,*,*,*),而在调用
该子函数(或子过程)则加上相应的返回标号:
CALL子函数(或子过程)(实参表,*10,*20,*
30,*40).
能帮忙详细解释一下这段话么,谢谢
9 楼
okbaby [专家分:100] 发布于 2008-06-13 11:23:00
最近几天硬盘坏掉了,忙着拯救数据!呵呵,不好意思。
[quote]program state 是主程序[/quote]
在Dll类型的程序中没有主程序的概念,你需要将他改成过程或函数。不修改肯定是编译不过去的。
10 楼
okbaby [专家分:100] 发布于 2008-06-13 12:20:00
[quote]将原有主程序改写成相应的子函数或子
过程,这个子函数或子过程再调用其他子函数或
子过程,因此其他的子函数或子过程就不能仅仅
用RETURN语句返回,而应用“RETURN选择项”.
相应的在子函数或子过程定义时除了虚参表还应
加上RETURN返回选择项的定义以*表示:子函
数(或子过程)(虚参表,*,*,*,*),而在调用
该子函数(或子过程)则加上相应的返回标号:
CALL子函数(或子过程)(实参表,*10,*20,*
30,*40).
能帮忙详细解释一下这段话么,谢谢[/quote]
你参考以下下面的内容:
http://202.118.74.226/fortran/pages/a30.htm
我来回复