2011-05-22 42 views
0

我有一個C++代碼,我試圖與Matlab接口。我的mex文件在第一次運行時運行良好,但在第二次運行時崩潰。但是,如果在執行之前清除Matlab中的所有變量(使用全部清除),程序永遠不會崩潰。所以我在這裏有一個問題: 1. mex函數可以從Matlab工作區獲取變量而不使用某些特殊函數嗎?我是否無意中在代碼中以某種方式做了這件事?Matlab MEX文件:程序在第二次運行時崩潰:讀取中出現訪問衝突

  1. 我發佈了我寫的mex函數。它有一個稱爲「塊」的一維矢量,它在C++函數中稱爲sphere_detector。對於目前的問題,塊的大小是1x1920,並且在sphere_detector內的16個元素的塊中讀取。當我讀到16個元素的第二個塊時程序崩潰了。我在讀塊的第一個元素將拋出此錯誤:

在0x000007fefac7206f(sphere_decoder.mexw64)第一次機會異常在MATLAB.exe:0000005:訪問衝突讀取位置0xffffffffffffffff。 MATLAB.exe已經觸發了一個斷點

我檢查了我的塊向量,它應該有所有的值初始化,它有。所以,我很困惑,爲什麼我面臨這個問題。

我正在使用Matlab 2010a和Visual Studio 2010 Professional。

這裏是MEX功能:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
double *mod_scheme, *Mt, *Mr, *block_length, *SNR; 
mod_scheme = mxGetPr(prhs[0]); 
Mt = mxGetPr(prhs[1]); 
Mr = mxGetPr(prhs[2]); 
block_length = mxGetPr(prhs[3]); 
SNR = mxGetPr(prhs[4]); 

/* Now take the input block. This is an encoded block and sphere detector will do the transmission too -- I can change it later */ 
double *block = mxGetPr(prhs[5]); 
double *LIST_SIZE = mxGetPr(prhs[6]); 

double **cand_sym; 
int a = *mod_scheme; 
int b = *Mt; 
int c = *Mr; 
int d = *block_length; 
int e = *SNR; 
int f = *LIST_SIZE; 

int bitSize = (int)(log10(1.0*a)/log10(2.0)); 


for(int i=0; i<(int)*block_length; ++i) 
{ 
printf("%d\n", (int)block[i]); 
} 
printf("Hello world %d %d %d %d %d!\n", (int)*mod_scheme, (int)*Mt, (int)*Mr, (int)*block_length, (int)*SNR); 


/* Inputs are read correctly now set the outputs */ 
double *llr, *cand_dist; 

/* for llrs */ 
plhs[0] = mxCreateDoubleMatrix(1, d, mxREAL); 
llr = mxGetPr(plhs[0]); 

/* for cand_dist */ 
int no_mimo_sym = d/(b*bitSize); 
plhs[1] = mxCreateDoubleMatrix(1, f*no_mimo_sym, mxREAL); 
cand_dist = mxGetPr(plhs[1]); 

/* for cand_syms */ 
plhs[2] = mxCreateDoubleMatrix(b*bitSize*no_mimo_sym, f,mxREAL); //transposed version 
double *candi; 
candi = mxGetPr(plhs[2]); 


cand_sym = (double**)mxMalloc(f*sizeof(double*)); 
if(cand_sym != NULL) 
{ 
for(int i=0;i<f; ++i) 
{ 
cand_sym[i] = candi + i*b*bitSize*no_mimo_sym; 
} 
} 

sphere_decoder(a,b,c,d,e,block,f,llr,cand_dist,cand_sym); 
// mxFree(cand_sym); 
} 

球解碼器代碼,我得到讀例外內的部分看起來像這樣:

for(int _block_length=0;_block_length<block_length; _block_length+=Mt*bitSize) 
    { 
     printf("Transmitting MIMO Symbol: %d\n", _block_length/(Mt*bitSize)); 
     for(int _antenna = 0; _antenna < Mt; ++_antenna) 
      for(int _tx_part=0;_tx_part<bitSize; _tx_part++) 
      { 
          // PROGRAM CRASHES EXECUTING THIS LINE 
       bitstream[_antenna][_tx_part] = (int)block_data[_block_length + _antenna*bitSize + _tx_part]; 
      } 
     ............................REST OF THE CODE.................. 
    } 

任何幫助,將不勝感激。

與問候, 新手

+1

1.很難理解'sphere_decoder'代碼中的變量是什麼意思,你應該提供函數原型(例如,'Mt'來自哪裏,因爲它的作用域是'mexFunction',所以它不可見'sphere_decoder') 2.您描述的症狀聽起來像內存泄漏/超出陣列末尾的寫入。 3.接受你以前的問題的答案會鼓勵人們繼續回答你未來的問題。 – 2011-05-22 07:31:46

+0

嗯...我想我已經找到了解決方案。問題我認爲與Matlab的列主要慣例有關。一旦我完成了一些測試,我將再次重新發布代碼。關於3,當我得到答案時,我總是回覆。但是,今天你提到它之後,我看了一下常見問題解答,並且知道你可以給你答覆。從現在開始我會這樣做。感謝您指出了這一點。 – Richeek 2011-05-22 15:25:51

+0

那麼我終於設法解決了這個問題。這是我犯的一個非常愚蠢的錯誤。我有一個指針(double ** a;)的數據類型double的指針,並錯誤地分配了它的整數內存(我運行了一個查找和替換命令,我改變了大量的int加倍,但這一個離開)。因此堆被損壞了。此外,我改變了我的Mex函數,我使用calloc創建了動態變量,並將它們傳遞給C++函數。一旦C++函數返回,我將值複製到matlab變量並釋放它們(*)。 – Richeek 2011-05-23 00:36:56

回答

1

嗯,我終於設法解決這個問題。這是我犯的一個非常愚蠢的錯誤。我有一個指向double(double *)指針的指針(double * a;),我錯誤地將它分配給了整數的內存(我運行了一個查找和替換命令,在這裏我改變了大量的int來加倍,但剩下這個)。因此堆被損壞了。此外,我改變了我的Mex函數,我使用calloc創建了動態變量,並將它們傳遞給C++函數。一旦C++函數返回,我將這些值複製到matlab變量中,並釋放它們以釋放()。

相關問題