回 帖 发 新 帖 刷新版面

主题:新人求助:Fortran与C#之间的调用

各位好,我是个Fortran新人,在维护一个Fortran的计算程序,老板让做个界面并选了C#来实现
于是当我在用C#调用Fortran dll时,把C#的int传进去,报溢出异常,我想把输入值print出来,却发现每次print的int还会变,我不知道问题出在哪了,大家谁能帮忙分析一下啊,鄙人在此多谢了
C#代码如下:
        [DllImport(@"TestF.dll",
            SetLastError = true, CharSet = CharSet.Ansi,

            CallingConvention = CallingConvention.StdCall)]
        public static extern void Cpm(ref int Ndir, ref char[] dirIn);

            int iResult = 0;
            string notes = "";
            int iLen = 0;
            string path = "D:\\input\\";

            char[] cPath = path.ToCharArray();
            try
            {
                iLen = cPath.Length;
                CutPre(ref iLen, ref cPath);
                iResult = 1;
                notes = "Successful!";
            }
            ……//以下略去

以下是Fortran部分代码

Subroutine Cpm(Ndir,dirIn)
!DEC$ ATTRIBUTES DLLEXPORT,STDCALL,ALIAS:'_Cpm@8' :: Cpm
!DEC$ ATTRIBUTES VALUE:: Ndir
!DEC$ ATTRIBUTES REFERENCE:: dirIn
  Use ModUnit
  Use ModGlobal,only : Rd1,Vd1,Td1,TT0sjs,A2R,R2A,pi,DefUnit,Nforce
  Use ModTime
  Use ModInput 
  Use ModData,only : DefTN,WData,DataRelease,DataSun,DefPV2
  Use ModPerturbation,only : SatParamt,DefParamt
  implicit none
    INTEGER(4) :: Ndir
    CHARACTER(Ndir) :: dirIn 
        Print *,"Input Success! Your input are :"
        Print *,Ndir
        Print *,dirIn

回复列表 (共3个回复)

沙发

下面这句:
public static extern void Cpm(ref int Ndir, ref char[] dirIn);
而在FORTRAN代码里明明那个ndir是byvalue的。。。

板凳


多谢二楼的,我把代码里的ref去掉了,现在开始报错了,说是“尝试读取或者写入受保护的内存,这通常指示其他内存已损坏”
诡异的是我运行了两次程序,dll Print 出来的Ndir的数值都不一样(我传入的都是一样的),我传入的是9,出来的却是8xxxxxxx,的整数

3 楼

我把程序回滚到了最初的版本,发现如二楼所说的,运行成功了,非常感谢!!!俺给分结贴了

我来回复

您尚未登录,请登录后再回复。点此登录或注册