C# 从fortran77 dll向c返回实值#

C# 从fortran77 dll向c返回实值#,c#,dll,return-value,fortran77,C#,Dll,Return Value,Fortran77,有人能指出我做错了什么吗 FORTRAN 77 dll代码 *$pragma aux DON "DON" export parm(value*8,value*8) SUBROUTINE DON(DAA,DBB,DCC) REAL*8, DAA,DBB,DCC DBB=DAA+1 DCC=DBB+1 RETURN END using System; using System.Collections.Generic;

有人能指出我做错了什么吗

FORTRAN 77 dll代码

*$pragma aux DON "DON" export parm(value*8,value*8)


      SUBROUTINE DON(DAA,DBB,DCC)
      REAL*8, DAA,DBB,DCC
      DBB=DAA+1
      DCC=DBB+1 
      RETURN
      END
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices;

using System.Diagnostics;

namespace pDON
{
    class Program
    {

        [DllImport("DON.dll",
            CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall)]
        public static extern void DON(
            [MarshalAs(UnmanagedType.R8)] double DAA,
             [MarshalAs(UnmanagedType.R8)] double DBB,
            [MarshalAs(UnmanagedType.R8)] double DCC
            );

        static void Main(string[] args)
        {
            //double TIME = 100.0;
            double DAA = 5.5;
            double DBB = 7;
            double DCC = 9;
            //START( ENERIN, VAL1);
            DON(DAA, DBB, DCC);

            Console.Write("val1 = " + DBB);
            Console.Write("val2 = " + DCC);
            Debug.WriteLine("VAR = " + DBB.ToString());
            Console.Write("Press any key to exit");
            Console.ReadKey(false);
        }

    }
}

C#代码

*$pragma aux DON "DON" export parm(value*8,value*8)


      SUBROUTINE DON(DAA,DBB,DCC)
      REAL*8, DAA,DBB,DCC
      DBB=DAA+1
      DCC=DBB+1 
      RETURN
      END
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices;

using System.Diagnostics;

namespace pDON
{
    class Program
    {

        [DllImport("DON.dll",
            CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall)]
        public static extern void DON(
            [MarshalAs(UnmanagedType.R8)] double DAA,
             [MarshalAs(UnmanagedType.R8)] double DBB,
            [MarshalAs(UnmanagedType.R8)] double DCC
            );

        static void Main(string[] args)
        {
            //double TIME = 100.0;
            double DAA = 5.5;
            double DBB = 7;
            double DCC = 9;
            //START( ENERIN, VAL1);
            DON(DAA, DBB, DCC);

            Console.Write("val1 = " + DBB);
            Console.Write("val2 = " + DCC);
            Debug.WriteLine("VAR = " + DBB.ToString());
            Console.Write("Press any key to exit");
            Console.ReadKey(false);
        }

    }
}
我想在通过FORTRAN 77子程序处理DBB DCC的值之后,将其返回到C#main prog

注意:我不能使用INTENT(out),因为我使用的是fortran 77。
非常感谢。

好的,您正在使用值参数调用Fortran函数。您应该使用引用参数(指针)从中获取值

或者,您可以从包含两个值的fortran代码返回一个structure。您必须在C#中将其封送到相应的类型,并从中读取结果


但我担心我对fortran一无所知,甚至连我的一条建议都不管用。

谢谢大家的建议

输入参数应按值传递,输出参数应按引用传递 所以我把我的辅助语改成了 “*$pragma aux DON”DON“导出参数(值*8,引用,引用)” 现在它正在工作


再次感谢

所以。。错误消息是什么?没有错误消息。。。值保持不变DBB=7 DCC=9预期值为DBB=6.5 DCC=7.5感谢deceze编辑我的帖子我尝试了输出参数的引用类型..但结果相同。