Автор | Сообщение |
|
Отправлено: 31.01.19 22:18. Заголовок: Ошибка прошивки/описания или сани не едут (LtoA)
Наступил недавно на грабли при работе с функцией STRING LtoA(LONG_INTEGER CODE); Странность №1. Контекстная помощь вызывает справку по другой функции ItoA (подозреваю, в ней тоже будет аналогичный косяк) Странность №2.HELP гласит, что CODE рассматривается как число без знака(CODE is treated as an unsigned number). При этом в примере используется для отображения значения параметр %ld (%ld: Specifies a LONG_INTEGER to be printed as a signed decimal value) присущий числам со знаком. makestring(out$, "%ld", CODE); В итоге имеем поведение функции соответствующей работе в диапазоне чисел со знаком(-2,147,483,648 to 2,147,483,647), а не в диапазоне от 0 до 4294967295 Итого LTOA(HEXTOL("88120D22") возвращает значение -2012082910 вместо ожидаемых от нее 2282884386. Процессор 3 серии. Версия прошивки актуальная на момент написания поста. Учитывайте это в своих модулях simpl+
|
|
|
Ответов - 3
[только новые]
|
|
|
Отправлено: 01.02.19 02:39. Заголовок: Добрый! Да, формальн..
Добрый! Да, формально - баг. и это может измениться через некоторое время. Хороший подход в S+ - как можно чаще явно указывать что работаете с числом со знаком или без него, чтобы у компилятора было меньше свободы: long_integer temp; temp = HexToL( "88120D22" ); s = LToA( temp ); Это часто помогает, но легко может оказаться что LToA() теперь плюёт на тип переменной и всё считает со знаком, или что это зависит от фазы луны или типа округления в региональных настройках. Преобразование через Print() обычно медленнее, но по моим ощущениям - надёжней.
|
|
|
|
Отправлено: 01.02.19 06:03. Заголовок: eoulianov пишет: н..
eoulianov пишет: цитата: | но легко может оказаться что LToA() теперь плюёт на тип переменной и всё считает со знаком |
| очень похоже на это: если скомпелировать такой код цитата: | LONG_INTEGER CODE; SIGNED_LONG_INTEGER CODE2; .... out = LTOA(CODE); out = LTOA(CODE2); |
| и глянуть в папке SPlsWork -> .cs этого файла цитата: | uint CODE = 0; int CODE2 = 0; ... OUT.UpdateValue ( Functions.LtoA ( (int) ( CODE ) ) ) ; OUT.UpdateValue ( Functions.LtoA ( (int) ( CODE2 ) ) ) ; |
| LtoA при этом очень простая функция, но у неё int на входе и нет аналога для uint цитата: | public static CrestronString LtoA(int Source) return Source.ToString()) } |
| P.S. идиотизм в хэлпе с as an unsigned number и equivalent %ld (signed) на лицо... если хотите строку без знака то: makestring(out, "%l u", CODE);
|
|
|
|
Отправлено: 01.02.19 22:18. Заголовок: DmitriiP пишет: есл..
DmitriiP пишет: цитата: | если хотите строку без знака то: makestring(out, "%lu", CODE); |
| Собственно так и пришлось поступить.
|
|
|
|