私の C ライブラリは lua 環境への C ポインターを返します。その C ポインターの値に基づいて、次のようにいくつかの簡単な操作を行う必要があります。
my_pointer = c_pointer + 4
私は lightuserdata では何もできないので、C ポインターの値に基づいて単純な操作を行うことができるように、lightuserdata の代わりに C ポインターの lua_integer 型を返すことで問題ないかどうか疑問に思っています
c_pointer + 4
C++ はポインター演算を使用するため、「単純な操作」ではないという事実は無視します。したがって、その式の結果は、型によって異なりますc_pointer
。
ポインターを数値としてLua に公開し、数値演算を実行できるようにしたいと仮定します。次に、ある時点でそれをポインターに戻します。
これは機能します... 32 ビット マシン用にのみコンパイルする場合に限ります。64 ビット コンパイルでは、ポインターのサイズは 64 ビットになります。double
したがって、データを失うことなくそれらを s に変換して元に戻すことはできません。
さらに、基本的なタイプのトラブルに遭遇する可能性があります。ポインターを整数として公開する場合、おそらく、このポインターを整数として受け取る何らかの関数を Lua に公開したことになります。これは、Lua プログラムがその関数に任意の数値を押し込むことができることを意味します。
良くないね。
これを行う正しい方法は、ポインターを Lua にまったく公開しないことです。Lua が「ポインター」で数学演算を行う必要がある場合は、ポインターを表す完全なユーザーデータ型を公開します。ただし、元のポインターとオフセットをユーザーデータに格納する必要があります。算術演算をオーバーロードして、ユーザーが数値を追加できるようにします。ユーザーの追加などは、ポインターではなくオフセットに影響するはずです。または、ポインタではなく、専用のメモリ バッファ オブジェクトを公開します。
または、ポインターを不透明な値として公開し、すべての API で不透明なポインター + オフセットを Lua 番号として取得します。
つまり、ポインターを Lua に公開しないでください。