

cppにLuaを組み込んで下記、エラーで困っています。  
教本「スクリプト言語によるゲーム開発」を参照しながら、下記コードを記述したのですが、  
下記エラーが出て、困っています。

アドバイスの程、よろしくお願いいたします。

[code]

    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <time.h>
    
    int GetSelection(const char *title){
    
        char input[100];
    
        printf("%s >",title);
    
        fgets(input, sizeof(input), stdin);
        printf("\n");
    
        if(strlen(input)==0 || !isdigit(input[0])){
            return -1;
        }
            return atoi(input);
    }
    
    struct SItemInfo{
        char name[100];
        int  price;
    };
    
    typedef struct SItemInfo ItemInfo;
    
    #define MAX_SHOP_ITEMS 5
    
    ItemInfo shop_items[MAX_SHOP_ITEMS] = {
        {"薬草",100},
        {"こん棒",1000},
        {"布の服",2000},
        {"",-1},
        {"",-1},
    };
    
    const char* GetItemName( int index){
        if(( index < 0 ) || (index>= MAX_SHOP_ITEMS)){
            return NULL;
        }
            return shop_items[index].name;
    };
    
    const int GetItemPrice( int index){
        if(( index < 0 ) || (index>= MAX_SHOP_ITEMS)){
            return -1;
    }
            return shop_items[index].price;
    };
    
    
    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;
        defalut:
        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");
    
     }
    
         int GetItemNameGlue(lua_State *L){
      //    printf("GetItemName() 関数実行\n");
         //スタックを表示
         //PrintStack(L);
         //
        int index = (int)lua_tonumber(L,1);
        //
        const char *name =GetItemName(index);
        //
        lua_settop(L, 0);
        //
        lua_pushstring(L, name);
        //
        //PrintStack(L);
    
        return 1;
    
     }
    
     int GetItemPriceGlue(lua_State *L){
     // printf("GetItemName() 関数実行\n");
        //スタックを表示
     // PrintStack(L);
         //
         int index = (int)lua_tonumber(L,1);
         //
         int price =GetItemPrice(index);
         //
         lua_settop(L, 0);
        //
        lua_pushnumber(L, price);
         //
     // PrintStack(L);
    
         return 1;
     }
    
     int s_money = 0;
    
     int GetSelectionGlue(lua_State *L){
         //
         const char *title = lua_tostring(L,1);
         //
         int index = GetSelection(title);
         //
         lua_settop(L, 0);
        //
        lua_pushnumber(L, index);
    
        return 1;
     }
    
    
     int GetMoney(){
          return s_money;
     }
    
    
     void SetMoney(int money){
         s_money = money;
     }
    
     int GetMoneyGlue(lua_State *L){
         //
        int money = GetMoney();
         //
         lua_settop(L,0);
         //
        lua_pushnumber(L,money);
        return 1;
     }
    
     int SetMoneyGlue(lua_State *L){
         //
         int index = (int)lua_tonumber(L,1);
         //
         SetMoney(index);
         //
         lua_settop(L,0);
         return 0;
     }
    
    
    
    
     int main(int argc, char* argv[]){
         //乱数初期化
        srand((unsigned int)time(NULL));
         for(int i=0; i<100; i++) rand();
    
        //LuaのVMを生成する。
        lua_State *L = lua_open();
    
         //LUaの標準ライブラリを開く
        luaL_openlibs(L);
    
         //
        lua_pushnumber(L, MAX_SHOP_ITEMS);
        lua_setglobal(L, "MAX_SHOP_ITEMS"   );
         //
        lua_register(L, "GetItemName", GetItemNameGlue); 
        lua_register(L, "GetItemPrice", GetItemPriceGlue); 
        lua_register(L, "GetSelection", GetSelectionGlue); 
    
        lua_register(L, "GetMoney", GetMoneyGlue); 
        lua_register(L, "SetMoney", SetMoneyGlue); 
    
    
    
    
        //所持金決定
     // s_money = (rand()*10000 / RAND_MAX) + 500;
         s_money = 1500;
    
     //debug.tracebreack関数の実装へのポインタ
     lua_CFunction stack_trace_func = NULL;
    
     //debug.tracebreackの実装であるＣ関数を取得する
     lua_getglobal(L,"debug");
     if(!lua_isnil(L,-1)){
         lua_getfield(L,-1,"traceback");
        stack_trace_func = lua_tocfunction(L,-1);
        lua_pop(L,1);
     }
         lua_pop(L,1);
    
     //スタックのサイズを覚えておく
    
        int top = lua_gettop(L);
     // int ret1 = luaL_dofile(L,"douguya3.lua");   
        int ret1 = luaL_loadfile(L,"douguya3.lua"); 
    
    
    
     //エラー処理関数を積み、その上にグローバル関数shopを積む
         lua_pushcfunction(L,stack_trace_func);
         lua_getglobal(L,"Shop");
         ret1 = lua_pcall(L,0,0,-2);
        if(ret1!=0){
            //実行時エラー
             printf("error: %s\n", lua_tostring(L,-1));
             //スタックを戻す
            lua_settop(L,top);
            printf("<エンターキーを押すとスクリプトを読み直します。>\n");
            getchar();
            //douguya.luaをロードし直す    
            load_script(L);
     //     ret1=load_script(name='douguya3.lua',path='./');
         }
        else{
            //スタックを戻す
             lua_settop(L,top);
             break;
         }
    
        if(s_money<0){
            s_money=s_money*-1;
        }
    
        lua_close(L);
    
        return 0;
    
     }
    
[/code]

エラー:test2_1.cpp: In function ‘int main(int, char**)’:  
test2_1.cpp:247:16: error: ‘load_script’ was not declared in this scope  
load_script(L);  
^  
test2_1.cpp:253:3: error: break statement not within loop or switch  
break;  
^


CC BY-SA 3.0
2017-03-13T20:05:26.807
33298
2017-03-17T07:42:50.283
2017-03-17T07:42:50.283
19110
10950
question
c lua
load_script がnot declaredになる。


当該のコードの、引数(L)が「lua_State *」型なので、

load_script(L)は  
lua_load_script(L)

である可能性が高いと予測できるのですが、いかがでしょう。


CC BY-SA 3.0
2017-03-14T09:11:39.717
33309
2017-03-14T09:11:39.717
3793
33298
answer


アドバイスありがとうございます。教本どおりに打‌​ち込んでいたのですが、教本のダウンロード‌​サイトにはload_scriptならぬL‌​OAD_SCRIPT関数が組み込まれてお‌​り、こちらを組み込むことで上手くいきまし‌​た。


CC BY-SA 3.0
2017-03-16T19:11:13.853
33371
2017-03-16T19:11:13.853
10950
33298
answer