Suppose I have the following Fortran code
subroutine COMPLEX_PASSING(r, i, c)
!DEC$ ATTRIBUTES DLLEXPORT::COMPLEX_PASSING
REAL*8 :: r, i
COMPLEX*8 :: c
c = cmplx((r * 2), (i * 2))
return
end
Fortran code was compiled with
gfortran -c complex_passing.f90
gfortran -fPIC -shared -o complex_passing.dll complex_passing.o
How would I call this subroutine in C#? I have tried the following code:
using System;
using System.Runtime.InteropServices;
namespace FortranCalling {
class Program {
static void main(string[] args) {
double real = 4;
double imaginary = 10;
COMPLEX c = new COMPLEX();
complex_passing( ref real, ref imaginary, ref c);
Console.WriteLine("Real: {0}\nImaginary: {1}", c.real, c.imaginary);
Console.ReadLine();
}
[StructLayout(LayoutKind.Sequential)]
struct COMPLEX {
public double real;
public double imaginary;
}
[DllImport("complex_passing.dll", EntryPoint = "complex_passing_", CallingConvention = CallingConvention.Cdecl)]
static extern void complex_passing(ref double r, ref double i, ref COMPLEX c);
}
}
With little success - my COMPLEX struct seems to be returning garbage data:
Real: 134217760.5
Imaginary: 0
When I would expect the real part to be 8 and the imaginary part to be 20.