сборка чисел на vb

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
mcnick
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.06.2007 (Вс) 11:23

сборка чисел на vb

Сообщение mcnick » 24.06.2007 (Вс) 14:51

я тут доставал народ сборкой double и понял, что надо упростить задачку. допустим приходят два байта:st_bayt - старший байт и ml_bayt - младший байт. мне надо объеденить их в integer.
я пишу код как на ассемблере:
word = st_bayt 'пишу в integer старший байт
word = word *256 'сдвигаю его на место старших разрядов- на 8 бит
word = word or ml_bayt ' объединяю его с младшим байтом
код работает, но только с положительными числами. если число приходит отрицательное, т.е. в дополнительном коде, код не реботает.
вопрос: как правильно объеденить два байта в integer.
когда гуру от vb решат это, может станет понятно и с double.
что до числа байт в double, то пусть будет 8. но вопрос остается - как их правильно распределить, если они приходят побайтно.
mcnick. :D

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.06.2007 (Вс) 15:06

LSet устроит?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 24.06.2007 (Вс) 20:09

mcnick
Следует использовать PutMem1.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Random
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 21.02.2006 (Вт) 6:08
Откуда: Пермь

Может пригодится )

Сообщение Random » 28.06.2007 (Чт) 23:43

(даже не помню кто автор,только что он какой-то американец Джон). Данный код иллюстрирует способ создания новго типа данных:
=============================================
Код: Выделить всё
'Creating a New Data Type
'Class UInt module level
'Provides an unsigned integer type
'Methods:
'   None
'Properties:
'   Value (default)
'   HiByte
'   LoByte

'Type structures used for returning high/low bytes
Private Type UnsignedIntType
    lo As Byte
    hi As Byte
End Type

Private Type SignedIntType
    n As Integer
End Type

'Internal variables for returning high/low bytes
Private mnValue As SignedIntType
Private muValue As UnsignedIntType

Property Let Value(lIn As Long)
    mnValue.n = (lIn And &H7FFF&) - (lIn And &H8000&)
    LSet muValue = mnValue
End Property

Property Get Value() As Long
    Value = mnValue.n And &HFFFF&
End Property

Property Let HiByte(bIn As Byte)
    muValue.hi = bIn
    LSet mnValue = muValue
End Property

Property Get HiByte() As Byte
    LSet muValue = mnValue
    HiByte = muValue.hi
End Property

Property Let LoByte(bIn As Byte)
    muValue.lo = bIn
    LSet mnValue = muValue
End Property

Property Get LoByte() As Byte
    LSet muValue = mnValue
    LoByte = muValue.lo
End Property


Using the New Data Type
Be sure to set Value to be the default property of the UInt class

Код: Выделить всё
Option Explicit
Private Sub Form_Click()
    Dim uNewVar As New UInt
    'Set the default property
    uNewVar = 64552
    'Set the high byte
    uNewVar.HiByte = &HFF
    'Return the low byte
    Print Hex(uNewVar.LoByte)
End Sub
:oops:
:)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.06.2007 (Пт) 16:09

В чём смысл этого кода?
Повторить (в форме класса! ужос какой) тот код, который очень давно лежит в Кирпичах?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 04.07.2007 (Ср) 18:19

Код: Выделить всё
Private Declare Sub CopyMemoryByVal Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, Source As Any, ByVal Length As Long)
Private Declare Sub CopyMemoryByRef Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
Dim bl As Byte
Dim bh As Byte
Dim i As Integer

bl = 0
bh = 255

CopyMemoryByVal VarPtr(i), bl, 1
CopyMemoryByVal VarPtr(i) + 1, bh, 1

Me.Caption = i
End Sub

Private Sub Command2_Click()
Dim b(1) As Byte
Dim i As Integer

b(0) = 0 'l
b(1) = 255 'h

CopyMemoryByRef i, b(0), 2

Me.Caption = i
End Sub

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.07.2007 (Ср) 18:33

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.07.2007 (Ср) 22:09

-=}-{i$ER=-, помимо прочего, выбери себе нормальный ник. И сообщи его Хакеру или RayShade, чтобы тебе его поменяли.
Иначе будет бан.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 86

    TopList