从托管代码处理英特尔Fortran运行时错误

时间:2017-08-10 13:58:00

标签: c#-4.0 c++-cli intel-fortran

我的任务是将遗留软件移植到托管语言。

一些硬编码的计算模型非常耗时,无需从完整端口获得功能或性能方面的任何内容。

我们决定改为使用C ++ / CLI包装器。

即。像这样的东西:

FortranLib.h:

#pragma comment(lib, "fortranlibrary.lib")

extern "C" {
    void SUBROUTINENAME(int * param1, int * param2, float * param3, int * returnCode);
}

using namespace System;

namespace FortranlibraryWrapper {
    public ref class FortranLib{
        public:
            enum class ReturnCodes : int{
               ok = 0,
               //... and so on and so forth
            }

            ReturnCodes SubRoutineName(int param1, int param2, float param3);
    }
}

FortranLib.cpp:

#include "stdafx.h"
#include "FortranLib.h"
namespace FortranlibraryWrapper {

    FortranLib::CalculationReturnCodes FortranLib::SubRoutineName(int param1, int param2, float param3)
    {
         int returnCode = -1;
         SUBROUTINENAME( &param1, &param2, &param3, &returnCode);
         return (ReturnCodes)returnCode;
    }
}

我们在实际的代码中试图绑定第1-3段来避免问题,但显然我们还不够好,因为我们最近在一个新的测试用例中看到了这种类型的错误:

  

英特尔(r)Visual Fortran运行时错误

     

forrtl:severe(408):fort:(3):数组的下标#1 ....

这是由于fortran代码中的一些计算决定了数组索引。但是计算出的索引超出了数组的范围。

问题是错误来自错误对话,并且不会引发异常。我们已经尝试过这个:

         int returnCode = -1;
         try{
             SUBROUTINENAME( &param1, &param2, &param3, &returnCode);
         }
         catch(...)
         {
             throw gcnew System::Exception("fortran runtime error??");
         }
         return (ReturnCodes)returnCode;

并发现它没有捕获任何东西..

新应用程序旨在作为基于服务器的服务,因此我需要以某种方式捕获此错误,并记录它,理想情况下继续服务,并丢弃导致失败的作业。

有谁知道如何实现这一目标?

我不想编辑fortran代码,并重新编译它,因为我是那种语言的新手。

0 个答案:

没有答案