Showing results for 
Search instead for 
Did you mean: 

Passing array of structures from c# to Intel Fortran

I made an example with thfollowing struct in Fortran:

   type :: interop_struct_num


        real*8 :: values(10)
        integer :: id

    end type
    type :: interop_struct_vet
        type(interop_struct_num) :: items(3)
    end type


The function declaration in Fortran has the following look:

    function pass_structure_c_Array(NumData, dataArray, TextVet) result(sum)
        !DEC$ ATTRIBUTES DLLEXPORT, ALIAS: 'pass_structure_c_Array'::pass_structure_c_Array

        integer, intent(in) :: NumData
        type(interop_struct_vet), intent(in) :: dataArray
        character(len=16), intent(inout) :: TextVet(NumData)

end function

On the c# side the structure is the following:

    [StructLayout(LayoutKind.Sequential, Pack = 8)] 
    public struct FortranInteropStructOnlyNum

        /// <summary>
        /// Fixed length array holding double values.
        /// </summary>
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
        public double[] Values;

        public Int32 Id;

   [StructLayout(LayoutKind.Sequential, Pack = 8)] 
   public struct ForStructVect
       [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
       public FortranInteropStructOnlyNum[] Items;

 Whereas the function declaration is the following one:

        [DllImport("Interop.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "pass_structure_c_Array", CharSet = CharSet.Ansi)]
        public static extern double PassStructArray(ref Int32 NumV, ref ForStructVect dataV, StringBuilder SV);

I compile the dll fortran and the c# calling executable perfectly, but when I run the program I can see that the elements belonging to the array dataV.Items[i] with i>1 are partially corrupted.

I don't understand the reason of this behaviour and I thank you in advance for any help you will can give me.


0 Replies