5

組み込み Lua を実行する ac プログラムがあります。現時点では、ただの Hello World です。stdoutただし、先に進む前に、何らかの方法で操作できるように、lua 出力を 以外の場所に送信できるようにしたいと考えています。これが私のコードです:

#include <stdio.h>

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

int main() {
    lua_State *luaVM = luaL_newstate();
    //char result[1024];

    if (luaVM == NULL) {
        printf("Error initializing lua!\n");
        return -1;
    }
    luaL_openlibs(luaVM);
    luaL_dostring(luaVM, "print(\"hello world!\")");
    //Somehow put the output into result

    //printf("%s\n%s\n", result, result);

    lua_close(luaVM);
    return 0;
}

resultたとえば、コメントにある を使用して、lua コードの結果を 2 回出力したいと思います。これはできますか?

4

3 に答える 3

7

Lua コードが何かを出力するために使用する場合、最も簡単な方法はLua 自体printから再定義することだと思います。printこのようなもの:

print_stdout = print -- in case you need the old behavior

print = function(...)
  for arg,_ in ipairs({...}) do
    -- write arg to any file/stream you want here
  end
end
于 2012-08-09T15:24:35.930 に答える
5

この回答は一部の読者から批判を受ける可能性がありますが、まず、この回答のために特別に準備したブログ投稿を見て、この解決策を選択した理由の序文を読んでください。

約束どおり、古い Lua 5.1 出力リダイレクト パッチを最新バージョンにアップストリームしました。パッチは5.1.5および5.2.1
から 入手できます。

パッチ:

patch -p1 < ~/download/lua-5.2.1-output-redirect.patch

ビルド:

cd src  
make a LUA_A="liblua-5.2.1-redirect.a" SYSCFLAGS="-DLUA_USE_LINUX -DLUA_REDIRECT" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"

チェック:

nm liblua-5.x.y-redirect.a | grep printf
nm liblua-5.x.y-redirect.a | grep fputs
nm liblua-5.x.y-redirect.a | grep fwrite

テスト:

ここでテスト プログラムを入手します(C/C++ 混合、申し訳ありません)。次の方法でビルドします。

g++ -DLUA_REDIRECT -I/path/to/lua-5.2.1/src/ -L. lua-redirect-test.cpp -llua-5.2.1-redirect -ldl -o lua-redirect-test  

出力:

===== Test 1 output =====
Lua stdout buffer:
---
hello world!

---
Lua stderr buffer:
---

---
Lua error message:
---
(null)
---
===== Test 2 output =====
Lua stdout buffer:
---

---
Lua stderr buffer:
---

---
Lua error message:
---
[string "bad_function()"]:1: attempt to call global 'bad_function' (a nil value)
---
于 2012-08-10T15:04:44.340 に答える
2

Lua の I/O ライブラリは、おそらくあなたが探しているものをカバーしています。このio.output関数を使用すると、デフォルトの出力ファイルを設定できます。5.2 マニュアルのI/O ライブラリ セクションをチェックして、他に何があるかを確認してください。

なぜ出力を再ルーティングしたいのですか? 何らかの形で操作したいとおっしゃっていますが、それはどういう意味ですか?

于 2012-08-10T17:17:16.893 に答える