On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение





ссылка на сообщение  Отправлено: 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+

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 3 [только новые]





ссылка на сообщение  Отправлено: 01.02.19 02:39. Заголовок: Добрый! Да, формальн..


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

Это часто помогает, но легко может оказаться что LToA() теперь плюёт на тип переменной и всё считает со знаком, или что это зависит от фазы луны или типа округления в региональных настройках.

Преобразование через Print() обычно медленнее, но по моим ощущениям - надёжней.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 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, "%lu", CODE);

Спасибо: 0 
ПрофильЦитата Ответить





ссылка на сообщение  Отправлено: 01.02.19 22:18. Заголовок: DmitriiP пишет: есл..


DmitriiP пишет:

 цитата:
если хотите строку без знака то:
makestring(out, "%lu", CODE);


Собственно так и пришлось поступить.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 3
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет