2014-03-06 79 views
0

我想知道爲什麼我沒有選擇公共語言運行庫時,我使用的編譯Matlab庫的代碼崩潰。 對於一個小例子,我試過編譯以下Matlab的功能到一個共享庫:使用下面的調用中冶編譯的Matlab代碼崩潰時沒有選擇/ clr

function [volOut, volAvg]=testVarPass(volIn) 
volOut=double(volIn); 
volAvg=mean(volOut(:)); 
end 

: MCC -B csharedlib:MYLIB testVarPass.m

接下來,我已經設置了一個Visual Studios 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; 
} 

如果我建立與公共語言運行庫支持項目設置爲:/clr...everything工作正常。 如果我將公共語言運行時支持設置爲以下項目:無......首先,當調用mylibInitialize時,調試器會吐出許多異常。最常見的是:varflowFailed,tffFailed,CryptoPP,jitCgFailed和xsd_binder :: MalformedDocumentError。其次,mlfTestVarPass調用會因訪問衝突而崩潰。

我和我一起工作的程序員都在想爲什麼。

其他信息: Windows 7的 Visual Studio 2010中,SP1的Windows SDK 7.1 Matlab的2013b

回答

0

我想通了這一點工作的程序員......

當選擇/ CLR,未初始化的指針被設置爲NULL。 未選擇/ clr時,調試器將未初始化的指針設置爲任意值。然後,當調用mlfTestVarPass時,Matlab的內存管理會看到一個任意的mxArray,並試圖釋放未分配的內存。

這解釋了崩潰,但是,我們仍然不明白爲什麼會有這麼多的第一次機會例外。它可能僅僅反映了Mathworks編寫代碼的方式。