Файл Matlab MEX: сбой программы при втором запуске: нарушение прав доступа при чтении - PullRequest
0 голосов
/ 22 мая 2011

У меня есть код C ++, который я пытаюсь связать с Matlab.Мой mex файл работает нормально при первом запуске, но вылетает при втором запуске.Однако, если я очищу все переменные в Matlab перед выполнением (используя clear all), программа никогда не завершится сбоем.Итак, у меня есть вопрос: 1. Может ли mex-функция извлекать переменные из рабочей области Matlab без использования каких-либо специальных функций?Я делаю это как-то в своем коде, непреднамеренно?

  1. У меня есть функция mex, которую я написал.У него есть одномерный вектор, называемый «блок», который читается внутри функции C ++, называемой сфера_детектор.Для данной задачи размер блока составляет 1x1920, и он читается в блоке из 16 элементов внутриphere_detector.Программа потерпела крах, когда я прочитал ВТОРОЙ блок из 16 элементов.Первый элемент, который я прочитал в чанке, выдаст эту ошибку:

Исключение первого шанса в 0x000007fefac7206f (phere_decoder.mexw64) в MATLAB.exe: 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 Ответ

1 голос
/ 04 марта 2013

Ну, наконец-то мне удалось решить проблему. Это была очень глупая ошибка, которую я сделал. У меня был указатель на указатель (double * a;) типа данных double, и по ошибке я назначил ему память целого числа (я выполнил команду поиска и замены, где я изменил множество int на double, но этот оставил). Следовательно куча была испорчена. Также я изменил свою функцию Mex, где я создал динамические переменные с помощью calloc и передал их в функцию C ++. Когда функция C ++ вернулась, я скопировал туда значения в переменные matlab и освободил их usind free ().

...