Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Как скопировать структуру или сменить указатель новой переменной на ее адрес

13.09.2014, 17:14. Показов 2580. Ответов 33
Метки нет (Все метки)

Здравствуйте!

У меня есть структура вида:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
type Struct_inside
    a as long
    b as long
end type
 
type Struct_main
    count as long
    arr() as Struct_inside
end type
 
public BIDS() as Struct_main
Я заполняю ее некоторыми данными, например:

Visual Basic
1
2
3
4
5
6
sub form_load()
    Redim BIDS(0 to 1) as Struct_main
    Redim BIDS(0).arr(0) as Struct_inside
    BIDS(0).arr(0).a = 11
    BIDS(0).arr(0).b = 22
end sub
И теперь мне тупо лень обращаться к переменным вот так:

Visual Basic
1
2
3
4
5
6
msgbox BIDS(0).arr(0).a
'я конечно могу сделать вот так:
with BIDS(0).arr(0)
   msgbox .a
end with
'но мне хочется поизвращаться :)
Вместо этого мне хочется создать:
Visual Basic
1
2
3
4
5
Dim SI as Struct_inside
' и скопировать в нее структуру BIDS(0).arr(0)
' чтобы потом обращаться к переменным a и b вот так:
msgbox SI.a
msgbox SI.b
Я конечно могу сделать вот так:
Visual Basic
1
2
SI.a = BIDS(0).arr(0).a
SI.b = BIDS(0).arr(0).b
Но уверен есть более простой способ:
1) скопировать структуру через какую-нибудь CopyMemory.
2) сменить указатель переменной SI на адрес структуры BIDS(0).arr(0)

Примерно так я это представляю.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2014, 17:14
Ответы с готовыми решениями:

Как из компонента ActiveX вернуть указатель на структуру или класс
День добрый! Есть такая проблема: не получается вернуть из компонента ActiveX вернуть указатель на структуру. Информации по этому поводу в...

Как получить указатель или прочитать значение, зная базовый адрес и оффсеты?
Сижу долго и нудно в гугле и не могу найти. Как в делфи, зная базовый адресс и оффсеты получить указатель или просто прочитать нашу цифру? ...

Изменяется ли адрес или значение переменной при объявлении ее как const?
При объявлении const у нас значение переменной или адрес переменной не изменяется?

33
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
16.11.2014, 18:33
https://www.cyberforum.ru/blog... g2259.html
В VB6 олицетворением указателей являются ссылки на объекты. Функционалом вызова функции по указателю является вызов метода интерфейса.
0
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 328
Записей в блоге: 1
16.11.2014, 18:46
Да, оказывается это уже обсуждалось. Мне нужны были указатели и свободное с ними обращение, т.к. структура, с которой я работал, имела разные типы и вложенность. Кроме того, в оригинале описывалась в сишных терминах. Ох и намучился я тогда с этими указателями.

Не знаю почему Хакер использовал трюк со стеком, но я тогда решил не экспериментировать и сделал по аналогии.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
16.11.2014, 18:52
Цитата Сообщение от уни Посмотреть сообщение
имела разные типы и вложенность
Вложенность структур не имеет значения.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Type TypeA
    A As Long
    B As Long
End Type
 
Private Type TypeB
    C As Long
    D As Long
End Type
 
Private Type TypeC
    E As TypeA
    F As TypeB
End Type
 
Private Type RealTypeC
    ' Ïîëå E
    A As Long
    B As Long
    ' Ïîëå F
    C As Long
    D As Long
End Type
Как видишь реально тип TypeC представляется как RealTypeC.
0
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 328
Записей в блоге: 1
16.11.2014, 19:06
Да, я в курсе. У меня было что-то вроде этого:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public TYPE_WPC_TITLE As TYPE_WPC_TITLE
 
' Структура заголовка программы
Public Type TYPE_WPC_TITLE
  CRC As Byte
  LowBits As Byte
  HiBits As Byte
  ProgName(1 To PROG_NAME_LENGTH) As Byte
  reserved(1 To 2) As Byte
