Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: Арифметические действия с переменными типа VARIANT Добавлено: 06.09.06 17:09  

Автор вопроса:  alex
Подскажите, как лучше реализовать задачу:

В приложении должна быть такая функция:

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
Автор ответа:
 JMP



Вопросов: 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
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #2 Добавлено: 07.09.06 14:23
С EXTENDED не получится, данные в мою функцию приходят в с виде Variant переменных, и уходить должны в Variant`e но с правильным типом. Остальная программа для функции - черный ящик.

Да и EXTENDED - занимает в памяти 10 байтов, а значит и тормозной сильно..

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам