gpt4 book ai didi

c# - 从 C# 调用 FORTRAN 子例程

转载 作者:太空狗 更新时间:2023-10-29 23:22:50 25 4
gpt4 key购买 nike

我想将 FORTRAN DLL 导入 Visual C#。虽然我已经用函数做到了这一点,但当我想导入一个具有多个输出的子例程时,问题就出现了。这是一个简单的例子:


FORTRAN 动态链接库:

Subroutine MySub(a,b,x,y)

!DEC$ ATTRIBUTES DLLEXPORT, STDCALL, ALIAS:'MySub' :: MySub

Implicit None
Integer, INTENT(IN) :: a,b
Integer, INTENT(OUT) :: x,y

y=a+b
x=2*a+3*b
End Subroutine MySub

C# 控制台应用:

using System;
using System.Runtime.InteropServices;

namespace AlReTest
{
class Program
{
[DllImport(@"D:\...\AltRetTest.dll", CallingConvention=CallingConvention.StdCall)]
public static extern int MySub(int a, int b, [Out] int x, [Out] int y);
static void Main(string[] args)
{
int a = 4;
int b = 3;
int x = 0;
int y = 0;
MySub(a, b, x, y);

Console.WriteLine(x);
Console.WriteLine(y);
Console.WriteLine(MySub(a, b, x, y));
}
}
}

以下是我得到的答案:x=0, y=0, MySub(a, b, x, y)=17

我对 Visual C# 编程有点陌生,但我认为上面的结果意味着已经计算了两个语句,即 'a+b' 和 '2*a+3*b' 但没有分配给 x 和 y ,而后者 (2*a+3*b) 已分配给函数 MySub 本身!我在 C# 中使用了 OutAttributes,也在 FORTRAN 中使用了 Intent[In]、Intent[Out],但都没有改变结果。如果有任何帮助或建议,我将不胜感激。

最佳答案

和您一样,我假设 INTENT(OUT) 将暗示通过引用传递。但似乎并非如此。因此,您需要将以下内容添加到 FORTRAN 以强制通过引用传递:

!DEC$ ATTRIBUTES REFERENCE :: x,y

函数在C#端的正确声明是:

[DllImport(...)]
public static extern void MySub(int a, int b, out int x, out int y);

这样调用它:

MySub(a, b, out x, out y)

请注意,您需要使用 out 关键字,以便将指向输出变量的指针传递给 native 代码。您确实需要使用 outref 来确保调用代码看到修改后的值。

另请注意, native 函数不返回值。返回值通过一个寄存器传递只是巧合,该寄存器恰好包含上次执行的计算结果。

关于c# - 从 C# 调用 FORTRAN 子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23167288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com