|
|
||||||||||||||||||||||||||
Как скопировать структуру или сменить указатель новой переменной на ее адрес13.09.2014, 17:14. Показов 2497. Ответов 33
Метки нет (Все метки)
Здравствуйте!
У меня есть структура вида:
1) скопировать структуру через какую-нибудь CopyMemory. 2) сменить указатель переменной SI на адрес структуры BIDS(0).arr(0) Примерно так я это представляю.
0
|
||||||||||||||||||||||||||
| 13.09.2014, 17:14 | |
|
Ответы с готовыми решениями:
33
Как из компонента ActiveX вернуть указатель на структуру или класс
|
|
Модератор
|
|||||||
| 13.09.2014, 17:55 | |||||||
Сообщение было отмечено Dragokas как решение
Решение
Также можно сменить указатель на структуру, об этом можешь почитать тут.
2
|
|||||||
|
|
|
| 18.09.2014, 02:24 [ТС] | |
|
А вот можно ли скопировать байтовый массив поверх структуры ?
Т.е. таким образом, чтобы не нужно было вручную заполнять по полям. По сути, я считываю файл, создаю структуры согласно спецификации типа файла и накладываю куски считанных данных на эти структуры.
0
|
|
|
Модератор
|
|||
| 18.09.2014, 02:28 | |||
|
1
|
|||
|
|
||||||
| 18.09.2014, 03:19 [ТС] | ||||||
|
Ух ты. Я и не предполагал, что барсик на столько умный ))
0
|
||||||
|
|
|||||||
| 15.11.2014, 23:32 [ТС] | |||||||
|
The trick, можешь, пожалуйста, написать простой пример,
как создать массив указателей на уже созданные объекты, так чтобы затем через For Each можно было переназначить эти ссылки на адрес нового объект. Вот здесь в коде у меня в массиве дублируется объект, а нужно работать через ссылки.
0
|
|||||||
|
Модератор
|
|||
| 15.11.2014, 23:56 | |||
|
0
|
|||
|
Модератор
|
||
| 16.11.2014, 00:41 | ||
|
Если ты хочешь ссылаться по двойной ссылке, то нужен еще промежуточная переменная для хранения ссылки на целевой объект. Если, как ты говоришь есть адреса, то можно через __vbaObjSetAddref присвоить объектной переменной ссылку на объект по адресу, но это излишне.
0
|
||
|
|
|
| 16.11.2014, 01:02 [ТС] | |
|
Поясню на практической задаче.
Делаю сортировку словаря методом, описанным мною здесь: Сортировка словаря методом реконструкции Использовать решения из той темы мне нет резона, так как реально сортировка у меня будет нестандартная и многоэтапная (словарь всего лишь указывает на данные, которые будут браться за основу для сортировки), поэтому используется промежуточный словарь (элементов совсем немного). *1 - В той теме я присваиваю исходной переменной ссылку на новый объект ("промежуточный словарь" с отсортированными данными). Но реально, мне нужно таким же образом отсортировать много словарей. А они создавались не как массив объектов, а как отдельные объектные переменные (*2). Поэтому мне надо их как-то собрать в массив. Но с эл-тами массива такой фокус (см. *1) не получается, т.к. ссылка на объект меняется у переменной массива, а не каждой отдельной исходной объектной переменной (*2).
0
|
|
|
Модератор
|
||||||
| 16.11.2014, 01:16 | ||||||
|
Dragokas, я понял тебя.
Примерно так
0
|
||||||
|
|
|||||||||||
| 16.11.2014, 02:09 [ТС] | |||||||||||
|
Конечно, есть и альтернативный способ - не сортировать словарь вообще:
в функции сортировки создавать для каждого словаря массив, который будет хранить порядок чтения эл-тов словаря. И когда его нужно будет его прочесть, то пользоваться не
Но тогда со словарями всегда придется как-то тягать для каждого свой массив позиций. Добавлено через 7 минут The trick, хм..., да, вполне можно и перечислить все их имена как параметры функции сортировки, не собирая в массив. Спасибо. Добавлено через 44 минуты Единственная огласка для тех, кто читает тему: чтобы у всех переданных переменных (у нас - это p, q) сменить ссылку на другой объект, находясь в функции Foo, нужно использовать цикл не "For...each", а конструкции вида:
0
|
|||||||||||
|
|
||||||
| 16.11.2014, 17:50 | ||||||
|
Не знаю в тему это или нет, но есть такой способ работы с указателями на структуру:
Я не знал, что можно сложные вещи и массивами делать, как тут The trick показывал, поэтому в своей программе, там где нужны были указатели на пользовательские структуры, я использовал вспомогательные функции и трюк со стеком.
0
|
||||||
|
Модератор
|
||||||
| 16.11.2014, 18:03 | ||||||
|
Если требуется только чтение, то можно сделать через Variant'ы так -
1
|
||||||
|
|
|
| 16.11.2014, 18:03 | |
|
По началу сложно, да. Если найду описание, то дам ссылку. Дело вот в чём. Предположим, что у нас в памяти есть массив элементов пользовательского типа. Мы знаем адрес, с которого он начинается, нам нужен указатель на элемент массива такой, чтобы мы могли работать с идентификатором как с переменной. Т.е. мы объявляем "типизированный указатель", который у нас есть в памяти (ByRef RecordFill As TYPE_WPC_FILL) и присваиваем RecordFill адрес нужного участка памяти: PutMem4 VarPtr(begin_of_pointers) + 4, ByVal StepPointer
После этой конструкции внутри вспомогательной функции мы можем напрямую работать с этим участком памяти через пользовательскую переменную RecordFill, как показано выше.
1
|
|
|
|
|
| 16.11.2014, 18:31 | |
|
Да, именно через стек, очень просто и красиво получается. Не нужно ничего лишнего, кроме вспомогательной функции, где одним из параметров должна быть маркированная переменная (&0), она используется для вычисления адреса нужного "типизированного указателя". Можно через запятую указать больше таких "указателей" на разные пользовательские типы.
Добавлено через 22 минуты Я, кстати, не помню почему Хакер делал это именно таким образом. У него там целая статья была с разъяснениями.
0
|
|
| 16.11.2014, 18:31 | |
|
Помогаю со студенческими работами здесь
20
Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX Как получить ссылку на указатель или указатель на указатель в массиве? Как сменить IP адрес? Как сменить IP адрес
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|