Указатель на переменную

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

Указатель на переменную

Сообщение Jack Ferre » 01.11.2014 (Сб) 12:32

Как (если возможно) изменить указатель на переменную?

Что-то вроде VarPtr(MyVar) = MyPtr.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Указатель на переменную

Сообщение Mikle » 01.11.2014 (Сб) 12:48

Можно только для массивов, ищи "safearray".

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Указатель на переменную

Сообщение The trick » 01.11.2014 (Сб) 17:39

Mikle писал(а):Можно только для массивов, ищи "safearray".

Не только, можно изменить еще в стеке (аргументы функций), в Variant переменных с флагом VT_BYREF, в строках и т.д. Для статических массивов нельзя.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Указатель на переменную

Сообщение Mikle » 01.11.2014 (Сб) 20:01

The trick писал(а):Для статических массивов нельзя.

А у меня получилось...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Указатель на переменную

Сообщение ger_kar » 01.11.2014 (Сб) 20:05

Тут главное, в зависимости от того, какой применяется массив не забыть все вернуть обратно, чтобы исключить падения и утечку памяти.
Бороться и искать, найти и перепрятать

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

Re: Указатель на переменную

Сообщение Хакер » 01.11.2014 (Сб) 20:35

Бредовый вопрос.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Указатель на переменную

Сообщение The trick » 01.11.2014 (Сб) 22:39

Mikle писал(а):
The trick писал(а):Для статических массивов нельзя.

А у меня получилось...

Скомпилируй.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Указатель на переменную

Сообщение Mikle » 01.11.2014 (Сб) 23:07

The trick писал(а):Скомпилируй.

Скомпилировано. Старый проект, посмотри в модуле modTex:
Вложения
Full.zip
(83.03 Кб) Скачиваний: 229

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Указатель на переменную

Сообщение The trick » 02.11.2014 (Вс) 10:13

Mikle писал(а):Скомпилировано. Старый проект, посмотри в модуле modTex:

Такое не прокатит для локальный переменных процедуры, или полей UDT.
Туман кстати классно сделал.
UA6527P

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Указатель на переменную

Сообщение Jack Ferre » 08.11.2014 (Сб) 12:22

Был занят, не отвечал. :(

Про safearray понравилось.

Мне нужно чтобы переменная UDT указывала на участок в массиве байт. Переменную объявляю как одномерный массив с одним элементом и меняю указатель на данные. Вот что получилось:

Код: Выделить всё
Option Explicit

Private Declare Function GetMem4 Lib "msvbvm60" (ByVal lpSrc As Long, ByVal lpDst As Long) As Long
Private Declare Function PutMem4 Lib "msvbvm60" (ByVal lpDst As Long, ByVal Value As Long) As Long
Private Declare Function AryPtr Lib "msvbvm60" Alias "VarPtr" (Ary() As Any) As Long

Private Type My4BYTES
    b1 As Byte
    b2 As Byte
    b3 As Long
    b4 As Byte
End Type



Private Function SetDataPtr(ByVal ppAry As Long, ByVal pvData As Long) As Long
    Dim p As Long
   
    GetMem4 ppAry, VarPtr(p)
    GetMem4 p + 12, VarPtr(SetDataPtr)
    PutMem4 p + 12, pvData
End Function

Private Sub Form_Load()
    Debug.Print "======================================================"
   
    Dim TestAry(1 To 16) As Byte
    Dim TestVar(0) As My4BYTES
    Dim pvOld As Long
    Dim i As Long
   
    pvOld = SetDataPtr(AryPtr(TestVar), VarPtr(TestAry(3)))
   
    For i = 1 To 16
        TestAry(i) = i
    Next
   
    Debug.Print Hex(TestVar(0).b1), Hex(TestVar(0).b2), Hex(TestVar(0).b3), Hex(TestVar(0).b4)
   
    TestVar(0).b1 = &HF0
    TestVar(0).b2 = &HF0
    TestVar(0).b3 = &HF0F0F0F0
    TestVar(0).b4 = &HF0
   
    Dim sTmp As String
    For i = 1 To 16
        sTmp = sTmp & Hex(TestAry(i)) & "  "
    Next
    Debug.Print sTmp
   
    SetDataPtr AryPtr(TestVar), pvOld
End Sub


По идее должно работать, но при разных длинах полей UDT (как в примере Byte и Long) появляются какие-то пробелы.
Я ожидал на выходе:
3 4 8070605 9
А получаю:
3 4 A090807 B

Почему байты 5 и 6 пропускаются?

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

Re: Указатель на переменную

Сообщение Хакер » 08.11.2014 (Сб) 12:30

Jack Ferre писал(а):Почему байты 5 и 6 пропускаются?

Учи матчасть
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Указатель на переменную

Сообщение ger_kar » 08.11.2014 (Сб) 12:44

Они не пропускаются, а просто идут в другом порядке. В переменной Long 4 байта и в памяти они расположены в порядке от более младших разрядов к старшим, т.е. можно сказать ровно наоборот, если сравнивать с человеческим порядком восприятия. А информацию, которую дал Хакер можно найти и в более удобоваримом виде - на русском.
Бороться и искать, найти и перепрятать

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

Re: Указатель на переменную

Сообщение Хакер » 08.11.2014 (Сб) 12:47

ger_kar писал(а):Они не пропускаются, а просто идут в другом порядке. В переменной Long 4 байта и в памяти они расположены в порядке от более младших разрядов к старшим, т.е. можно сказать ровно наоборот, если сравнивать с человеческим порядком восприятия.

Это вообще никак не относится к теме. Он спрашивал не почему там 3 4 A090807 B вместо 3 4 708090A B, а почему нет байтов 5 и 6. Это из-за выравнивания, а порядок байтов тут не причём.

Более того, он пишет, что ожилал 3 4 8070605 9, что означает, что он в курсе порядка байтов для long.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Указатель на переменную

Сообщение Jack Ferre » 08.11.2014 (Сб) 13:08

UPD
Т.е. адрес переменной в структуре должен быть кратен её длине?

Я так понимаю все стандартные структуры удовлетворяют этому условию.

Если я присваиваю адрес UDT своей функцией SetDataPtr и поля UDT имеют формат Byte, Integer, Long, то адрес должен быть кратен 4-м иначе в UDT будут неправильные значения?

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

Re: Указатель на переменную

Сообщение Хакер » 08.11.2014 (Сб) 14:42

Jack Ferre писал(а):Т.е. адрес переменной в структуре должен быть кратен её длине?

Не переменной, а поля. И не кратен, а есть более сложные правила. В противном случае само начало структуры пришлось бы выравнивать по границе, кратной размеру самого большого поля структуры. Чего в реальности, конечно, нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList