Matlab MEX文件:程序在第二次运行中崩溃:读取中的访问冲突

时间:2011-05-22 03:15:38

标签: visual-studio-2010 matlab mex

我有一个C ++代码,我试图与Matlab接口。我的mex文件在第一次运行时运行良好,但在第二次运行时崩溃。但是,如果我在执行之前清除Matlab中的所有变量(使用全部清除)程序永远不会崩溃。所以我有一个问题: 1. mex函数可以在不使用某些特殊函数的情况下从Matlab工作区获取变量吗?我无意中在我的代码中以某种方式这样做了吗?

  1. 我发布了我写的mex函数。它有一个称为“块”的一维向量,在称为sphere_detector的C ++函数中读取。对于当前问题,块大小为1x1920,并且在sphere_detector内的16个元素块中读取。当我读取16个元素的SECOND块时,程序崩溃了。我在块中读取的第一个元素将抛出此错误:
  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..................
        }
    

    任何帮助都将不胜感激。

    关于, 新手

1 个答案:

答案 0 :(得分:1)

好吧,我终于设法解决了这个问题。这是我犯的一个非常愚蠢的错误。我有一个指向数据类型为double的指针(double * a;)的指针,并且我错误地将其分配给整数的内存(我运行了一个find和replace命令,其中我将大量的int更改为double但是剩下这一个)。因此堆被破坏了。我还改变了我的Mex函数,我使用calloc创建动态变量并将它们传递给C ++函数。一旦C ++函数返回,我将值复制到matlab变量并释放它们usind free()。​​