Fortran Coder

查看: 10319|回复: 7
打印 上一主题 下一主题

[混编] 有人熟悉fortranVB混合的没?我遇到奇怪问题了。

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
13 元
贡献
6 点
跳转到指定楼层
楼主
发表于 2014-6-2 11:47:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
非常简单,使用VB调用fortran的dll。 各种书都说,只要把vb数组的第一个元素地址传给fortran就好了。我使用vb。net测试了下面的程序,它工作的很好。可是用vb .60时,就有问题了。传入fortran的数组第一个元素是对的,后面的元素都丢了。 因此,fortran再返回来的数都是错的了。 即下面程序中,mya 传入 fortran后 mya(1)  (也就是vb中的 mya(0))是正确的,mya(2)就是诸如2.234234e-43这样的怪东西了。奇怪的是,这样的代码在vb.net中正常的很。 有人有办法解决或者遇到类似问题没? 我试过 cvf 和 ivf11 结果都一样。 希望高手解答!
the code as:
in vb:
[Visual Basic] 纯文本查看 复制代码
Private Declare Sub Dll2 Lib "d:\Dll2.dll" (ByRef a As Single, ByRef b As Single, ByRef n As Long)

Private Sub Command1_Click()
Dim mya(1) As Single
Dim myb(1) As Single
Dim n As Long
mya(0) = 1.01
mya(1) = 1.1
myb(0) = 3.1
myb(1) = 4.1
n = 2
Call Dll2(mya(0), myb(0), n)
aa = myb(1)
End Sub

in fortran:
[Fortran] 纯文本查看 复制代码
module testdll
IMPLICIT NONE
contains
subroutine Dll2(a,b,n)
  ! Expose subroutine Dll2 to users of this DLL
  !DEC$ ATTRIBUTES   :: Dll2
  !DEC$ ATTRIBUTES DLLEXPORT,ALIAS: "Dll2":: Dll2
integer n
real   a(n)
real b(n)
b(1)=a(1)
b(2)=a(2)
end subroutine Dll2
end module


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

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
沙发
发表于 2014-6-2 13:32:06 | 只看该作者
我这里没有 VB6.0 ,只有VS,试了一下VB.NET 没有问题。

下载了一个 VB6 精简版,也没问题。

QQ截图20140602133056.gif (34.6 KB, 下载次数: 390)

QQ截图20140602133056.gif

2

帖子

1

主题

0

精华

新人

F 币
13 元
贡献
6 点
板凳
 楼主| 发表于 2014-6-2 21:31:26 | 只看该作者
感谢! 我发现问题了! 其实我测试时写成了 Dim mya(1),myb(1) As Single

那样的话,导致在.net中正常,而vb6.0中就不对了。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
地板
发表于 2014-6-2 21:34:42 | 只看该作者
OK ,发现了就好。

3

帖子

0

主题

0

精华

新人

F 币
22 元
贡献
6 点
5#
发表于 2015-12-15 00:07:12 | 只看该作者
楼主好,我跟你遇到了同样的问题,并且复制的代码也是运行不了

3

帖子

0

主题

0

精华

新人

F 币
22 元
贡献
6 点
6#
发表于 2015-12-15 00:07:37 | 只看该作者
葫芦055 发表于 2015-12-15 00:07
楼主好,我跟你遇到了同样的问题,并且复制的代码也是运行不了

复制了你的代码

3

帖子

0

主题

0

精华

新人

F 币
22 元
贡献
6 点
7#
发表于 2015-12-15 00:10:06 | 只看该作者

vb.net也不行

20

帖子

4

主题

0

精华

入门

F 币
97 元
贡献
48 点
8#
发表于 2017-1-13 14:19:11 | 只看该作者

你试一下我这个例子。
Fortran的dll:
[Fortran] 纯文本查看 复制代码
    subroutine suba(a,b,c)
    !DEC$ ATTRIBUTES stdcall,DLLEXPORT ::suba
    !DEC$ ATTRIBUTES ALIAS:"suba"::suba
    !DEC$ ATTRIBUTES reference :: a,b,c
        implicit none
        real::a
        real::b
        real::c
        c=a+b
    end subroutine


vb6.0的代码:
[Visual Basic] 纯文本查看 复制代码
Private Declare Sub suba Lib "D:\try_for\try_vb\c_dll\Dll1\Dll1\Debug\Dll1.dll" (ByRef a As Single, ByRef b As Single, ByRef c As Single)
Private Sub Command1_Click()
        Dim a As Single
        Dim b As Single
        Dim c As Single
        a = 1#
        b = 2#
        Call suba(a, b, c)
        Text1.Text = c
End Sub


运行结果如下图:

0.jpg (10.24 KB, 下载次数: 411)

0.jpg

1.jpg (9.88 KB, 下载次数: 384)

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

本版积分规则

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

GMT+8, 2024-12-24 20:19

Powered by Tencent X3.4

© 2013-2024 Tencent

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