End Type
 
' Общая структура шага
Public Type TYPE_WPC_STEP
  Bits As Integer
  
  reserved(1 To 14) As Byte
End Type
 
' Структура программы
Public Type TYPE_WPC_PROG
  Title As TYPE_WPC_TITLE
  Step(1 To MAX_NUMBER_OF_STEPS) As TYPE_WPC_STEP
End Type
Каждый Step реально имел разный тип и нужно было сначала проверять поле бит, чтобы декодировать тип шага, а потом накладывать структуру шага, чтобы добраться до правильных полей.

Visual Basic
1
2
3
4
5
6
7
8
9
'  struct {
'    unsigned int Type:4;             // код типа операции
'    unsigned int Pause:1;            // разрешение паузы до выполнения шага
'    unsigned int ColdWaterGate:1;    // разрешение клапана подачи холодной воды
'    unsigned int HotWaterGate:1;     // разрешение клапана подачи горячей воды
'    unsigned int RecycledWaterGate:1;// разрешение клапана подачи рециркулированной воды
'    unsigned int Rotation:1;          // вращения во время налива
'    unsigned int Reserved:7;   //
'  } Bits;
С битами так вообще беда в VB6. Нет возможности обратиться по имени к конкретному биту в результате чего в коде появляются магические константы.
Visual Basic
1
2
3
4
5
6
            Case COOL_FAST_FIELD:
 
                Select Case .ComboCell.ListIndex
                    Case 0: RecordCool.Bits = RecordCool.Bits And &HFFDF
                    Case 1: RecordCool.Bits = RecordCool.Bits Or &H20
                End Select
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
16.11.2014, 19:26
Цитата Сообщение от уни Посмотреть сообщение
С битами так вообще беда в VB6. Нет возможности обратиться по имени к конкретному биту в результате чего в коде появляются магические константы.
В чем беда-то? Создал константы с именами битов и значением и обращайся.
0
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 328
Записей в блоге: 1
16.11.2014, 19:40
Не, ну как вариант можно, конечно, но мне было лень, ибо код и так был перегружен. Вот ещё пример:
Visual Basic
1
2
3
4
5
6
7
                Case FILL_ROTATION_FIELD:
 
                    If (RecordFill.Bits And &H100) / &H100 Then
                        .PropertyTable.Text = STRING_YES
                    Else
                        .PropertyTable.Text = STRING_NO
                    End If
Как это упростить? По идее на C можно было бы написать: if ( RecordFill.Bits.Rotation ) {}. В общем, нет операции сдвига и код выглядит немного загадочно для тех, кто слабо владеет битовой арифметикой.

Здесь я точно не знаю как сработает If, поэтому привел значение к варианту: 0 или 1.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
16.11.2014, 20:54
уни, объявляешь Enum с масками:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Option Explicit
 
'  struct {
'    unsigned int Type:4;             // êîä òèïà îïåðàöèè
'    unsigned int Pause:1;            // ðàçðåøåíèå ïàóçû äî âûïîëíåíèÿ øàãà
'    unsigned int ColdWaterGate:1;    // ðàçðåøåíèå êëàïàíà ïîäà÷è õîëîäíîé âîäû
'    unsigned int HotWaterGate:1;     // ðàçðåøåíèå êëàïàíà ïîäà÷è ãîðÿ÷åé âîäû
'    unsigned int RecycledWaterGate:1;// ðàçðåøåíèå êëàïàíà ïîäà÷è ðåöèðêóëèðîâàííîé âîäû
'    unsigned int Rotation:1;          // âðàùåíèÿ âî âðåìÿ íàëèâà
'    unsigned int Reserved:7;   //
'  } Bits;
 
Public Enum Bits
    pType = &HF
    Pause = &H10&
    ColdWaterGate = &H20
    HotWaterGate = &H40
    RecycledWaterGate = &H80
    Rotation = &H100
    Reserved = &HFE0&
