lua struct typedf int
初めまして、Cの組込みが解る程度の初心者です。
以下のLuaプログラムがエラーが出て困っています。
struct SIteminfo{
char name[100];
int price;
}
typedf struct SIteminfo ItemInfo;
このpriceに引数in型が配列されプログラム中に呼び出しているのですが、
型がintでないとエラーがでます。
ソース:
#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;
}
douguya.lua
:
print('商品は、'..GetItemName(0)..'だよ!')
print('商品は、'..GetItemPrice(0)..'だよ!')
エラーログ:
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();
初心者なんで、何かと間違いがあると思いますが、
ご回答の程、よろしくお願いします