Моя функция mex игнорирует мой оператор if

У меня есть функция mex, которая принимает поле структуры на третьем входе (т.е. prhs[2]), которое является логическим. Если это правда, он будет анализировать информацию из четвертого входа (т.е. prhs[3]). В двух словах, это фрагмент кода:

mxValue = mxGetField(prhs[3], 0, "change"); mxLogical *change;
change = mxGetLogicals(mxValue);
mexPrintf("true/false: %i \n", *change); 
mexEvalString("drawnow;");

if ( change ) {
    mexPrintf("...Parsing info... \n");
    mexEvalString("drawnow;");
    mxValue = mxGetField(prhs[3], 0, "info");   
    nRows = mxGetM(mxValue); nCols = mxGetN(mxValue);
    Eigen::Map<Eigen::VectorXd> info((double *)mxGetPr(mxValue),nRows);

}   

Как видите, я делаю распечатку, чтобы увидеть, является ли ввод prhs[2] истинным или ложным. Даже если функция выводит false, оператор if все равно выполняется, потому что я вижу распечатку ...Parsing info....

Почему моя функция MATLAB mex игнорирует мой оператор if?


person tryingtosolve    schedule 18.01.2018    source источник
comment
Я почти уверен, что вы пытаетесь получить логическое объяснение из 4-го аргумента, а не из 3-го. Я не вижу prhs[2] нигде в вашем коде.   -  person Cris Luengo    schedule 18.01.2018
comment
Тем не менее, вы также должны проверить nrhs перед индексацией в вектор prhs.   -  person Cris Luengo    schedule 18.01.2018
comment
Похоже, что change — это указатель, поэтому if(change) проверяет, не равен ли он NULL, что является правдой (хотя может содержать значение 0). Попробуйте if(*change)   -  person buzjwa    schedule 18.01.2018


Ответы (1)


C — это не MATLAB! С есть С!

Вы проверяете, имеет ли указатель change значение. У него действительно есть значение, направление памяти, например. #72BA21, в место, где хранится значение логического значения.

Вы можете либо проверить содержимое whats внутри этого конкретного направления if(*change), как предлагает @buzjwa, либо получить информацию о массиве вместо указателя на него, используя mxGetData.


В качестве примечания: научитесь отлаживать или, по крайней мере, печатать операторы. простой вызов mexPrintf() показал бы вам, что содержит change

person Ander Biguri    schedule 26.01.2018