我的任务是将遗留软件移植到托管语言。
一些硬编码的计算模型非常耗时,无需从完整端口获得功能或性能方面的任何内容。
我们决定改为使用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( ¶m1, ¶m2, ¶m3, &returnCode);
return (ReturnCodes)returnCode;
}
}
我们在实际的代码中试图绑定第1-3段来避免问题,但显然我们还不够好,因为我们最近在一个新的测试用例中看到了这种类型的错误:
英特尔(r)Visual Fortran运行时错误
forrtl:severe(408):fort:(3):数组的下标#1 ....
这是由于fortran代码中的一些计算决定了数组索引。但是计算出的索引超出了数组的范围。
问题是错误来自错误对话,并且不会引发异常。我们已经尝试过这个:
int returnCode = -1;
try{
SUBROUTINENAME( ¶m1, ¶m2, ¶m3, &returnCode);
}
catch(...)
{
throw gcnew System::Exception("fortran runtime error??");
}
return (ReturnCodes)returnCode;
并发现它没有捕获任何东西..
新应用程序旨在作为基于服务器的服务,因此我需要以某种方式捕获此错误,并记录它,理想情况下继续服务,并丢弃导致失败的作业。
有谁知道如何实现这一目标?
我不想编辑fortran代码,并重新编译它,因为我是那种语言的新手。