Шестнадцатеричная константа = неправильное число? - PullRequest
5 голосов
/ 16 февраля 2012

У меня есть скрипт Lua, где я пытаюсь использовать шестнадцатеричные числа (0x ..). Если я запускаю этот скрипт в консоли с официальными двоичными файлами Windows, он работает нормально. Но если я запускаю его в своем приложении (простой dofile), я получаю

malformed number near '0x1F'

Неважно, что такое гекс, я всегда получаю эту ошибку, как если бы она не поддерживала их. Библиотека, которую я использую, - Lua 5.1.4, и я попробовал 2 разные (первая из которых я сама скомпилировала), поэтому проблем не должно быть.

Кто-нибудь знает, что здесь может быть не так?

Edit: Это не сценарий. Независимо от того, что я делаю, простой «foo = 0xf» уже вызывает ошибку, даже если в файле больше ничего нет.

Обновление:

tonumber("0xf")

Возвращает ноль, а

tonumber("15")

отлично работает. В моих библиотеках определенно что-то не так с шестнадцатеричным ...

Ответы [ 3 ]

5 голосов
/ 16 февраля 2012

Если шестнадцатеричные литералы не работают для вас (хотя они и должны), вы всегда можете использовать шестнадцатеричный от lua, выполнив tonumber("fe",16)

3 голосов
/ 17 февраля 2012

Почему функции должны быть разными в разных компиляторах, ... почему?

Хорошо, проблема заключалась в том, что Lua пытается преобразовать числа в double по умолчанию.Для этого он использует функцию "strtod", которая принимает 2 аргумента, строку и указатель на символ.Предполагается, что указатель на символ указывает на последнюю позицию после проанализированного номера.Что для шестнадцатеричного числа будет означать «х», после «0».Если это не так, Lua принимает ошибку и выдает нам это милое маленькое сообщение об ошибке.

Я скомпилировал Lua с использованием DMC, потому что мне нужно, чтобы lib была в OMF, и я предполагаю, что другиеиспользовал также DMC.Но очевидно, что strtod DMC работает иначе, так как указатели всегда указывают на начало строки, если это шестнадцатеричный код ... или, вернее, любое недопустимое число.

Я добавил небольшой хак, который проверяет наличиех, если преобразование в двойное не удалось.Не красиво, но пока работает нормально.

int luaO_str2d (const char *s, lua_Number *result) {
  char *endptr;
  *result = lua_str2number(s, &endptr);

  /* Hack for DMC */
  if (endptr == s)
    if(*(s+1) == 'x' || *(s+1) == 'X')
      endptr++;
    else
      return 0; /* conversion failed */
0 голосов
/ 25 декабря 2014

Я столкнулся с этой ошибкой с lua5.2. Lua 5.1 отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...