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

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

13.09.2014, 17:14. Показов 2468. Ответов 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
17.11.2014, 11:39
Цитата Сообщение от уни Посмотреть сообщение
Я ещё не пробовал у себя в программе использовать такой вариант, но, думаю, стоит выделить где-то специально такие трюки с побитовыми операциями в VB6.
C++ неявно делает тоже самое.
0
 Аватар для уни
368 / 146 / 17
Регистрация: 06.03.2010
Сообщений: 327
Записей в блоге: 1
17.11.2014, 12:31
А зачем тогда деление на побитовые и логические операции (|, ||, &, &&)? Их нельзя путать и нужно точно знать чем отличается результат при применении ! и ~.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
17.11.2014, 12:44
Цитата Сообщение от уни Посмотреть сообщение
В с++ есть ! и ~ и у меня возникает закономерный вопрос: какому из них и когда эквивалентно Not?
!a = Not CBool(a) возвращает только -1 или 0 (True/False)
~a = Not a возвращает инверсию битов.
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,907
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
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru