新手,在用vb调用dll,传递数值过程中出现问题,其中一个变量NELEMS,在vb中赋值为20,可到了fortran中变为一个很大且随机的数,
  fortran的dll声明代码:
      SUBROUTINE ELEMCA (KK,IH,R01,R02,Z1,Z2,PHY1,PHY2,NELEMS,IA,NH,NNODES,NSIZE,E1,E2,FNU1,FNU2,G,THICK,RHOS,AR,ASS,PHP,SINE,COSINE,CHECK,PHPP,ARCL,SS)
      !DEC$ ATTRIBUTES DLLEXPORT ::ELEMCA
      !DEC$ ATTRIBUTES ALIAS : "ELEMCA" :: ELEMCA
      !DEC$ ATTRIBUTES VALUE ::KK,IH,NELEMS,IA,NH,NNODES,NSIZE
      !DEC$ ATTRIBUTES REFERENCE ::R01,R02,Z1,Z2,PHY1,PHY2,E1,E2,FNU1,FNU2,G,THICK,RHOS,AR,ASS,PHP,SINE,COSINE,CHECK,SS,PHPP,ARCL
      REAL R01(50),R02(50),Z1(50),Z2(50),PHY1(50),PHY2(50),E1(50),E2(50),FNU1(50),FNU2(50),G(50),THICK(50),RHOS(50),AR(29),ASS(29),PHP(29),SINE(29),COSINE(29),CHECK(8,8),SS(50)
      REAL PHPP,ARCL,PHPRIM
      REAL PH(29), AM(8,8), PHIMAT(8,8)
      INTEGER K,IH,NETP,NETL,NET1,I,J,KK,NET,NELEMS
下面是vb的声明代码:
Private Declare Sub ELEMCA Lib "ELEMCA.dll" (ByVal KK As Integer, ByVal IH As Integer, ByRef R01 As Single, ByRef R02 As Single, ByRef Z1 As Single, ByRef Z2 As Single, ByRef PHY1 As Single, ByRef PHY2 As Single, ByVal NELEMS As Integer, ByVal IA As Integer, ByVal NH As Integer, ByVal NNODES As Integer, ByVal NSIZE As Integer, ByRef E1 As Single, ByRef E2 As Single, ByRef FNU1 As Single, ByRef FNU2 As Single, ByRef G As Single, ByRef THICK As Single, ByRef RHOS As Single, ByRef AR As Single, ByRef ASS As Single, ByRef PHP As Single, ByRef SINE As Single, ByRef COSINE As Single, ByRef CHECK As Single, ByRef PHPP As Single, ByRef ARCL As Single, ByRef SS As Single)
调用代码:
    Call ELEMCA(KK, IH, R01(1), R02(1), Z1(1), Z2(1), PHY1(1), PHY2(1), NELEMS, IA, NH, NNODES, NSIZE, E1(1), E2(1), FNU1(1), FNU2(1), G(1), THICK(1), RHOS(1), AR(1), ASS(1), PHP(1), SINE(1), COSINE(1), CHECK(1, 1), PHPP, ARCL, SS(1))
求高手们帮忙解答.

解决方案 »

  1.   

    不要做A语言代码修改为B语言代码的无用功。
    也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
    只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
    即可很方便地让A、B两种语言之间协调工作。
    比如:
    A将请求数据写到文件a.txt,写完后改名为aa.txt
    B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
    A发现bb.txt存在时,读取其内容,读完后删除bb.txt
    以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
    除非A或B不支持判断文件是否存在、文件读写和文件更名。
    但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
    ·进程之间松耦合
    ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
    ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
    ·方便在线开关服务,只需删除或创建该临时文本文件即可。
    ·方便实现分布式和负载均衡。
    ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
    ·……“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
    回头是“使用共享纯文本文件进行信息交流”的岸!
      

  2.   

    A)FORTRAN 函数需要声明位 STDCALL
    B)注意数据类型长度,INTEGER 是2字节还是4字节?4字节VB要用Long。REAL 也是,VB中有Sing、Double。