2

引数として取る C 関数がありFILE*、Lua ファイルを渡してこの関数を Lua で使用したいと考えています。これには が必要だと思い%typemapます。書き方は?(Luaの学習を始めたばかりです)。

4

3 に答える 3

5

これが私が最終的に思いついた解決策です。

Lua ソースの liolib.c には、FILE *tofile (lua_State *L)Lua ファイルを C FILE* に変換する関数がありますが、API の一部ではありません。タイプマップを作成するために少し変更しました。

%typemap(in) FILE * {
    FILE **f;
    if (lua_isnil(L, $input))
        $1=NULL;
    else {
        f = (FILE **)luaL_checkudata(L, $input, "FILE*");
        if (*f == NULL)
            luaL_error(L, "attempt to use a closed file");
        $1=*f;
    }
}

C 関数に NULL を渡す方法が必要だったので、この typemap は nil も受け入れます。

于 2009-11-26T09:42:52.653 に答える
0

SWIG を使用して C コードの Lua バインディングを生成していますか? Lua C API を直接使用しない理由、または C++ を使用できる場合は Luabind を使用しないのはなぜですか? すでに SWIG に強い愛着を持っている場合を除き、SWIG で動作させるよりも、どちらか一方の方が優れていると思います。

于 2009-11-21T19:32:57.550 に答える
0

あなたが求めていることを行う簡単な方法はありません。

Lua File クラス インターフェイスは、基礎となる実装を抽象化します。単純にタイプマップすることはできません。ただし、必要な FILE 操作をラップする C プロキシを作成し、SWIG を使用して Lua でこのプロキシのインスタンスを作成することはできます。その後、typemap を生成して FILE* をラッパー プロキシ インスタンスに変換できます。

何かのようなもの:

class MyFileProxy {
    private:
        FILE* fp;
    public:
        MyFileProxy(FILE* fp);
        MyFileProxy(const char* path); 

        FILE* GetFilePointer();

        Seek(...

SWIG では、バインディングは単純です。

%module "MyFile"

%{
#include "MyFileProxy.h"
%}

// Tell SWIG how to use a proxy for functions that take a FILE*
%typemap(in) FILE*
{
    void* tmp = 0;
    SWIG_ConvertPtr(L,$argnum,(void**)&tmp,$1_descriptor,1);

    if (tmp)
    {
        MyFileProxy* proxy = (MyFileProxy)tmp;
        arg$argnum = proxy->GetFilePointer();
    }
}

// Tell SWIG how to create a proxy when returning FILE*
%typemap(out) FILE*
{
    MyFileProxy* pResult = new MyFileProxy($arg);
    SWIG_NewPointerObj(L, pResult, $1_descriptor, 1);
}

%include "MyFileProxy.h 

}

ただし、io:File を直接使用することはできません。

于 2009-11-24T18:10:48.803 に答える