Calling FORTRAN dll a partir de C # e atribuir valores a matriz de estruturas
Posso passar umC#
estrutura emFORTRAN
bem. Eu posso até passar uma matriz de umC#
struct como uma matriz deTYPE()
emFORTRAN
. O problema é quando tentei retornar valores paraC#
. Aqui está um exemplo
DLL fortran é:
MODULE TESTING
TYPE VALUEREF
INTEGER*4 :: A
ENDTYPE VALUEREF
CONTAINS
SUBROUTINE TEST_REF(T,N)
!DEC$ ATTRIBUTES DLLEXPORT :: TEST_REF
!DEC$ ATTRIBUTES ALIAS:'TEST_REF' :: TEST_REF
!DEC$ ATTRIBUTES VALUE :: N
IMPLICIT NONE
INTEGER*4 :: A,I,N
TYPE(VALUEREF) :: T(N)
A = 100
DO I=1,N
T(I)%A = A + I
END DO
END SUBROUTINE
END MODULE
e aC#
função de chamada que espera resultados é:
[StructLayout(LayoutKind.Sequential)]
public struct ValueRef
{
public int a;
}
[DllImport("mathlib.dll")]
static extern void TEST_REF(ValueRef[] t, int n);
void Main()
{
ValueRef[] T = new ValueRef[4];
for (int i = 0; i < T.Length; i++)
{
T[i].a = i;
}
Console.WriteLine("Initialize");
for (int i = 0; i < T.Length; i++)
{
Console.WriteLine(" A={0}", T[i].a);
}
Console.WriteLine("Call Fortran");
TEST_REF(T, T.Length);
for (int i = 0; i < T.Length; i++)
{
Console.WriteLine(" A={0}", T[i].a);
}
}
Com resultados:
Initialize
A=0
A=1
A=2
A=3
Call Fortran
A=0
A=1
A=2
A=3
Depurando o código FORTRAN, vejo os valores iniciais passarem deC#
paraFORTRAN
bem. Os valores são substituídos por novos valores e o controle é passado de volta paraC#
onde os valores antigos ainda estão contidos noValueRef
instâncias.
Por que posso passar e retornar uma matriz defloat
ouint
de maneira semelhante, tudo bem. e posso passar e retornar estruturas singulares comref
keyword, e eu posso passar, masnã retorno e matriz destruct
?
PS. Estou usando o Compaq Visual Fortran 6.5 e .NET 3.5
PS2. Agradeço quaisquer comentários / idéias sobre isso. Estou 95% concluído com o meu projeto e agora encontro esse problema. O objetivo deste projeto é usar estruturas, tanto quanto possível, para reduzir os #of argumentos passados às funções e manter certos aspectos do design do OO