Значит надо определять тип данных в переменной
Нет не надо. самый точный и большой тип данных
в ПБ - extended, в него можно складывать все что угодно, байт, интеджер, лонг, dword, причем если в него назначается переменая типа байт, то он (ПБ)
будет правильно показывать это т.е.
#COMPILE EXE
#DIM ALL
FUNCTION PBMAIN () AS LONG
LOCAL b AS BYTE
LOCAL e AS EXTENDED
b=127
e=b
? STR$(e)
END FUNCTION
'e' отображаеться правильно без дробной части.
Поэтому всю математику с разными типами цифровых данных надо делать именно с этим типом. более низшие типы всегда без проблем назначаются в более высшие. Если байт назначить в экстендед то дробная часть сама правильно обнулиться и экстендед будет содержать именно значение байта и больше ничего.
Тоже самое реализуеться и в Вашем примере:
#COMPILE EXE
#DIM ALL
'---------------------------------
FUNCTION SUM(BYVAL P1 AS VARIANT, BYVAL P2 AS VARIANT, BYREF Rez AS VARIANT) AS LONG
LOCAL e1,e2,eRes AS EXTENDED
' Help: You may determine the type of data a Variant variable contains with the VARIANTVT function.
' VarType=VARIANTVT(vrntvar) <- так можно узнавать какой тип данных внутри варианта
e1=VARIANT#(P1) ' универсальный способ извлечения цифровых данных из варианта
e2=VARIANT#(P2)
eRes=e1+e2 ' делаем нашу математику и назначаем результат обратно в вариант
LET Rez = eRes
END FUNCTION
'---------------------------------
FUNCTION PBMAIN () AS LONG
LOCAL a1, a2,Res AS VARIANT
LOCAL b AS BYTE : b=128
LOCAL L AS LONG : L =200000
LOCAL dw AS DWORD : dw=&Hd4d3d2d1???
LOCAL S AS SINGLE : S=11.11111
LOCAL D AS DOUBLE : D=22.222222222
LOCAL E AS EXTENDED: E=33.3333333333333
LOCAL eFinalResult AS EXTENDED ' This type can handle any type
' Play here for other type of Variables (L,dw,S,E) в разных комбинациях
LET a1 = b ' < -
LET a2 = d ' < -
SUM(BYVAL a1, BYVAL a2, BYREF Res)
eFinalResult=VARIANT#(Res)
? STR$(eFinalResult) ' всегда будет показывать правильное значение
' за исключением если сами пренебрегаем точностью в переменых с плавающей запятой
' об этом мы уже говорили (несколько постов ниже, где я загрешил на STR$, но
' потом показал в чем проблема)
END FUNCTION
Я использую вариант только как интернациональный язык для связи с другими приложениями.
Так что если вариант не используеться для передачи
в COM или VB, то можно без него запросто обойтись:
#COMPILE EXE
#DIM ALL
SUB Calcs (BYVAL a1 AS EXTENDED, BYVAL a2 AS EXTENDED, BYREF eResult AS EXTENDED)
eResult=a1+a2
END SUB
FUNCTION PBMAIN () AS LONG
LOCAL b AS BYTE : b=127
LOCAL d AS DOUBLE : d=23
LOCAL Total AS EXTENDED
Calcs(BYVAL b,BYVAL d, BYREF Total)
? STR$(Total)
END FUNCTION
Как видно из предыдущего примера PB сам на лету
конвертирует более низшие типы в более высшие.
Best regards,
Ответить
|