Остановка функции mex (C) без закрытия MATLAB - PullRequest
1 голос
/ 20 июня 2019

Я хочу остановить выполнение своего кода C после того, как обнаружил NaN, и отправить сообщение об ошибке в MATLAB, используя mexWarnMsgTxt.

Код C выполняется из MATLAB поверх файла mex.Я попытался использовать abort () и exit (), которые действительно убивают программу c, но также и MATLAB (я думаю, потому что это вызывающий процесс здесь.)

#include "mex.h"
#include "matrix.h"


for (int i = 0; i <= 5; i++)
       {
           if (mxIsFinite(out[i])) {

           }
           else if (mxIsInf(out[i])) {
               char *err_msg = malloc(max_len_err_msg);
               snprintf(err_msg, max_len_err_msg, "Inf detected in file %s at line %d", __FILE__, __LINE__);
               mexWarnMsgTxt(err_msg);
               abort();
               //free(err_msg);
               //abort(1);
               /* NOTE: Test for NaN is here for illustration only.  If a double
                * is not finite and is not infinity, then it is a NaN */

           }
           else if (mxIsNaN(out[i])) {
               char *err_msg = malloc(max_len_err_msg);
               snprintf(err_msg, max_len_err_msg, "NaN detected in file %s at line %d", __FILE__, __LINE__);
               mexWarnMsgTxt(err_msg);
               abort();
               //free(err_msg);

           }
       }

Я просто хочу, чтобы моя функция mexFunction остановилась, но непрекратить Matlab.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

mex-функции - это обычные функции C, поэтому, чтобы выйти из функции раньше, просто используйте return.

Если вы используете выделенные ресурсы, которые необходимо очистить вручную, установленная идиома в C заключается в использовании goto cleanup; (это одно из немногих, если не единственное, приемлемое и общепринятое использование goto ):

void mexFunction(
    int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[]
) {
    for (int i = 0; i <= 5; i++) {
        if (mxIsInf(out[i])) {
            char *err_msg = malloc(max_len_err_msg);
            snprintf(err_msg, max_len_err_msg, "Inf detected in file %s at line %d", __FILE__, __LINE__);
            mexWarnMsgTxt(err_msg);
            free(err_msg);
            goto cleanup;
        } else if (mxIsNaN(out[i])) {
            char *err_msg = malloc(max_len_err_msg);
            snprintf(err_msg, max_len_err_msg, "NaN detected in file %s at line %d", __FILE__, __LINE__);
            mexWarnMsgTxt(err_msg);
            free(err_msg);
            goto cleanup;
        }
        …
    }

cleanup:

    // Perform cleanup here.
}

(Обратите внимание, что в этом коде очистка err_msg выполняется в своей собственной области, а не с глобальной очисткой.)

Но в случае, когда очистка не должна выполняться, операторы goto не нужны и могут быть заменены на return.

1 голос
/ 20 июня 2019

Мое текущее решение состоит в том, чтобы определить глобальную переменную abort_flag в C, установить ее равной 1, если произошла ошибка, и на основании этого разорвать все мои циклы и вернуться из функций.Вид "ручной", но работает:

int  abort_flag = 0;
// to use in other file insert into header: extern int abort_flag;

// in the NaN case (see above)
abort_flag = 1;

// in the loops
if (abort_flag==1) { break; };

// in the functions
if (abort_flag==1) { return; };
...