7

MEXインターフェイスを使用してMATLABでC++コードを実行しています。Systemオブジェクトを処理するために、MATLABにいくつかの関数を追加したいと思います。

sysInit()
sysRefresh()
sysSetAttribute(name, value)
String = sysGetAttribute(value)
sysExit()

各MEXdllには1つの関数を含めることができるため、へSystemの呼び出しによって削除されるまで存在するグローバルオブジェクトへのポインターを格納する方法を見つける必要がありますsysExit

これをMATLABで正しく行うにはどうすればよいですか?MEX関数の呼び出し全体でグローバルポインタを格納する方法はありますか?

4

2 に答える 2

8

一般的なアプローチの 1 つは、sysInit.m、sysRefresh.m など、パブリック インターフェイスを提供する複数の m ファイル関数を用意することです。

これらの各 m ファイルは、何らかの種類のハンドル、呼び出す関数を識別する文字列 (または数値)、および追加の引数を使用して関数 mex を呼び出します。たとえば、sysRefresh.m は次のようになります。

function sysRefresh(handle)
return sysMex(handle, 'refresh')

sysMex mex 関数では、ハンドルを生のヒープ ポインターにするか (簡単ですが、あまり安全ではありません)、ハンドル ID から実際のオブジェクト ポインターへのマッピングを C/C++ で維持することができます。このソリューションには少し余分な作業が必要ですが、はるかに安全です。このようにして、誰かが誤って任意の数値をハンドルとして渡すことができなくなります。これは、ダングリング ポインターとして機能します。また、mex 関数をアンロードするときに onCleanup 関数を使用してすべてのメモリとリソースを解放するなど、より手の込んだことを行うこともできます (たとえば、mex 関数を再コンパイルするときに matlab を再起動する必要はありません)。

必要に応じて、Matlab クラスの背後にあるハンドルを非表示にすることができます。興味がある場合は、ドキュメントで Matlab の OO 機能を読んでください。最近のバージョンを使用している場合は、よりクリーンなハンドル オブジェクトを利用できます。

于 2009-07-27T11:46:38.327 に答える
3

または、MEX をまったく使用しなくても済む場合もあります。matlab (Windows 上) では、任意の汎用 dll をロードloadlibraryし、callib. ただし、これはおそらくオペレーティング システム間で移植可能ではありません。

于 2009-07-27T17:14:26.797 に答える