Fortran Coder

标题: 有人熟悉fortranVB混合的没?我遇到奇怪问题了。 [打印本页]

作者: vswr    时间: 2014-6-2 11:47
标题: 有人熟悉fortranVB混合的没?我遇到奇怪问题了。
非常简单,使用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



作者: vvt    时间: 2014-6-2 13:32
我这里没有 VB6.0 ,只有VS,试了一下VB.NET 没有问题。

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

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

QQ截图20140602133056.gif

作者: vswr    时间: 2014-6-2 21:31
感谢! 我发现问题了! 其实我测试时写成了 Dim mya(1),myb(1) As Single

那样的话,导致在.net中正常,而vb6.0中就不对了。
作者: vvt    时间: 2014-6-2 21:34
OK ,发现了就好。
作者: 葫芦055    时间: 2015-12-15 00:07
楼主好,我跟你遇到了同样的问题,并且复制的代码也是运行不了
作者: 葫芦055    时间: 2015-12-15 00:07
葫芦055 发表于 2015-12-15 00:07
楼主好,我跟你遇到了同样的问题,并且复制的代码也是运行不了

复制了你的代码
作者: 葫芦055    时间: 2015-12-15 00:10
葫芦055 发表于 2015-12-15 00:07
复制了你的代码

vb.net也不行
作者: 晒sunstar    时间: 2017-1-13 14:19
葫芦055 发表于 2015-12-15 00:10
vb.net也不行

你试一下我这个例子。
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, 下载次数: 399)

0.jpg

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

1.jpg





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2