2016-05-13 28 views
2

C言語のLuaスクリプトで特定の関数を呼び出すことは可能ですか?現在、C関数を呼び出すLuaスクリプトがあります。今、私はこのC関数が、上記のスクリプトからただ1つのLua関数を呼び出す必要があります。Luaスクリプトの特定の関数をcから呼び出す

EDIT: C関数は次のようになります。

#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 


static double E1(double x) { 

    double xint = x; 
    double z; 


    lua_State *L; 
    L = luaL_newstate(); 

    luaL_openlibs(L); 

    luaL_loadfile(L, "luascript.lua"); 

    lua_pcall(L, 0, 0, 0); 

    lua_getglobal(L, "func"); 
    lua_pushnumber(L, x); 

    lua_pcall(L, 1, 1, 0); 

    z = lua_tonumber(L, -1); 
    lua_pop(L, 1); 

    lua_close(L); 

    return z; 
} 

static int Ret(lua_State *L){ 

    double y = lua_tonumber(L, -1); 

    lua_pushnumber(L, E1(y)); 

    return 1; 
} 

int luaopen_func2lua(lua_State *L){ 
    lua_register(
        L, 
        "Ret", 
        Ret 
        ); 
    return 0; 
} 

のLuaスクリプトは次のようになります。

require "func2lua" 

function func (x) 
    -- some mathematical stuff 
    return value 
end 

x = 23.1 

print(Ret(x)) -- Ret is the C function from the top c-file 
+0

Cでこのlua関数を書くことはできませんか?通常、それはCを他の方法で呼び出さないluaです – 4pie0

+0

残念ながら、3番目のプログラムはLuaに依存しています。それで、私のために、その周りに道はありません。 – 7143ekos

+0

おそらく、Luaファイルの解釈が役立つでしょう。 Luaファイルを実行すると、次のようになります。1)func2lua.luaをロードして実行し、グローバル 'func'を関数値に設定し、グローバル' x'を数値に設定し、グローバル 'Ret'変数の値をaグローバルな 'print'変数の値を関数として呼び出します。 'func'がセットされるまで、その値は' nil'になります。誰に電話をかけたいのか、いつ呼び出すのかははっきりしていません。おそらく、ファイルを複数回読み込んで実行する必要はありません。 –

答えて

1

はいすることができます。 C関数はその関数を取得する方法を必要とします。要件に応じて、そのLua関数を引数の1つとしてC関数に渡すか、またはCがどこに到達できるかをLua関数に渡すか(グローバル環境でCを実行するか(そのC関数はlua_getglobal()を実行します)、またはあらかじめ定義されたテーブル、そのスクリプトに属しています。

+0

まず、実際にこの機能を作成するには、チャンク(ファイルやバッファなど)を実行する必要があります。 lua_loadfile/lua_callを使用することができます – moteus

+0

C関数を呼び出すスクリプトは既に実行されているため、別途準備する必要はありません。しかし、はい、ルア関数が呼び出されるとグローバル環境に格納される場合は、C関数への最初の呼び出しの前にそこに格納されなければなりません。 – Vlad

+0

私は、作者がlua_call/pcallを呼び出さずにlua_loadfileだけを呼び出すと、何も機能しないことを意味します。 – moteus

関連する問題