MATLAB Engine: engEvalString() не вернется, если введен неполный ввод

Я использую MATLAB Engine. Интерфейс C в OS X. Я заметил, что если engEvalString() получает неполный ввод MATLAB, такой как

engEvalString(ep, "x=[1 2");

or

engEvalString(ep, "for i=1:10");

то функция просто никогда не возвращает значение. Самый быстрый способ проверить это — использовать пример engdemo.c. подскажите фрагмент кода MATLAB и оцените его (т.е. вы можете напечатать что угодно).

Мое приложение позволяет пользователю вводить произвольные входные данные MATLAB и оценивать их, поэтому я не могу легко защититься от неполного ввода. Есть ли обходной путь? Есть ли способ предотвратить зависание engEvalString() в этой ситуации или есть способ проверить произвольный фрагмент кода на правильность/полноту, прежде чем я фактически передам его в MATLAB?


person Szabolcs    schedule 27.01.2013    source источник
comment
Возможно, вы могли бы добавить ограничение по времени в c?   -  person Dennis Jaheruddin    schedule 06.02.2013
comment
@Szabolcs: вы удалили свой вопрос со вчерашнего дня, прежде чем я получил возможность опубликовать мой ответ. Не могли бы вы снова открыть его, у меня было несколько идей, чтобы поделиться :)   -  person Amro    schedule 19.02.2013
comment
@Amro Я понял, что был глуп, и получил ответ в MATLAB Answers. Я вообще не должен был использовать mxArrayToString: просто получить данные mxChar из массива: mxChar имеет двухбайтный тип и содержит данные в формате Unicode. Вы все еще хотите, чтобы я снова открылся?   -  person Szabolcs    schedule 19.02.2013
comment
@Szabolcs: да, пожалуйста. Я показываю пару недокументированных функций для строк Unicode.   -  person Amro    schedule 19.02.2013
comment
@ Амро Звучит интересно. Готово!   -  person Szabolcs    schedule 19.02.2013


Ответы (2)


Как вы заметили, эта ошибка характерна для Mac и/или Linux (я не смог воспроизвести ее на своем компьютере с Windows). В качестве обходного пути оберните вызовы в eval, evalc или evalin:

engEvalString(ep, "eval('x = [1,2')")

Кроме того, недокументированная особенность этих функций заключается в том, что они принимают второй вход, который оценивается в случае возникновения ошибки в первом. Например:

ERR_FLAG = false;
eval('x = [1,2', 'x=nan; ERR_FLAG=true;')

Таким образом, вы можете перехватывать ошибки, запрашивая значение глобального флага ошибки, и при этом избежать описанной выше ошибки...

person Amro    schedule 19.02.2013

Служба поддержки подтвердила, что это ошибка в интерфейсе MATLAB Engine в OS X (его нет в Windows). Возможны обходные пути, используя функции MATLAB eval, evalc или аналогичные. Вместо того, чтобы напрямую передавать код в engEvalString(), сначала оберните его в них.

person Community    schedule 17.02.2013