У меня есть программа на C ++, которая обновляет систему. Когда я писал все на C ++, это выглядело примерно так
System S; //initialize a System object 'S'
while (notFinished)
{
S.update1(inputVars1);
S.update2(inputVars2);
}
Теперь я хотел бы вызывать отдельные функции обновления из matlab и иметь возможность использовать функции доступа (написанные на c ++) для просмотра состояния программы в любое время при отладке в matlab.
Таким образом, matlab потребуется вызвать что-то для создания экземпляра «System» объекта, а затем он должен будет вызвать отдельные системные методы из исходного системного объекта.
Предположим, я скомпилировал отдельные mex-файлы в Initialize
update1
update2
и некоторые, которые получают информацию о текущем состоянии getState
, А потом написать код Matlab …
%matlab main
S = Initalize(); %mex file
while (notFinished)
update1(S); %mex file
keyboard; % access state information using "getState" mex function
update2(S); %mex file
keyboard; % access state information using "getState" mex function
end
Позволит ли это мне по существу вызывать и отлаживать мои программные алгоритмы на C ++ в Matlab, или есть другой способ решить эту проблему?
Я бы сделал это, создав указатель для System в C ++ в mex-функции Initialize, используя «new». Если вы работаете на 64-битной платформе, приведите этот указатель к 64-битному целому числу и создайте mxArray с этим типом и значением. Верните этот mxArray из вашей функции Initialize.
Для последующих вызовов к вашим другим mex-файлам вы должны передать этот mxArray в качестве входных данных. Внутри этих файлов вы можете привести их обратно в качестве указателя и вызвать методы объекта.
Я также хотел бы сделать еще один шаг, чтобы обернуть все это внутри системного объекта MATLAB или обычного объекта и не показывать значение S указателя за пределами объекта. Вам нужны методы для объекта, которые будут вызывать ваши mex-файлы. Это особенно необходимо, если вы планируете передать это другим людям для использования. Другие могут случайно перезаписать или изменить S, вызывая сбои.
Наконец, вам нужна функция delete mex, которая удаляет указатель S. Если вы создаете класс дескриптора, вы можете сделать это в деструкторе.
Других решений пока нет …