Явное преобразование типов в VB?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Явное преобразование типов в VB?

Сообщение Leon_ » 19.07.2004 (Пн) 9:37

Возможно ли в VB явное преобразование типов? А, в частности, присвоение содержимого одного из членов UDT другой переменной другого UDT? :roll:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 19.07.2004 (Пн) 10:30

Возможно :)
I don't understand. Sorry.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 19.07.2004 (Пн) 15:00

Ну вот, скажем, необходимо мне реализовать такую операцию, которая в VC++ делается "на раз":
ether_header* pEthHeader = NULL;
INTERMEDIATE_BUFFER PacketBuffer;
pEthHeader = (ether_header*)PacketBuffer.m_IBuffer;

Я объявил в VB аналогичные структуры таким образом
'Ethernet Header
Public Type ether_header
h_dest(ETH_ALEN - 1) As Byte 'destination eth addr
h_source(ETH_ALEN - 1) As Byte 'source ether addr
h_proto As Integer 'packet type ID field
End Type

Public Type INTERMEDIATE_BUFFER
m_qLink As Long
' m_qLink As LIST_ENTRY
m_dwDeviceFlags As Long
m_Length As Long
m_Flags As Long 'NDIS_PACKET flags
m_IBuffer(MAX_ETHER_FRAME - 1) As Byte
End Type

Как тогда произвести присвоение части одной переменной другой:
Dim EthHeader As ether_header
Dim PacketBuffer As INTERMEDIATE_BUFFER
. . . . . .
LSet EthHeader = PacketBuffer.m_IBuffer <-- ????

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

Сообщение GSerg » 19.07.2004 (Пн) 21:26

У, парень :)
Это кастинг, а не преобразование типов. Это либо ручками через GetMem4, либо CopyMemory сначала.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 20.07.2004 (Вт) 7:44

8) Да, я уже махнул рукой на встроенные средства VB (бедненькие они, мало возможностей), и использовал API::CopyMemory
Код: Выделить всё
CopyMemory EthHeader, PacketBuffer.m_IBuffer(0), MAX_ETHER_FRAME

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 20.07.2004 (Вт) 19:54

Извините, что вклиниваюсь в тему, но если у меня есть написанная функция, которой неплохо было бы передавать как "родной" тип данных Complex, так и встроенный Double. Пока я пользуюсь рукотворной функцией перевода из Double в Complex. А можно ли прописать автоматический перевод из стандартного типа данных в пользовательский, как например Byte в Long.
Код: Выделить всё
'Тип комплексных чисел:
Public Type Complex
Real As Double 'действительная часть числа
Image As Double 'мнимая часть числа
End Type
...
Function C(R As Double,I As Double) As Complex
Complex.Real = R
Complex.Image = I
End Function
...
Function CSum(C1 As Complex,C2 As Complex) As Complex
CSum.Real=C1.Real+C2.Real
CSum.Image=C1.Image+C2.Image
End Function

Так вот, как бы сделать так, чтоб при передаче CSum переменной типа Double он воспринимался как Complex со свойством Real значением в эту самую переменную (надеюсь, изложил понятно)?
Листинги не горят!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 21.07.2004 (Ср) 11:41

Leon_ писал(а):8) Да, я уже махнул рукой на встроенные средства VB (бедненькие они, мало возможностей), и использовал API::CopyMemory
Код: Выделить всё
CopyMemory EthHeader, PacketBuffer.m_IBuffer(0), MAX_ETHER_FRAME


Мда
Для начала посмотри что кроется за
Код: Выделить всё
pEthHeader = (ether_header*)PacketBuffer.m_IBuffer;

в С++ если копнуть глубже.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 21.07.2004 (Ср) 12:37

codemaster писал(а):Мда

:roll: Глубже.. Присвоение 32-битной переменной нового значения. И что? :)
Все равно в VB нет указателей, так что тут нечего обсуждать.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 21.07.2004 (Ср) 12:45

Leon_ писал(а): :roll: Глубже.. Присвоение 32-битной переменной нового значения. И что? :)
.

На поверхности да. В отладчике нечто другое

Leon_ писал(а):Все равно в VB нет указателей, так что тут нечего обсуждать.


Неплохо ! Напоминает перлы из твоего топика про API функцию и структуры.
Давай вспомним что представляет из себя указатель в С++

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 21.07.2004 (Ср) 12:49

int32 8)
Моду создают модоки, а распространяют модозвоны.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 21.07.2004 (Ср) 13:13

Ну все, пошел флейм :lol:
codemaster, дружище! Я пользуюсь этой конференцией для того, чтобы быстро и квалифицированно получать помощь по оперативным вопросам.

Но.Не.Для.Пространных.И.Отвлеченных.Бесед.С.Любителями.Поговорить.И.Читать.Мне.Нотации.

Надеюсь, ты тоже. Если есть что-нибудь по делу -- пожалуйста, всегда "За". А так -- извиняйте. 8)


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

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

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

    TopList