1

システムを更新する C++ プログラムがあります。私がすべてをC++で書いたとき、それはこのように少し見えました

System S; //initialize a System object 'S'
while (notFinished)
{
    S.update1(inputVars1);
    S.update2(inputVars2);
}

ここで、matlab から個々の更新関数を呼び出し、(c++ で記述された) アクセス関数を使用して、matlab でデバッグするときにいつでもプログラムの状態を表示できるようにしたいと考えています。

そのため、matlab は「システム」オブジェクトをインスタンス化するために何かを呼び出す必要があり、その後、元のシステム オブジェクトから個々のシステム メソッドを呼び出す必要があります。

Initialize update1 update2現在の状態に関する情報を取得する別の mex ファイルをコンパイルするとします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

これにより、Matlab で C++ プログラム アルゴリズムを呼び出してデバッグできるようになりますか、それともこの問題全体を解決する別の方法がありますか?

4

1 に答える 1

1

私がそれを行う方法は、「new」を使用して、Initializemex関数でC++のSystemへのポインターを作成することです。64ビットプラットフォームを使用している場合は、このポインターを64ビット整数にキャストし、そのタイプと値でmxArrayを作成します。Initialize関数からこのmxArrayを返します。

後で他のmexファイルを呼び出す場合は、このmxArrayを入力として渡す必要があります。これらのファイル内で、それをポインターとしてキャストバックし、オブジェクトのメソッドを呼び出すことができます。

また、MATLAB Systemオブジェクトまたは通常のオブジェクト内にこのすべてをラップし、オブジェクトの外部にポインター値Sを公開しないようにするために、もう1つの手順を実行します。mexファイルを呼び出すオブジェクトのメソッドが必要です。これは、他の人に使用してもらうことを計画している場合に特に必要です。他の人は誤ってSを上書きまたは変更して、クラッシュを引き起こす可能性があります。

最後に、ポインタSを削除するdelete mex関数が必要です。ハンドルクラスを作成する場合は、デストラクタでこれを行うことができます。

于 2013-02-06T03:59:29.340 に答える