[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Need some help here .. Had agood start...!!
- From: Martin <wtxnh-lua@...>
- Date: Mon, 3 Aug 2009 11:39:07 +0200
On Sat, Aug 01, 2009 at 09:00:05PM +0530, Subhash_Patil wrote:
> int Draw_Rect(lua_State*Lua_VM)
> {
> int i,j[5], n;
>
> n = lua_gettop(Lua_VM);
> printf("stack size:%d\n",n );
>
> for (i = 1; i <= n; i++)
> {
> if ( ! lua_isnumber(Lua_VM, -1))
> {
> printf("from stack not an integer:%d\n",i );
> }
> else
> {
> j[(i-1)] = lua_tonumber(Lua_VM, -1);
> lua_pop(Lua_VM, 1);
> printf("from stack %d\n",j[(i-1)]);
> }
> if ( lua_isnumber(Lua_VM, n-1))
> {
> printf("from stack n-1 is an integer:%d\n",n-1 );
> }
> }
> GUI_DrawFilledRect(j[4] , j[3] , j[2] , j[1] , j[0] );
> return 0;
> }
To investigate depth and content of stack You may use function
void stackDump(lua_State *L) as shown in book 'Programming in Lua'.
You can change it a little if You want it to be little more verbose.
Your handling of stack in Draw_... functions is wrong.
For one you do not handle errors.
When condition 'if ( ! lua_isnumber(Lua_VM, -1))' is
true you need to raise an error (not only print debugging info).
Another condition 'if ( lua_isnumber(Lua_VM, n-1))' is referring
to constant stack slot and this slot becomes invalid after two
lua_pop(Lua_VM, 1)
You should ask yourself what happens if Lua script calls Your function
with wrong number of argument and take care of this case. I would
suggest to use function in shape I posted to You inprevoiuss mail
eventually adding some call to stackDump until you have understanding
what is happening on the stack.
> lua_setglobal(Lua_VM, " DrawRect");
> lua_setglobal(Lua_VM, " DrawFill_Circle");
>From Lua manual reference:
void lua_setglobal (lua_State *L, const char *name);
Pops a value from the stack and sets it as the new value of global name.
This means you need first to push function on the stack and then call
lua_setglobal. Do this:
lua_pushcfunction(Lua_VM, Draw_Rect);
lua_setglobal(Lua_VM, "DrawRect");
lua_pushcfunction(Lua_VM, DrawFill_Circle);
lua_setglobal(Lua_VM, "DrawFill_Circle");
> /************startup.lua*************
>
> io.write("Hello File load successful from LUA \n")
> SCSL_DrawFill_Circle(0,300,100,50)
You registered function to Lua as " DrawFill_Circle" not as
SCSL_DrawFill_Circle.. Also note that you do not want to include space
as the first char in function name.
Good luck
Martin