Страница: 1 |
Вопрос: Арифметические действия с переменными типа VARIANT | Добавлено: 06.09.06 17:09 |
Автор вопроса: ![]() |
Подскажите, как лучше реализовать задачу:
В приложении должна быть такая функция: Function SUM(ByVal P As Variant, ByVal P2 As Variant, ByRef Rez as Variant) As Long
Rez=p1+p2 End Function Т.е. надо выполнить некоторые арифметические действия над переменными типа VARIANT(а в PB это запрещено). Значит надо определять тип данных в переменной, копировать в соответсвующие этому типу переменные и складывать их, а результат преобразовывать обратно в Variant. Возникает проблема с конвертацией типов, например P - это Long, а P2 - Double, значит результат должен сохранятся с типом Double Rez=Result as Double Проблема в том, что P и P2 могут быть любых типов, и при сложении должно происходить правильное преобразование типов: Byte + Long = Long Integer + Double = Double Dword + Byte = Dword Word + Integer = Word Double + Integer = Double и т.д. Записать все сочетания типов просто невозможно.. Может я совсем уже туплю, но как проще сделать сложение двух Variant`ов с правильным преобразованием типов? |
Ответы | Всего ответов: 2 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Вопросов: 6 Ответов: 171 |
Профиль | Цитата | #1 | Добавлено: 06.09.06 18:58 |
Значит надо определять тип данных в переменной
Нет не надо. самый точный и большой тип данных в ПБ - 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, |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 84 Ответов: 453 |
Профиль | Цитата | #2 | Добавлено: 07.09.06 14:23 |
С EXTENDED не получится, данные в мою функцию приходят в с виде Variant переменных, и уходить должны в Variant`e но с правильным типом. Остальная программа для функции - черный ящик.
Да и EXTENDED - занимает в памяти 10 байтов, а значит и тормозной сильно.. |
Страница: 1 |
|