Скомпилированный код Matlab вылетает, когда / clr не выбран

0

Мне интересно, почему код, который я использую с скомпилированной библиотекой 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

Теги:
visual-studio-2010

1 ответ

0

Программист, с которым я работаю, понял это...

Когда выбрано /clr, неинициализированные указатели имеют значение NULL. Когда /clr не выбрано, неинициализированные указатели устанавливаются на произвольное значение отладчиком. Затем, когда вызывается mlfTestVarPass, управление памятью Matlab видит произвольный mxArray и пытается освободить нераспределенную память.

Это объясняет крах, однако мы все еще не понимаем, почему существует так много исключений из первого шанса. Это может просто отразить, как Mathworks написал свой код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню