Аналог Erase для одиночной структуры (юзертайпа)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Аналог Erase для одиночной структуры (юзертайпа)

Сообщение 0xy » 21.08.2016 (Вс) 6:27

Есть ли такое в VB 5--6?
("одиночной"--в слысле, не массива).

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

Re: Аналог Erase для одиночной структуры (юзертайпа)

Сообщение ger_kar » 21.08.2016 (Вс) 11:50

Встроенного нет, но можно сделать на основе вызова WinAPI функции RtlFillMemory
Код: Выделить всё
Declare Sub RtlFillMemory Lib "kernel32.dll" (ByRef Destination As Any, ByRef Length As Long, ByVal Fill As Byte)
Бороться и искать, найти и перепрятать

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

Re: Аналог Erase для одиночной структуры (юзертайпа)

Сообщение Хакер » 21.08.2016 (Вс) 13:45

ger_kar писал(а):но можно сделать на основе вызова WinAPI функции RtlFillMemory

Мимо.
Во-первых, вместо RtlFillMemory есть RtlZeroMemory.
Во-вторых, Erase не просто зануляет память, а перед этим освобождает все нескалярные члены структуры: для массивов — уничтожается SAFEARRAY, для строк вызывает SysFreeString, для вариантов — VariantClear, для объектов — IUnknown::Release.

Встроенного аналога нет, но можно получить очень близкое его подобие. Достаточно написать функцию, возвращающую структуру, но на деле возвращающую ничего:
Код: Выделить всё
Function MakeCleanStruct() As SOME_STRUCT
End Function


И в моменты, когда нужна зачистка, делать присвоение:
Код: Выделить всё
MyUdr = MakeClearStruct()


На каждую структуру, понятное дело, понадобится отдельная функция.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Аналог Erase для одиночной структуры (юзертайпа)

Сообщение Mikle » 21.08.2016 (Вс) 14:58

Хакер писал(а):Достаточно написать функцию, возвращающую структуру, но на деле возвращающую ничего

Красиво. Я сразу и не догадался.

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

Re: Аналог Erase для одиночной структуры (юзертайпа)

Сообщение ger_kar » 21.08.2016 (Вс) 21:30

Но при таком раскладе можно и без функции обойтись, достаточно объявить пустую переменную с типом этой структуры и просто делать её присвоение.
А можно оформить в виде процедуры, куда передавать очищаемую переменную. Например так:
Код: Выделить всё
Sub MakeCleanStruct(x As SOME_STRUCT)
    Dim y As SOME_STRUCT : x = y
End Function


Хакер писал(а):Во-вторых, Erase не просто зануляет память, а перед этим освобождает все нескалярные члены структуры: для массивов — уничтожается SAFEARRAY, для строк вызывает SysFreeString, для вариантов — VariantClear, для объектов — IUnknown::Release.

Ну, а если структура содержит только скалярные типы, то можно и функции RtlFillMemory и RtlZeroMemory заюзать
Бороться и искать, найти и перепрятать

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

Re: Аналог Erase для одиночной структуры (юзертайпа)

Сообщение Хакер » 21.08.2016 (Вс) 21:52

ger_kar писал(а):Но при таком раскладе можно и без функции обойтись, достаточно объявить пустую переменную с типом этой структуры и просто делать её присвоение.

Функция — лучше, просто из-за того, что она гарантирует генерацию чистой структуры. В случае же с переменной нет силы, препятствующей случайному изменению подобной переменной (ибо нет квалификатора const как в C/C++). А значит с переменной мы имеем мину — случайная модификация подобной переменной приведёт к трудно-отлавливаемой ошибке, когда вместо предполагаемого зануления будет происходить нечто неправильное.

ger_kar писал(а):Ну, а если структура содержит только скалярные типы, то можно и функции RtlFillMemory и RtlZeroMemory заюзать

И это тоже мина, потому что потом приходит Вася и думает: ничего не должно сломаться, если я просто добавлю в структуру новое поле, ведь остальное код про него не знает и не обращается к нему. Вася не знает, что где-то в коде (возможно в одном месте, а возможно и в 1000 местах) применён неуниверсальные негибкий способ зачистки, который полагается на предположение, в структуре нет не-скалярных членов и никогда не появится.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList