Matlab と連携しようとしている C++ コードがあります。私の mex ファイルは、最初の実行では正常に実行されますが、2 回目の実行ではクラッシュします。ただし、実行前に Matlab のすべての変数をクリアすると (すべてクリアを使用)、プログラムがクラッシュすることはありません。だから私はこれに質問があります: 1. mex 関数は、いくつかの特別な関数を使用せずに Matlab ワークスペースから変数を取得できますか? 意図せずに、コードで何らかの方法でそれを行っていますか?
- 私が書いたmex関数を投稿しました。sphere_detector と呼ばれる C++ 関数内で読み取られる「ブロック」と呼ばれる 1 次元ベクトルがあります。現在の問題では、ブロック サイズは 1x1920 であり、sphere_detector 内の 16 要素のチャンクで読み取られます。16 要素の 2 番目のチャンクを読み取ると、プログラムがクラッシュしました。チャンクで読み取った最初の要素は、次のエラーをスローします。
MATLAB.exe の 0x000007fefac7206f (sphere_decoder.mexw64) での初回例外: 0xC0000005: アクセス違反の読み取り場所 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..................
}
どんな助けでも大歓迎です。
よろしく、初心者