Fortran - dll Fortran en Excel, devuelve resultado erróneo (redondea a 1.00000000)

 
Vista:
sin imagen de perfil

dll Fortran en Excel, devuelve resultado erróneo (redondea a 1.00000000)

Publicado por Miguel (1 intervención) el 11/09/2016 05:16:32
Saludos a todos.

Primero agradezco de forma anticipada cualquier comentario o sugerencia, seran de mucha ayuda.

Tengo un problema, del que no puedo detectar su origen. Como dice el título, se trata de una dll fortran que conecto a Excel 2016, mediante VBA 7.1. La dll tiene varias funciones el problema está en una de ellas que por razones que no logro comprender me devuelve un valor redondeado REAL. El código fortran de esta función es el siguiente:

1
2
3
4
5
6
7
8
9
10
FUNCTION AntYComp(a, b, c, x, penv, temp)
    IMPLICIT NONE
    !GCC$ ATTRIBUTES DLLEXPORT, STDCALL :: AntYComp
    REAL*8, INTENT(IN) :: a, b, c, x, temp, penv
    REAL*8 :: pv,  AntYComp
 
    pv = (10 ** (a-(b/(c + temp))))
    AntYComp = pv * (x/penv)
    RETURN
END FUNCTION

El código de VBA, es el siguiente:

1
2
Declare Function AntYComp Lib "G:\Proyectos\Excel\VLE\LibraryFortran\vlelibrary\bin\Debug\vlelibrary.dll" _
Alias "antycomp_@24" (a As Double, b As Double, c As Double, x As Double, penv As Double, temp As Double) As Double

La función debe devolver valores entre: 0. y 1. del tipo REAL*8, compatible con el tipo Duoble de VBA. Pero me redondea todo al valor 1.0000000, como se puede ver en la imagen:

pantalla

Subrayado en rojo se encuentra los valores devueltos por la función. Probé los resultados de cada operación, por ejemplo: "pv = (10 ** (a-(b/(c + temp))))" [1] y devolví ese valor como respuesta, y esos datos son los valores junto a la columna subrayada. El problema surge al multiplicar por: "(x/penv)", en ese punto el valor se vuelve 1.00000000. También intente usando una función que calcula solo [1]; y luego usaba valores de las celdas de Excel para completar la ecuación, y obtengo el mismo resultado. Probé si había problemas con aritmética combinada (REAL-INTEGER), use funciones de conversión, cambie la declaración de VBA, use una interface con otra función de la misma librería que calcula [1], pero obtengo el mismo resultado.

Pregunte por otros foros y me suguieren que use Subrutinas, en lugar de funciones, pero como esta operación solo devuelve un único valor mantengo mi decisión de usar una función en lugar de una subrutina.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder