Безопасные указатели25.02.2024, 17:29. Показов 2401. Ответов 22
Метки нет (Все метки)
Всем привет! Давно не писал сюда. Тему указателей, я затрагивал не раз, но желаемого консенсуса не смог достичь из этой темы, а именно безопасных указателей.. Может уместнее сказать линк, поскольку указатель - это и адресс в памяти, а линк наверное более объемлющее понятие, подходящее для переменной ссылочного типа, о чем пойдет речь. Что я имею в виду под безопасным, это такой линк, который можно инициализировать в переменную уровня модуля, и использовать в разных процедурах. Такой линк можно создать с помощью массива , но в случае сбоя или ошибки он непременно вызовет полный краш. В условиях прги на VB6 это не является проблеммой, поскольку скомпилированная программа должна существовать без ошибок, а любая ошибка - так или иначе крах. В VBA немного другая ситуация, там в случае не исправленной ошибки VBA также падает, (также может случиться что-то вроде "потери состояния"), что в общем не должно приводить к краху осноного приложения. Но вот в частности, всеж-таки это проихсодит при наличии лишних указателей в памяти. Однако сегодня внезапно я обнаружил, возможность создать, такие безопасные указатели/линки с помощью типа variant.
Решил я проверить, как работает передача разных переменных в функцию, с аргументами заданными как variant. И как выяснилось довольно не плохо работает. Как выясниось variant позволяет передавать по ссылке аргументы любого (стандартного) типа (Byte, Integer и т.д.). Я раньше задумывался над тем, как в VB реализовать аргумент по типу As Any, и можно сказать Variant в какой-то мере позволяет это сделать. Также, можно создать ссылку-указатель на уровне модуля и использовать ее в разных процедурах и при случае сбоя или ошибки, она не вызовет полный крах приложения. Есть, конечно нюансы. Вариантные пременные-ссылки должны быть в стеке, т.е. передаваться как аргументы,в ином случае ссылка слеатает. Другой нюанс в ниже приведенном коде. Ключевое действие происходит в процедуре "Пример" и "testtest". После строчки "vPtr1 = StrPtr(s) + 2 * 2" если в переменной vPtr2 поменят код символа, то должна меняться 3я буква в строке "s". В 32bit работат, в x64 почему-то нет, надеюсь на комментарии
2
|
||||||
| 25.02.2024, 17:29 | |
|
Ответы с готовыми решениями:
22
Безопасные скрипты Безопасные пути безопасные среды |
| 26.02.2024, 02:19 [ТС] | ||||||
|
Для краткого понимания сути темы можно привести такой макрос. При его пошаговом исполнении можно увидеть, что значения одновременно меняютс в двух переменных i и v. Причем, как уже говорилось выше variant должен быть прописан в стеке аргументов, иначе "волшебство" не работает.
1
|
||||||
| 26.02.2024, 10:23 | |
|
testuser2, большое спасибо за проделанную работу!
![]() Сейчас нет времени изучить, но я вернусь к теме, как смогу.
1
|
|
| 26.02.2024, 12:44 [ТС] | ||||||||||||
|
Jack Famous, привет! Тема указателей, конечно не простая и немного запутаная и еще, что я заметил, на VBA x64 VBA есть не мало припонов, в сравнении, с x32 vba/vb6, всякие ptrsafe, более медленные winapi и т.д. Кстати вот еще один недостаток нашелся.
1
|
||||||||||||
| 26.02.2024, 15:30 [ТС] | |||||||
|
Все, "безопасные указатели" заработали и на VBAx64! В коде из #1 следует поменять строчки (см. 14 и 23).
Работать работает, однако переносимость кода страдает..
1
|
|||||||
|
Испарился
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 02.03.2024, 13:12 | |
|
0
|
|
| 02.03.2024, 16:02 [ТС] | ||||||||
|
Добавлено через 1 час 21 минуту Касаемо сабжевой темы, к ней можно было бы подойти с другого ракурса, т.е. поставить вопрос по другому, допустим: "как боротьс с потерей состояния". Недавно узнал как это вообще называется "потеря состояния" по простому просто - полное обнуление переменных. Происходит это при явной или даже неявной ошибке или если просто нажать стоп (reset) в vba-редакторе (вопрос конечно чито vba-шный). Идеальным решением было бы сохранение отдельных (не обязательно все, а допустим некоторых глобальных) переменных от такого стирание. Кстати говоря , я, видел такую возможно, когда баловался с потоками на vba, что если запущен поток и он использует какую-то глобальную переменную, и в этот момент нажать "стоп" (поток при этом не останавливается), то данная переменная не обнуляется. Т.н. "сборщик мусора" ее не трогает. Но с потоками тема, конечно не надежная. Кстати говоря(2), я видел возможность защитить данные от "потери состояния" с одной оговоркой, что эти данные должны быть помещены в объект (допустим коллекцию или словарь). Объект при том должен быть зарегистрированого в системе класса, т.е. внутренний vba-шный класс не поканает в д.сл. Хороший пример на stackoverflow. Функция GetPersistentDictionary - там используются взможности dotnet (mscoree). Я сделал свою версию, более универсальную (под любой объект) и вместо mscoree используются похожий опционал Shell.Application Кликните здесь для просмотра всего текста
Добавлено через 16 минут Выше приведенным кодом можно сохранить объект (и все данные в нем) и восстановить ссылку на него после "обнуления", но это не решает, конено вопрос со стеком переменных..
1
|
||||||||
|
Испарился
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|||
| 02.03.2024, 18:07 | |||
|
Даже я помню, как ещё в школе учили правописание приставки Без, Бес в зависимости от того следующая буква будет глухая или звонкая... Добавлено через 3 минуты Добавлено через 5 минут Есть же SetEnvironmentVariable и GetEnvironmentVariable функции если тебе нужно запоминать переменные надолго, даже после остановки проекта...
0
|
|||
|
Испарился
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 04.03.2024, 00:22 | |
|
testuser2, хз
0
|
|
| 05.03.2024, 16:41 [ТС] | |||||||||||
|
Пару слов стоит сказать, о строковых ссылках, т.е. об ссылках, которые создаются подменой указателя строковой переменной. Это, можно сказать, не безопасные указатели. Однако есть один случай, когда они становятся абсолютно безопасными - в строковом массиве, если в его структуре установить флаг FADF_HAVEVARTYPE. В примере на строку s создается ссылка в строковом массиве, по окончании процедруры массив уничтожается, но строка остается не вредимой, при том, что абсолютно ни чего не предринимается для освобождения лишних указателей. Если убрать строки 11, 12 ситуация будет иная.
3
|
|||||||||||
|
Испарился
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 06.03.2024, 13:33 | |
|
testuser2, меня кстати иностранный форум поздравил с днём рождения и даже подарил бесплатные книги, а этот форум не поздравляет
0
|
|
|
Испарился
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 06.03.2024, 22:08 | |
|
testuser2, книги вот такие:
* Полное руководство по облачным вычислениям * Понимание терминов облачных вычислений * Введение в HTML5
1
|
|
| 08.03.2024, 12:14 [ТС] | ||||||
|
Универсальный делатель вариантных ссылок. Возможно что-то не учел, но учел даже тип decimal, который в VB поддерживается только внутри варианта, оказывается на него тоже можно сделать ссылку и изменять значение по этой ссылке, при том, без использования функции CDec(), как при обычном присвоении.
0
|
||||||
|
Испарился
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 08.03.2024, 15:16 | |
|
0
|
|
| 08.03.2024, 15:33 [ТС] | |||||||
|
Добавлено через 14 минут Я если честно, сам не знаю, что за тип такой децимал, вроде бы для более точных вычислений. Такая структура у него
1
|
|||||||
| 08.03.2024, 15:33 | |
|
Помогаю со студенческими работами здесь
20
Безопасные запросы по АПИ Самые безопасные оптимизаторы и деинсталляторы Какие ЖК мониторы сейчас самые безопасные? Динамическое программирование: найти безопасные пути для кузнечика Указатели и указатели на указатели, а также типы данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|