2

有人可以指出我在这里做错了什么吗?

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

C# 代码

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);
        }

    }
}

我想将 DBB DCC 的值返回到 C# main prog ..通过 FORTRAN 77 子例程处理它们之后。

PS:我不能像使用 fortran 77 一样使用 INTENT(out)。在此先感谢。

4

2 回答 2

1

谢谢大家的建议

输入参数应按值传递,输出参数...按参考传递,因此我将辅助 pragma 更改为 ""*$pragma aux DON "DON" export parm(value*8, reference, reference)"" 并且它现在正在工作

再次感谢

于 2009-09-02T07:53:53.980 回答
0

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

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

但我担心我对 fortran 没有任何想法,即使我的一个建议也能奏效。

于 2009-09-02T06:16:41.010 回答