End Enum
 
Private Sub Form_Load()
 
    Dim z As Bits
    
    If z And HotWaterGate Then
        ' Åñëè ïîëå HotWaterGate óñòàíîâëåíî
    ElseIf (z And pType) = 4 Then
        ' Åñëè pType ñîäåðæèò 4
    ElseIf z And (Not Rotation) Then
        ' Åñëè ïîëå Rotation ñáðîøåíî
    End If
    
    ' Óñòàíàâàëèâàåì ïîëå Pause
    z = z Or Pause
    ' Ñáðàñûâàåì ïîëå RecycledWaterGate
    z = z And Not RecycledWaterGate
    
End Sub
2
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 328
Записей в блоге: 1
17.11.2014, 08:43
До такого я не додумался: And (Not Rotation). Вообще, я боялся использовать логические операторы, т.к. не знал как они себя ведут при побитовой работе в общем случае, поэтому использовал явные константы для такого шаблона (Not Rotation). Мне интересно было как раз использование одной константы Rotation и для установки бита, и для его сброса. Иначе, как у меня, пришлось бы иметь 2 константы.

Я ещё не пробовал у себя в программе использовать такой вариант, но, думаю, стоит выделить где-то специально такие трюки с побитовыми операциями в VB6.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2014, 11:39
Цитата Сообщение от уни Посмотреть сообщение
Я ещё не пробовал у себя в программе использовать такой вариант, но, думаю, стоит выделить где-то специально такие трюки с побитовыми операциями в VB6.
C++ неявно делает тоже самое.
0
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 328
Записей в блоге: 1
17.11.2014, 12:31
А зачем тогда деление на побитовые и логические операции (|, ||, &, &&)? Их нельзя путать и нужно точно знать чем отличается результат при применении ! и ~.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2014, 12:35
Цитата Сообщение от уни Посмотреть сообщение
А зачем тогда деление на побитовые и логические операции (|, ||, &, &&)? Их нельзя путать и нужно точно знать чем отличается результат при применении ! и ~.
Побитовые операции работают с битами, т.е. 0101 & 0100 = 0100, логические сначала приводят к булевому типу, а потом делают побитовую операцию.
Тоже для VB6
Аналог &&:
Visual Basic
1
If CBool(Z) And CBool(X) Then
Аналог &:
Visual Basic
1
If Z And X Then
0
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 328
Записей в блоге: 1
17.11.2014, 12:42
Я знаю чем они отличаются. В c++ сделаны специальные операции для работы с битами. Потому при кодировании на vb6 у меня и возникли затруднения, т.к. непонятно как то же работает в vb6. Именно из-за неявных преобразований.

В с++ есть ! и ~ и у меня возникает закономерный вопрос: какому из них и когда эквивалентно Not?

Хорошо бы сделать табличку с такими неявными эквивалентными операциями.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2014, 12:44
Цитата Сообщение от уни Посмотреть сообщение
В с++ есть ! и ~ и у меня возникает закономерный вопрос: какому из них и когда эквивалентно Not?
!a = Not CBool(a) возвращает только -1 или 0 (True/False)
~a = Not a возвращает инверсию битов.
0
 Аватар для Апострофф
9909 / 3931 / 742
Регистрация: 11.10.2011
Сообщений: 5,911
20.11.2014, 09:51

Не по теме:

Не проходите мимо

3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.11.2014, 09:51

Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX
Помогите решить следующие задачи: 1.Вычислить адрес верхушки стэка. 2.Вычислить адрес следующей выполняемой программы. 3. Вычислить...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Как сменить IP адрес?
Суть проблемы: никак не могу скинуть IP адрес. Менял и MAC адреса железа, и через командную строку ipconfig /release и ipconfig /renew...

Как сменить IP адрес
день добрый. не подскажите как программно заставить венду сменить IP ?

Передать функции структуру из массива структур или указатель на неё
передать функции структуру из массива структур или указатель на неё в качестве параметра. покажите пример.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru