• delphi, vba & dll

    From Renato Zambon@1:2320/100 to All on Sat Apr 3 15:55:08 2004
    Oi,

    Tenho um problema encalhado aqui: uma DLL, feita em Fortran (Compaq
    Visual Fortran), e que era chamada originalmente dentro do Excel com
    VBA, e estou mudando o sistema do Excel para o Delphi 7.

    Para alguns dados, j  roda igual nos dois, mas para outros, d  o
    seguinte erro:

    ---------------------------
    Debugger Exception Notification
    ---------------------------
    Project SisOpt.exe raised exception class EInvalidOp with message
    'Invalid floating point operation'. Process stopped. Use Step or Run
    to continue.
    ---------------------------

    Esse erro ocorre durante a execu‡Æo da DLL, ela roda uma parte (faz
    alguns c lculos, gera arquivos, chama um outro prg externo para
    processar eles, ele roda e completa normal, mas depois disso a DLL
    aborta com o erro) S¢ ocorre quando chamado pelo Delphi, no Excel/
    VBA roda ok at‚ o fim.

    J  tentei mapear os valores de todas as +200mil vari veis passadas
    para a dll achando que algum estivesse trocado mas todos sÆo iguais.

    Inclusive um outro erro que dava no inicio foi corrigido, array[i,j]
    tem a aloca‡Æo invertida na mem¢ria (do Delphi em rela‡Æo ao VBA ou
    Fortran) e precisou indicar como array[j,i].

    Algu‚m tem id‚ia do que pode causar esse erro e como corrigir?

    Abaixo estÆo as declara‡äes da rotina, tipos e chamada no VBA e no
    Delphi:

    -----------------------------------8<-----------------------------------
    Option Explicit

    Declare Sub SISOPT Lib "c:\SISOPT\SisOpt8.DLL" _
    (iModel As Long, iLP As Long, Iy1 As Long, iM1 As Long, m As Long, n
    As Long, _
    Ny As Long, Nnd As Long, _
    Ndns As Long, Nname As Long, PT As Double, _
    R1max As Double, TC As Double, FC As Double, Smin As Double, R1min
    As Double, _
    Smax As Double, cst As Double, Xini As Double, dm As Double, Y As
    Double, _
    Sum As Double, SSum As Double, PSP As Double, FPRT As Double, _
    PRT As Double, SV As Double, _
    Wt1 As Double, Wt2 As Double, Wt3 As Double, Wt4 As Double, Wt5 As
    Double, Wt6 As Double, _
    iFun As Long, Tg As Double, TotS As Double, ierr As Long, Fobj As
    Double, _
    iEnding As Long, Xend As Double, _
    delta As Double, nite As Long, epsSLP As Double, epsILP As Double,
    RUNTIME As Double, _
    EN2 As Double, EC As Double, PRICE As Double, IRIVER As Long,
    SRIVER As Double, _
    EVP As Double, EV_LP As Double, AC As Double)

    Sub RunEmn()
    ' (...)

    Dim i As Long, j As Integer, k As Integer, l As Integer, _
    R As Integer, CC As Integer, Nmonth As Integer, kk As Integer, _
    iModel As Long, iLP As Long
    Dim Var1 As Variant, Var2 As Variant
    Dim Iy1 As Long, m As Long, n As Long, Ny As Long, Nnd As Long
    Dim iM1 As Long, NStep As Long
    Dim Infeas As Long
    Dim Ndns(1 To 150) As Long
    Dim Nname(1 To 150) As Long
    Dim PT(1 To 4, 1 To 150) As Double
    Dim Fd(1 To 2, 1 To 150) As Double
    Dim R1max(1 To 150) As Double
    Dim TC(1 To 150) As Double
    Dim FC(1 To 150, 1 To 12) As Double
    Dim Smin(1 To 150) As Double
    Dim R1min(1 To 150) As Double
    Dim cst(1 To 2, 1 To 150) As Double
    Dim Xini(1 To 150) As Double
    Dim Smax(1 To 150) As Double
    Dim dm(1 To 20, 1 To 12) As Double
    Dim fEnergy As Double
    Dim Y(1 To 120000) As Double
    Dim Sum(1 To 240) As Double
    Dim SSum(1 To 150, 1 To 240) As Double
    Dim ierr As Long, iTail As Long
    Dim T As Double, T1 As Double, T2 As Double
    Dim iFun As Long, Tg(1 To 150, 1 To 12) As Double, TotS(1 To 20, 1 To
    12) As Double
    Dim anote(1 To 100) As String, A As String
    Dim PSP(1 To 150) As Double, Hdel(1 To 150) As Double, _
    FPRT(1 To 4, 1 To 5, 1 To 150) As Double, PRT(1 To 150, 1 To 20, 1
    To 12) As Double
    Dim iSV As Long, SV(1 To 150) As Double, Fobj As Double, SS As Double
    Dim Wt1 As Double, Wt2 As Double, Wt3 As Double, Wt4 As Double, Wt5 As Double, Wt6 As Double
    Dim varBefore As Date, varAfter As Date, varTimeDiff As Date
    Dim iEnding As Long, iSystem As Integer, iSys As Integer, Xend(1 To
    150) As Double
    Dim delta As Double, nite As Long, epsSLP As Double, epsILP As Double, RUNTIME As Double
    Dim EN2 As Double, EC As Double, PRICE(1 To 12) As Double, IRIVER As
    Long, SRIVER As Double
    Dim EVP(1 To 150, 1 To 12) As Double, AC(1 To 150, 1 To 12) As Double
    Dim nTC(1 To 150) As Integer, EV_LP(1 To 150) As Double
    Dim USI As String * 3
    Const ForReading = 1, ForWriting = 2
    Dim fso, f
    (...)
    Call SISOPT _
    (iModel, iLP, Iy1, iM1, m, n, Ny, Nnd, Ndns(1), Nname(1), PT(1, 1), _
    R1max(1), TC(1), FC(1, 1), Smin(1), R1min(1), _
    Smax(1), cst(1, 1), Xini(1), dm(1, 1), Y(1), _
    Sum(1), SSum(1, 1), PSP(1), FPRT(1, 1, 1), PRT(1, 1, 1), _
    SV(1), _
    Wt1, Wt2, Wt3, Wt4, Wt5, Wt6, _
    iFun, Tg(1, 1), TotS(1, 1), ierr, Fobj, iEnding, Xend(1), _
    delta, nite, epsSLP, epsILP, RUNTIME, _
    EN2, EC, PRICE(1), IRIVER, SRIVER, EVP(1, 1), EV_LP(1), AC(1, 1)) -----------------------------------8<-----------------------------------
    type vl150=array[1..150] of longint;
    vd150x4=array[1..150, 1..4] of double;
    vd150x2=array[1..150, 1..2] of double;
    vd150=array[1..150] of double;
    vd150x12=array[1..150, 1..12] of double;
    vd12x150=array[1..12, 1..150] of double;
    vd12x20=array[1..12, 1..20] of double;
    vd120k=array[1..120000] of double;
    vd240=array[1..240] of double;
    vd240x150=array[1..240, 1..150] of double;
    vd150x5x4=array[1..150, 1..5, 1..4] of double;
    vd12x20x150=array[1..12, 1..20, 1..150] of double;
    vd12=array[1..12] of double;

    procedure SISOPT(var iModel, iLP, Iy1, iM1, m, n, Ny, Nnd: longint; var
    Ndns, Nname: vl150; var PT: vd150x4; var R1max, TC: vd150; var FC:
    vd12x150; var Smin, R1min, Smax: vd150; var cst: vd150x2; var Xini:
    vd150; var dm: vd12x20; var Y: vd120k; var Sum: vd240; var SSum:
    vd240x150; var PSP: vd150; var FPRT: vd150x5x4; var PRT: vd12x20x150;
    var SV: vd150; var Wt1, Wt2, Wt3, Wt4, Wt5, Wt6: double; var iFun:
    longint; var Tg: vd12x150; var TotS: vd12x20; var ierr: longint; var
    Fobj: double; var iEnding: longint; var Xend: vd150; var delta: double;
    var nite: longint; var epsSLP, epsILP, RUNTIME, EN2, EC: double; var
    PRICE: vd12; var IRIVER: longint; var SRIVER: double; var EVP: vd12x150;
    var EV_LP: vd150; var AC: vd12x150); stdcall; external 'sisopt8.dll';

    (...)

    SISOPT(iModel, iLP, Iy1, iM1, m, n, Ny, Nnd, Ndns, Nname, PT, R1max, TC,
    FC, Smin, R1min, Smax, cst, Xini, dm, Y, Sum, SSum, PSP, FPRT, PRT, SV,
    Wt1, Wt2, Wt3, Wt4, Wt5, Wt6, iFun, Tg, TotS, ierr, Fobj, iEnding, Xend,
    delta, nite, epsSLP, epsILP, RUNTIME, EN2, EC, PRICE, IRIVER, SRIVER,
    EVP, EV_LP, AC); -----------------------------------8<-----------------------------------

    []s
    ---
    þ QMPro 1.51 þ If u cn rd ths, u cn gt a gd jb on cmptr prgrmmng.

    ---
    # Origin: telnet hidrasoft.dyndns.org 55-11-4654-2024 SP,Brasil (4:801/161)
    * Origin: LiveWire BBS - Synchronet - LiveWireBBS.com (1:2320/100)