Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

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

13.09.2014, 17:14. Показов 2534. Ответов 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
Сообщений: 327
Записей в блоге: 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
Сообщений: 327
Записей в блоге: 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
Сообщений: 327
Записей в блоге: 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
Сообщений: 327
Записей в блоге: 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
Сообщений: 327
Записей в блоге: 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
Сообщений: 327
Записей в блоге: 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
 Аватар для Апострофф
9908 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru