PDA

View Full Version : [Fortran] Usare Dll


knulp77
03-07-2008, 15:16
Ciao a tutti, sono nuovo del forum.

Ho questo problema, ho creato una dll in Fortran e vorrei richiamarla ma ottengo sempre un errore: "Access Violation"

Sorgente della Dll:

Real Function Somma (A ,B, Res)

!DEC$ATTRIBUTES STDCALL:: Somma
!DEC$ATTRIBUTES DLLEXPORT:: Somma
!DEC$ATTRIBUTES ALIAS: 'Somma':: Somma
!DEC$ATTRIBUTES REFERENCE:: A ,B, Res

Real*8 A ,B, Res
Real Errore

IF ((A>=0) .AND. (B>=0)) THEN
! Qui è tutto ok
Errore = 0
Res = A + B

ELSE
! Qui c'è un errore
IF ((A<0) .AND. (B<0)) THEN
Errore = 1.
ELSEIF (A<0) THEN
Errore = 2.
ELSE
Errore = 3.
END IF

END IF

! Qui la funzione comunica se ha trovato
! qualche errore
Somma = Errore
End Function


Sorgente del programma che dovrebbe richiamare la dll

Program UsaSomma

Interface
Real Function Somma(x,y,z)
!DEC$ ATTRIBUTES DLLIMPORT :: Somma
!DEC$ ATTRIBUTES STDCALL :: Somma
!DEC$ ATTRIBUTES ALIAS: "Somma" :: Somma
Real*8 x
Real*8 y
Real*8 z
End Function Somma
End Interface

Real*8 a,b,c
Real errore2

a=5.3
b=3.4
c=0.0
errore2 = Somma(a,b,c)

print *,'Risultato:', c
print *, 'Codice Errore:', errore2
read (*,*)

End

All'interno del workspace ho caricato il file .lib creato insieme alla dll e la dll l'ho copiata nella cartella del progetto.
Nel debug ho visto che quando dall'eseguibile passa alla dll i valori degli argomenti nella dll
(A,B,Res) sono tutti: "Undefined address" (non posso neppure cambiare il valore della variabile all'interno del debug)
Il compilatore è Visual Fortran 6.0.0

Se qualcuno ha qualche suggerimento è il benvenuto! Sono sicuro che mi manca un pezzetto indispensabile...

tiMo
21-07-2008, 16:23
ho provato i tuoi codici con il gfortran senza problemi

# Compilo la dll
gfortran prova.f90 -shared -oprova.dll
# Compilo il main
gfortran main.f90 prova.dll -omain.exe

>main.exe
Risultato: 8.7000002861022949
Codice Errore: 0.0000000

Secondo me stai facendo confusione con le istruzioni per esportare i nomi sotto il CVF, ti consiglio di compilare da riga di comando usando il comando DF. Oltretutto secondo me non ti servono tutte quelle direttive per il compilatore. Non ho il CVF su questa macchina per cui non posso provare. In ogni caso ti consiglio di passare al gfortran che è gratis. Il CVF 6.0 è oramai obsoleto e pieno di bachi, se poi hai dei soldini da spendere puoi aggiornarti e prendere il compilatore Intel.

ciao
tiMo