

初めまして、Cの組込みが解る程度の初心者です。  
以下のLuaプログラムがエラーが出て困っています。

[code]

    struct SIteminfo{
           char name[100];
           int  price;
    }
    
    typedf struct SIteminfo ItemInfo;
    
[/code]

このpriceに引数in型が配列されプログラム中に呼び出しているのですが、  
型がintでないとエラーがでます。

ソース:

[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] = {
        {"yakusou",100},
        {"konbou",1000},
        {"nunonohuku",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 NULL;
        }
            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);
        //
        const int *price =GetItemPrice(index);
        //
        lua_settop(L, 0);‬
        //
        lua_pushvalue(L, price);
        //
        PrintStack(L);
    
        return 1;
    
    }
    
    
    
    static int s_money = 0;
    
    static void Shop(){
    
        printf("いらっしゃいませ[MAC TOOL]へようこそ！\n");
    
        while(true){
            printf("何にするかい?\n");
            printf("(所持金 : %d 円)\n",s_money);
    
            for(int i=0; i < MAX_SHOP_ITEMS; i++){
                ItemInfo *item = &shop_items[i];
                if(item->price == -1) continue;
                    printf("%2d. %-10s %6d円\n", i+1, item->name, item->price);
            }
            printf(" 0. 帰る\n");
            int num = GetSelection("どうする？");
            //0 -> 帰る。
            if(num ==0) break;
            //異常値
            if((num < 0)|| ( num > MAX_SHOP_ITEMS ) || (shop_items[num-1].price == -1)){
                printf("えっ？何だって？\n");
                continue;
            }
            // 選択したアイテムの情報
            ItemInfo *item = &shop_items[num -1];
            // 所持金チェック
            if(s_money< item->price){
                //お金が足らない
                printf("%sだね。 っでもお金が、 %d 円、足らないみたいだね。またおいで。\n",item->name, item->price -  s_money );
                continue;
            }
            //購入成功
            printf("%sだね。じゃあ %d 円いただくよ。 \n\n",item->name, item->price);
               s_money = s_money - item->price;
        }
    
        printf("また、いらっしゃい !! \n");
    
    }
    
    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, "GetMoney", GetMoneyGlue); 
        lua_register(L, "SetMoney", SetMoneyGlue); 
    
    
    
        //Luaスクリプトで文字を表示する。
    //  int ret = luaL_dostring(L,"print('商品は'..GetItemName(0)..'です！')");   
        int top = lua_gettop(L);//
        int ret = luaL_dofile(L,"douguya.lua"); 
    
        if(ret!=0){
            printf("error:%s\n",lua_tostring(L,-1));
            lua_pop(L,1);
        }   
        lua_settop(L, top);
    
    
        //所持金決定
    //  s_money = (rand()*10000 / RAND_MAX) + 500;
        s_money = (rand()*100 ) + 500;
    
        if(s_money<0){
            s_money=s_money*-1;
        }
        //道具屋開始
        while(true){
            Shop();
            getchar();
        }
        lua_close(L);
    
        return 0;
    
    }
    
[/code]

`douguya.lua`:

[code]

    print('商品は、'..GetItemName(0)..'だよ！')
    print('商品は、'..GetItemPrice(0)..'だよ！')
    
[/code]

エラーログ:

[code]

    gcc -I/usr/include/lua5.2 -o test2 test2_1.cpp -llua5.2 -lm
    test2_1.cpp:123:2: error: stray ‘\342’ in program
      lua_settop(L, 0);‬
      ^
    test2_1.cpp:123:2: error: stray ‘\200’ in program
    test2_1.cpp:123:2: error: stray ‘\254’ in program
    test2_1.cpp: In function ‘const int* GetItemPrice(int)’:
    test2_1.cpp:53:28: error: invalid conversion from ‘int’ to ‘const int*’ [-fpermissive]
       return shop_items[index].price;
                                ^
    test2_1.cpp: In function ‘int GetItemPriceGlue(lua_State*)’:
    test2_1.cpp:125:24: error: invalid conversion from ‘const int*’ to ‘int’ [-fpermissive]
      lua_pushvalue(L, price);
                            ^
    In file included from test2_1.cpp:1:0:
    /usr/include/lua5.2/lua.h:147:16: note: initializing argument 2 of ‘void lua_pushvalue(lua_State*, int)’
     LUA_API void  (lua_pushvalue) (lua_State *L, int idx);
                    ^
    test2_1.cpp: In function ‘int main(int, char**)’:
    test2_1.cpp:228:26: error: ‘lua_open’ was not declared in this scope
      lua_State *L = lua_open();
    
[/code]

初心者なんで、何かと間違いがあると思いますが、  
ご回答の程、よろしくお願いします


CC BY-SA 4.0
2017-02-11T20:25:38.180
32596
2019-05-04T16:41:05.797
2019-05-04T16:41:05.797
32986
10950
question
c++ lua
lua struct typedf int