lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

在 2015/5/8 1:20, Paulo Roberto 写道:
I just tried to use *string.format* instead of using the operator *..* and it worked fine.
The new Lua code:

/if (lua_type == 'transaction') then
  shiftno = tran.getshiftno()
  dev.log(string.format('ShiftNumber: %d' , shiftno))
  tran.print(string.format('ShiftNumber: %d' , shiftno))

The question is: why the operator *..* does not work on this platform and works on Linux and others platforms I have here.
The Lua source code used to build the libraries were the same.

Thank you again.


On Thu, May 7, 2015 at 11:50 AM, Paulo Roberto < <>> wrote:


    I'm getting a strange behavior using the functions /lua_pushinteger/ and /lua_pushunsigned/.

    When calling these functions, the value stored in the Lua stack /L/ is not the value passed to the function (an integer), actually It is a small float number.
    It seems there is some sort of error converting values as all Lua numbers are stored as /double/ numbers.

    For example, passing the value /37/, the Lua layer receives /5.3265215697135e-315/

    I'm using *lua 5.2*, *gcc 4.3.4*, building for ARM processors, 32 bits words.
    I'm passing the compile flag/LUA_COMPAT_ALL/ and /LUA_ANSI/

    The code I'm using is something like this:

    /int GetShiftNumber(lua_State *L)
      lua_pushinteger(L, gsConfig.ShiftNumber);
    #ifdef RUNLOG2
      sprintf(NurLogBuf, "GetShiftNumber: shiftno = %lu", gsConfig.ShiftNumber);

    The/Log2/ just logs the values on the RS232 port.

    The Lua code that invokes the C code above is:

    /if (lua_type == 'transaction') then
      shiftno = tran.getshiftno()
      dev.log('ShiftNumber: ' .. shiftno)
      tran.print('ShiftNumber: ' .. shiftno)

    The/tran.getshiftno/ is the corresponding Lua function for the above /GetShiftNumber/.
    The /dev.log/ function just invokes the C Log2 function.

    On the C layer, the variables are correct displayed:

    /GetShiftNumber: shiftno = 37/

    On the Lua layer, the /shiftno/ is incorrect, /dev.log/ displays:

    /ShiftNumber 5.3265215697135e-315/

    The /gsConfig/ is a global structure and the field/gsConfig.ShiftNumber/ is an /unsigned long/.
    I also tried to use the lua_pushunsigned and got the same result.
    Then I created a local /int/ variable, did and explicit cast and passed the local variable to /lua_pushinteger/ but nothing changed.

    Passing values from Lua layer to C layer works fine.
    The same code, works fine in other platforms.

    Could you help me to find a solution for this issue?

    Thank you in advance.

    Paulo Roberto Brandão.

I guess it's a flaw of the CRT on your device, or you just misconfigured Lua.

I remember `tostring` use the `%g` format to convert a number to string under
the default configuration. either you libc doesn't deal with `%g` correctly, or
you have a configuration using other format specifier.

check your `luaconf.h`; I believe the config definition is called `number2str`.

the nerdy Peng / 书呆彭 / Sent from Thunderbird