Мне интересно, почему код, который я использую с скомпилированной библиотекой Matlab, выдается из строя, когда не выбрано время выполнения общего языка. Для минимального примера я попытался скомпилировать следующую функцию Matlab в общую библиотеку:
function [volOut, volAvg]=testVarPass(volIn)
volOut=double(volIn);
volAvg=mean(volOut(:));
end
используя следующий вызов mcc: mcc -B csharedlib: mylib testVarPass.m
Затем я создал проект консоли Visual Studio 2010.
#include "stdafx.h"
#include "matrix.h"
#include "mylib.h"
int _tmain(int argc, _TCHAR* argv[])
{
mxArray *vol_in;
mxArray *vol_out;
mxArray *vol_avg;
mwSize dim_list[3];
double *vol_avg_ptr;
dim_list[0]=10;
dim_list[1]=10;
dim_list[2]=10;
if( !mclInitializeApplication(NULL,0) ) { //initialize Matlab Compiler Runtime
return -1;
}
if (!mylibInitialize()) //initialize library
{
return -2;
}
vol_in=mxCreateNumericArray(3,dim_list, mxINT16_CLASS, mxREAL); //make a sample 3d array
mlfTestVarPass(2, &vol_out, &vol_avg, vol_in); //crashes here
vol_avg_ptr=mxGetPr(vol_avg);
/* Call the MCR and library termination functions */
mylibTerminate();
mclTerminateApplication();
return 0;
}
Если я создам проект с поддержкой Common Language Runtime Support для: /clr...everything работает отлично. Если я создам проект с поддержкой Common Language Runtime Support, установите: ничего... во-первых, отладчик вырывает множество исключений, когда вызывается mylibInitialize. Наиболее распространенными являются: varflowFailed, tffFailed, CryptoPP, jitCgFailed и xsd_binder :: MalformedDocumentError. Во-вторых, вызов mlfTestVarPass падает с нарушением доступа.
Я и программист, с которым я работаю, задаются вопросом, почему.
Дополнительная информация: Windows 7 Visual Studio 2010, SP1 Windows SDK 7.1 Matlab 2013b
Программист, с которым я работаю, понял это...
Когда выбрано /clr, неинициализированные указатели имеют значение NULL. Когда /clr не выбрано, неинициализированные указатели устанавливаются на произвольное значение отладчиком. Затем, когда вызывается mlfTestVarPass, управление памятью Matlab видит произвольный mxArray и пытается освободить нераспределенную память.
Это объясняет крах, однако мы все еще не понимаем, почему существует так много исключений из первого шанса. Это может просто отразить, как Mathworks написал свой код.