Форум » » Ошибка прошивки/описания или сани не едут (LtoA) » Ответить

Ошибка прошивки/описания или сани не едут (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

eoulianov: Добрый! Да, формально - баг. и это может измениться через некоторое время. Хороший подход в S+ - как можно чаще явно указывать что работаете с числом со знаком или без него, чтобы у компилятора было меньше свободы: [pre]long_integer temp; temp = HexToL( "88120D22" ); s = LToA( temp );[/pre] Это часто помогает, но легко может оказаться что LToA() теперь плюёт на тип переменной и всё считает со знаком, или что это зависит от фазы луны или типа округления в региональных настройках. Преобразование через Print() обычно медленнее, но по моим ощущениям - надёжней.

DmitriiP: 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, "%lu", CODE);

Вячеслав: DmitriiP пишет: если хотите строку без знака то: makestring(out, "%lu", CODE); Собственно так и пришлось поступить.




полная версия страницы