Страница 1 из 1

Язык макросов . Преобразование типов.

СообщениеДобавлено: 11 фев 2023, 15:40
IBAH
Вопрос как? в описании про преобразование типов в операциях ни слова. Операции приведения типа ваще нет. Про правила приведения ни слова.

Методом проб и ошибок нашел, что вразумительное приведение можно сделать через присваивание.

Код: Выделить всё
//Коррекция показаний датчиков
int Dav, Kor0, Kor1
short DavS, Kor0S, Kor1S
//ДД1
GetData(a, "Local HMI", "ErrGl_DD1", 1)
if a==0 then
   GetData(Kor0S, "Local HMI", "DD1k0", 1)
   GetData(Kor1S, "Local HMI", "DD1k1", 1)
   GetData(DavS, "MODBUS RTU (Zero-based Addressing)", "DD1", 1)
   Kor0=Kor0S
   Kor1=Kor1S
   Dav=DavS
   Dav=( ((Dav+Kor0)*Kor1)+500 )/1000
   DavS=Dav
   SetData(DavS, "Local HMI", "DD1k", 1)
end if


Арифметика превращается в танцы с бубнами. Как тут писать?!

Re: Язык макросов . Преобразование типов.

СообщениеДобавлено: 22 фев 2023, 23:19
Михалыч
IBAH писал(а):... Как тут писать?!


Доброе время суток всем!
Да, удобно когда есть готовая и отлаженная библиотека. Читая пост, пришла мысль! Можно попробовать и самостоятельно, создать свою библиотеку, в которой будут свои функции преобразования и арифметики.
Что-то наподобие такого:
Код: Выделить всё
sub short my_i_to_s(int in_int)
// конвертируем int to short


и/или

Код: Выделить всё
sub short my_sum_i(int int_1, int int_2)
// находим сумму short от аргументов int_1 и int_2


... ну и так далее. Может быть, уже есть решения? А то выходит, что каждому надо изобретать велосипед.

Re: Язык макросов . Преобразование типов.

СообщениеДобавлено: 23 фев 2023, 10:44
dimensy
О преобразовании типов есть упоминание в инструкции в разделе 18.4.2
А так, не пойму какие проблемы: при вычислении результат приводится к формату старшего. Например, если вы складываете short и int, то результат будет int. И если вы попытаетесь присвоить его переменной в формате short, то можете получить ерунду из-за переполнения

Re: Язык макросов . Преобразование типов.

СообщениеДобавлено: 23 фев 2023, 10:46
dimensy
Михалыч писал(а):
IBAH писал(а):... Как тут писать?!


Доброе время суток всем!
Да, удобно когда есть готовая и отлаженная библиотека. Читая пост, пришла мысль! Можно попробовать и самостоятельно, создать свою библиотеку, в которой будут свои функции преобразования и арифметики.
Что-то наподобие такого:
sub short my_i_to_s(int in_int)
// конвертируем int to short

и/или

sub short my_sum_i(int int_1, int int_2)
// находим сумму short от аргументов int_1 и int_2

... ну и так далее. Может быть, уже есть решения? А то выходит, что каждому надо изобретать велосипед.


как вы видите приведение числа int с диапазоном +2147483647 -2147483648 к числу short с диапазоном +32767 -32768? Наоборот, short в int можно, но это и так автоматом делается

Re: Язык макросов . Преобразование типов.

СообщениеДобавлено: 23 фев 2023, 11:36
Михалыч
Вижу очень просто. Нужно помнить о границах типов и контролировать диапазон входных переменных - если есть риск выйти за эти границы. Так же, выбирать тип переменных соответствующий возможному диапазону значений физической величины. В общем, использовать осмысленный подход.
Например, температуру float 123,45 °C приводим к short - получаем 123 °C, вполне нормальное преобразование. Но если будем приводить int 33767 к short - то мы должны понимать, что делаем что-то не то.

Re: Язык макросов . Преобразование типов.

СообщениеДобавлено: 23 фев 2023, 11:50
dimensy
Михалыч писал(а):Вижу очень просто. Нужно помнить о границах типов и контролировать диапазон входных переменных - если есть риск выйти за эти границы. Так же, выбирать тип переменных соответствующий возможному диапазону значений физической величины. В общем, использовать осмысленный подход.
Например, температуру float 123,45 °C приводим к short - получаем 123 °C, вполне нормальное преобразование. Но если будем приводить int 33767 к short - то мы должны понимать, что делаем что-то не то.

Это делается автоматом, т.н. неявное приведение типов