LuaでC/C++との連携

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

LuaでC/C++との連携

投稿記事 by naohiro19 » 11年前

  1. Luaの公式サイトからLuaのソースファイルをダウンロード
  2. Visual Studio の新規プロジェクトで「Win32コンソールアプリケーション」のプロジェクトを作成する
  3. Luaの公式からダウンロードしたLuaのsrcフォルダにあるファイル(lua.c/luac.c以外)をプロジェクトにコピー(こうすることでスタティックライブラリのリンクを使わなくてもOKになります)
  4. プロジェクトの文字コードを「マルチバイト文字列を使用する」(リリース&デバッグ)、「コード生成」で「マルチスレッドデバッグ(デバッグ)」「マルチスレッド(リリース)」に設定して、「全般」をクリックした後に「追加のインクルード」のところでLua.hppがあるフォルダを指定する
  5. あとはビルドをするだけです。
  6. 添付ファイルのように表示されたら成功となります。
「lua.c」はShift_jisに対応していないのでprint("ソース")が文字化けしてしまいます。lua.cを通さなければ日本語の「print "ソース"」は文字化けしません。

サンプルプログラム

CODE:

//main.cpp
#include 
#include "lua.hpp"
#include "PrintStack.h"

int main()
{
	lua_State* L = luaL_newstate();
	luaL_openlibs(L);
	//Luaのスタックに各種プッシュしてみる
	lua_pushnumber(L, 10.5); //数値をプッシュ
	lua_pushboolean(L, true); //ブール値をプシュ
	lua_pushstring(L, "Hello world!"); //文字列をプッシュ
	lua_pushnil(L); //nilをプッシュ
	lua_pushliteral(L, "リテラル文字列の表示"); //リテラル文字列をプッシュ
	//Luaのスタックを表示
	PrintStack(L);
	lua_close(L);

	return 0;
}

CODE:

//PrintStack.h
#pragma once

#include 
#include 

void PrintStack(lua_State* L);
以下のプログラムは「スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践」のP91-P92に掲載されています。

CODE:

//PrintStack.cpp

#include "PrintStack.h"

// スタックの指定インデックスのアイテムの内容を表示する
static void PrintStackItem(lua_State *L, int idx)
{
	int type = lua_type(L, idx);
	switch (type){
	case LUA_TSTRING:
		// 文字列アイテムの内容表示
		printf("index %2d : type = %s : \"%s\"\n",
			idx, lua_typename(L, type), lua_tostring(L, idx));
		break;
	case LUA_TNUMBER:
		// 数値アイテムの内容表示
		printf("index %2d : type = %s : %f\n",
			idx, lua_typename(L, type), lua_tonumber(L, idx));
		break;
	case LUA_TBOOLEAN:
		// ブール値アイテムの内容表示
		printf("index %2d : type = %s : \"%s\"\n",
			idx, lua_typename(L, type), lua_toboolean(L, idx) ? "true" : "false");
		break;
	default:
		// その他ならば型だけ表示
		printf("index %2d : type = %s\n", idx, lua_typename(L, type));
		break;
	}
}

// スタックのアイテムの内容を一覧で出力する
void PrintStack(lua_State *L)
{
	printf("----- stack -----\n");
	int top = lua_gettop(L);
	// 正のインデックスで指定
	for (int i = top; i >= 1; i--){
		PrintStackItem(L, i);
	}
	printf("-----------------\n");
	for (int i = -1; i >= -top; i--){
		PrintStackItem(L, i);
	}
	printf("-----------------\n");
}
PrintStack.cppのPrintStackItem関数は、staticをつけているのでPrintStack関数からしか呼び出せないようにしてあるので、main関数からはこの関数は呼ぶことがありません。staticをつけなければPrintStack関数をmain関数から呼び出すことができます。
添付ファイル
screen.png
コンソール画面(Lua)
screen.png (12.8 KiB) 閲覧数: 410 回
最後に編集したユーザー naohiro19 on 2013年12月14日(土) 08:21 [ 編集 6 回目 ]

コメントはまだありません。