Как найти все переменные в программе

Having answered a similar question before, I’ll paste the relevent bits here:

For help finding things in the current namespace, check out the
pprint library, the dir builtin, the locals builtin,
and the globals builtin.

Please note that functions do not have any variables in existence until the actually run. See JBernardo’s answer for getting to the variables within compiled functions. For example:

>>> def test():
...     i = 5
...
>>> locals()
{'argparse': <module 'argparse' from 'c:python27libargparse.pyc'>, '__builtins__': <module '
__builtin__' (built-in)>, '__package__': None, 'i': 5, 'test': <function test at 0x02C929F0>, '
__name__': '__main__', '__doc__': None}
>>> dir(test)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__',
 '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__',
 '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'fu
nc_dict', 'func_doc', 'func_globals', 'func_name']
>>>

See how the test function is located in the local namespace. I’ve called dir() on it to see interesting contents, and the i variable is not listed. Compare that to a class declaration and object creation:

>>> class test():
...     def __init__(self):
...          self.i = 5
...
>>> s = test()
>>> locals()
{'argparse': <module 'argparse' from 'c:python27libargparse.pyc'>, '__builtins__': <module '
__builtin__' (built-in)>, '__package__': None, 'i': 5, 's': <__main__.test instance at 0x02CE45
08>, 'test': <class __main__.test at 0x02C86F48>, '__name__': '__main__', '__doc__': None}
>>> dir(s)
['__doc__', '__init__', '__module__', 'i']
>>>

Finally, notice how this does not say if these items are variables, constants, functions, or even classes declared inside the class! Use at your own risk.

У меня есть несколько переменных в названиях которых фигурирует слово (‘string’). Количество переменных заранее не известно, но для примера рассмотрим количество 5. Я хочу у всех существующих переменных с названием ‘string’ сделать реплейс. Я попробовал найти все эти переменные через цикл

for i in globals():
    if 'string' in i:

Я получаю все нужные мне переменные, но сделать реплейс я в них не могу. Есть варианты как это сделать?)

Correct_SubNetwork = 'www'
Correct_MEID = 'xxx'
Correct_ENBFunctionFDD = 'zzz'
Correct_EUtranCellFDD_1 = 'yyy'


test_string1 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string2 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string3 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string4 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string5 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'


for i in range(1):          # цикл создан для того, чтобы добавить значение i в globals()
    print(i)

for i in globals():
    if 'string' in i:
        i = i.replace('%SubNetwork%', Correct_SubNetwork)
        i = i.replace('%MEID%', Correct_MEID)
        i = i.replace('%ENBFunctionFDD%', Correct_ENBFunctionFDD)
        print(i)

Отвечая на аналогичный вопрос до этого, я вставлю здесь соответствующие биты:

Чтобы найти информацию в текущем пространстве имен, ознакомьтесь с библиотека pprint, встроенный каталог, локальные жители, встроенные, и глобальные значения встроены.

Обратите внимание, что функции не имеют никаких переменных, существовавших до фактического выполнения. См. ответ JBernardo для перехода к переменным в скомпилированных функциях. Например:

>>> def test():
... i = 5
...
>>> locals()
{'argparse': <module 'argparse' from 'c:python27libargparse.pyc'>, '__builtins__': <module '
__builtin__' (built-in)>, '__package__': None, 'i': 5, 'test': <function test at 0x02C929F0>, '
__name__': '__main__', '__doc__': None}
>>> dir(test)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__',
'__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__',
'__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'fu
nc_dict', 'func_doc', 'func_globals', 'func_name']
>>>

Посмотрите, как тестовая функция находится в локальном пространстве имен. Я набрал dir() на нем, чтобы увидеть интересное содержимое, а переменная i не указана. Сравните это с объявлением класса и созданием объекта:

>>> class test():
... def __init__(self):
... self.i = 5
...
>>> s = test()
>>> locals()
{'argparse': <module 'argparse' from 'c:python27libargparse.pyc'>, '__builtins__': <module '
__builtin__' (built-in)>, '__package__': None, 'i': 5, 's': <__main__.test instance at 0x02CE45
08>, 'test': <class __main__.test at 0x02C86F48>, '__name__': '__main__', '__doc__': None}
>>> dir(s)
['__doc__', '__init__', '__module__', 'i']
>>>

Наконец, обратите внимание, как это не говорит, являются ли эти элементы переменными, константами, функциями или даже классами, объявленными внутри класса! Используйте на свой страх и риск.

 
Miralex
 
(2003-08-27 14:00)
[0]

У меня такая проблема:

хендл програмы я нашел а как найти область памяти, где ета программа хранит свои переменные?

Как получить список етих переменных и их значения?

И как работать с ними?


 
HolACost!
 
(2003-08-27 14:02)
[1]

нет переменных в откомпилированной программе – не существует их там!


 
Digitman
 
(2003-08-27 14:08)
[2]



> Miralex

никак игрушку какую-нить “ломаешь” ?)


 
BillyJeans
 
(2003-08-27 14:11)
[3]

можно найти адрес, где лежит значение. проблема в том, что адрес выдается динамически, и постоянно в одном месте ты значение не найдешь.


 
Miralex
 
(2003-08-27 14:11)
[4]

Блин ну както делают програмы, которые в памяти ишут переменные в конкретных приложениях (играх)!

Например есть ArtMoney , которая ищет в приложениях перемееные и отображает их значения с возможностью их заморозки и изменения!

мне надо пример похожий по функциям на ArtMoney!


 
Miralex
 
(2003-08-27 14:14)
[5]



> Digitman © (27.08.03 14:08) [2]

>

> > Miralex

>

>

> никак игрушку какую-нить “ломаешь” ?)

Если б игрушку то артмоней мне б хватило!


 
HolACost!
 
(2003-08-27 14:15)
[6]

Было уже тут такое – это не ты был!

Эти проги просто сканируют адресное пространство проги и ижат значения нужные! Всё!!! Если ты заметил – арт мани тебе не пишет – переменная money – она выдаёт адрес!


 
Digitman
 
(2003-08-27 14:34)
[7]



> Miralex

ну хорошо

а если бы речь шла о твоем собственном (работающем в данный момент времени) приложении, то, надо понимать, в ходе его работы получть список всех переменных для тебя не составляет труда ?


 
Miralex
 
(2003-08-27 14:37)
[8]



> Digitman ©



если мое приложение – то список мне ненужен!

я и так знаю какие я использую переменые!



> в ходе его работы получть список всех переменных



вот и хочу узнать как в ходе работы получить список переменых другой программы!


 
Miralex
 
(2003-08-27 14:38)
[9]



> HolACost! © (27.08.03 14:15) [6]

> Было уже тут такое – это не ты был!

> Эти проги просто сканируют адресное пространство проги и

> ижат значения нужные! Всё!!! Если ты заметил – арт мани

> тебе не пишет – переменная money – она выдаёт адрес!

а ссылочку на пример такой проги можешь дать?

Я просто рылся и ничего не могу найти! 🙁


 
HolACost!
 
(2003-08-27 14:40)
[10]

Ты нашёл адрес процесса – так и начал его сканировать по 1, 2, 4 байта – другие значения врятли найдёшь, но конечно можно! Типовой поиск подстроки в строке!


 
Digitman
 
(2003-08-27 14:42)
[11]



> вот и хочу узнать как в ходе работы получить список переменых

> другой программы!

никак) … ни в своем ни в чужом !)


 
Miralex
 
(2003-08-27 14:46)
[12]



> HolACost!

а как найти етот адресс процесса?

Я так понял надо найти область в памяти которую занимает етот процесс!

а как ето сделать?

как найти где начинаються возможные его данные, где заканчиваються?


 
Digitman
 
(2003-08-27 14:53)
[13]



> Digitman

предположим, ты получил список из десятка тысяч адресов в чужом ВАП, по которым на момент поиска обнаружены, к примеру, искомые 4-байтовые значения … дальше что ?


 
Miralex
 
(2003-08-27 14:59)
[14]



> Digitman

я знаю что програма хранит переменные в определеном порядке в области памяти, которая выделяет ей винда!

Мне надо найти ету область памяти и просканировать и найти там свои переменные!

и далее отслеживать их изменение!….

а как найти саму область ету?

и как с ней работать?


 
Digitman
 
(2003-08-27 15:03)
[15]



> програма хранит переменные в определеном порядке в области

> памяти, которая выделяет ей винда

вот здесь поподробней …

что за “определенный порядок” ?

каким образом “выделяет ей винда” ?



> далее отслеживать их изменение

как ты себе это видишь ? по таймеру что ли ?


 
HolACost!
 
(2003-08-27 15:29)
[16]

Mission Impossible III or Terminator and Programmer!


 
Miralex
 
(2003-08-27 15:32)
[17]



> > програма хранит переменные в определеном порядке в области

>

> > памяти, которая выделяет ей винда

>

>

> вот здесь поподробней …

Я наскока понял что когда ты обьявляешь переменные , то они в том же порядке фиксируються в памяти, когда выполняеться программа!

Если программа одна и таже, то один раз можно найти ету переменую и потом знать где она будет уже лежать!



> > далее отслеживать их изменение

>

>

> как ты себе это видишь ? по таймеру что ли ?



Также как и в Artmoney


 
Miralex
 
(2003-08-27 15:37)
[18]



> > Digitman

>

>

> предположим, ты получил список из десятка тысяч адресов

> в чужом ВАП, по которым на момент поиска обнаружены, к примеру,

> искомые 4-байтовые значения

Вот как етот список получить? зная тока хендл программы!


 
Anatoly Podgoretsky
 
(2003-08-27 15:46)
[19]

Этот список хранится отдельно от программы в мап файле, если конечно он есть.


 
Digitman
 
(2003-08-27 15:58)
[20]



> Я наскока понял

неправильно ты понял)

к тому же откуда ты знаешь, как, в каком порядке и в каких модулях программист, разрабатывавший “чужое” приложение, объявлял “переменные” ? и в какую секцию поместил линкер ее ? и поместил ли вообще ?

ко всему прочему, почему бы искомой “переменной” не быть локальной ? это же тоже “переменная” ! А время жизни лок.переменной равно времени жизни подпрограммы, ее использующей

а если адрес искомой переменной лежит в другой переменной указательного типа ? память-то под первую вполне может выделяться и динамически !

в общем так – раз ты кроме слова “переменная” видеть и знать ничего не желаешь, разбирайся сам и пляши от OpenProcess(), VirtualQueryEx(), VirtualProtectEx(), AdustTokenPrivelegies(), ReadProcessMemory(), WriteProcessMemory()


 
Miralex
 
(2003-08-27 16:11)
[21]



> Digitman

ну а как мне устроить поиск значения по всем местам где может быть ето значение в памяти программы?

Есть какойто готовый модуль типа как в АртМоней?


 
Digitman
 
(2003-08-27 16:35)
[22]

перебирай регионы циклическими вызовами VirtualQueryEx(), считывай существующие регионы вызовами ReadProcessMemory() и сканируй прочитанную копию в своем адресном пр-ве как тебе уже вздумается


 
Miralex
 
(2003-08-28 10:06)
[23]

Если честно – ничего не понял!

Обьясните пожалуйста поподробнее!

Ктото может кинуть готовый код чтоб я разобрался?


 
denny
 
(2003-08-28 14:03)
[24]

Вобще судя по всему ты очен зеленый новичек (не обижайся но это видно по рассуждению о переменных и их способам хранения), а эта задача очень сложная даже для хорошего профи!!! Так что не думаю, что если АртМани не справляется то код написанный табой справится.

Не трать время на собственный код, лучше попробуй с другого “входа”. Поищи готовые программы. Но это лучше делать в других форумах


 
Jeer
 
(2003-08-28 14:34)
[25]

Мда..

Готовое бывает только у мамми на кухне.


 
Digitman
 
(2003-08-28 14:38)
[26]



> Miralex





> Если честно – ничего не понял

что конкретно не понял ? ты разбирался вообще с назначением упомянутых ф-ций и назначением их параметров/результатов ?



> Обьясните пожалуйста поподробнее

Задавай предметный вопрос – объясним.



> кинуть готовый код чтоб я разобрался

в чем конкретно ? в последовательности вызовов тех или иных ф-ций ? а смысл ? если тебе в принципе не понятно пока применение той или иной ? ведь лавину вопросов вызовет любой такой “пример” !


 
Miralex
 
(2003-08-28 15:48)
[27]

С применение тех функций вроде чуток разобрался! Но так и не понял как с помошью них например найти мне область данных в памяти нужной программы?

Если кто может напишите мне кусок кода где бы по хендлу находились в памяти и грузились во “что-то” данные нужной программы!


 
Digitman
 
(2003-08-28 16:05)
[28]



> Но так и не понял

значит ты не понял, что делает ReadProcessMemory()

она – ключевая среди прочих указанных.

вникни в назначение этой ф-ции ! она скопирует из чужого ВАП в твое ВАП любой доступный участок памяти чужого процесса, после чего в копии можно любым удобным способом искать все что тебе вздумается и как вздумается


 
Miralex
 
(2003-08-29 10:45)
[29]

Вот по функции ReadProcessMemory() у меня и есть пару вопросов:

ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfByte sRead);

Значит начинаем подробно:

hProcess – хендл

lpBaseAddress – начальный адресс

lpBuffer – буфер куда будем загонять данные!

nSize количество копируемых байтиков

lpNumberOfBytesRead – не понял для чего!

А теперь вопросы:

lpBaseAddress – откуда он береться? как узнать начальный адресс где программа хранит данные? и как узнать ее конечный адресс?

lpBuffer – как с ним работать?

lpNumberOfBytesRead – что ето такое?

Мне надо будет копировать все данные и обрабатывать!

Как их правильно копировать в буфер? все сразу или по кускам размером например в 2 байта?


 
Тутошний Начальник
 
(2003-08-29 11:09)
[30]



> nSize количество копируемых байтиков

> lpNumberOfBytesRead – не понял для чего!

параметром nSize ты указываешь, сколько байт начиная с адреса lpBaseAddress ты желал бы прочитать

параметром lpNumberOfBytesRead ты указываешь системе адрес переменной типа Integer в

своей

программе, куда ф-ция ReadProcessMemory() в ходе своей работы вернет число байт,

реально прочитанных

начиная с указанного тобой адреса

т.е . по разным причинам реально прочитанное число байт будет меньше или равно тому числу байт, которое ты запрашиваешь параметром nSize



> lpBaseAddress – откуда он береться?

берется он из результата работы вызываемой

перед

этим ф-ции VirtualQueryEx().



> как узнать начальный адресс где программа хранит данные?

> и как узнать ее конечный адресс?

опять же – см. ф-цию VirtualQueryEx(). Она вернет параметры региона, в диапазон которого входит переданный ей параметром адрес : базовый адрес региона, размер региона, число страниц в регионе, статус региона и пр.

получая эти результаты циклическим вызовом VirtualQueryEx() (первый вызов – с параметром lpAddress = nil, тот же параметр для последующих вызовов ф-ции зависит от результата предыдущих, т.е. вычисляемый на базе ранее полученного адреса, размера и статуса региона) , ты как раз и имеешь базовый адрес и размер области памяти, отведенный под регион. То что имеешь, как раз и передаешь следом в ф-цию ReadProcessMemory() параметрами.

каждый следующий запрашиваемый в цикле регион имеет баз.адрес, равный баз.адресу предыд. региона + размер предыд.региона



> lpBuffer – как с ним работать?

у себя в приложении следует выделить память, размер которой больше или равен размеру того региона, который собираешься считывать. Указатель на этот блок памяти ты передаешь параметром lpBuffer. В эту память ф-ция ReadProcessMemory() скопирует содержание региона, который ты задаешь параметрами баз.адрес + размер


 
Digitman
 
(2003-08-29 11:12)
[31]



> Тутошний Начальник

эк загнул !)


 
Miralex
 
(2003-08-29 13:29)
[32]



> базовый адрес региона, размер региона, число страниц в регионе,

> статус региона и пр



куда мне она ето вернет?

что кроме хендла ей задавать надо и что она после выполнения (и куда) возвращает?

Люди хватит мучать меня!

Кто может – напишите мне пожалуйста код, который будет читать все с памяти и разбирать например по 2 байта!..


 
Polevi
 
(2003-08-29 14:07)
[33]

вот и объясняй после этого.. разжевали все.. и в итоге ДАЙТЕ КОД !

>Miralex

не готов ты еще программировать на таком уровне, возьмись за задачу попроще


 
Digitman
 
(2003-08-29 14:37)
[34]



> Miralex





> куда мне она ето вернет?

>

> что кроме хендла ей задавать надо и что она после выполнения

> (и куда) возвращает?

ты читать умеешь вообще-то ?)

черным же по белому написано в хэлпе :

Parameters

hProcess

Identifies the process whose memory information is queried. The handle must have PROCESS_QUERY_INFORMATION access.

lpAddress

Points to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.

lpBuffer

Points to a MEMORY_BASIC_INFORMATION structure in which information about the specified page range is returned.

dwLength

Specifies the size, in bytes, of the buffer pointed to by the lpBuffer parameter.


 
Digitman
 
(2003-08-29 14:43)
[35]



> Люди хватит мучать меня!

бедняжка !) прямо таки и замучили тебя !)



> напишите мне пожалуйста код

и что ты с ним делать будешь, с кодом ? встретишь там тот же VirtualQueryEx() и будешь лупиться на него как баран на новые ворота, что там за параметры/результаты да зачем да почему ?) И снова засыпать вопросами ? Так на те же самые вопросы ты и сейчас ответ уже получаешь !!


 
Miralex
 
(2003-08-29 14:43)
[36]



> Polevi © (29.08.03 14:07) [33]

> вот и объясняй после этого.. разжевали все.. и в итоге ДАЙТЕ

> КОД !

> >Miralex

> не готов ты еще программировать на таком уровне, возьмись

> за задачу попроще

С задачами попроще вроде тяжелых проблем не возникало!

А вот с памятью никогда не работал! (програмно),..

Организацию памяти я знаю!,..

А насчет неготов: если ничего не пробовать то ничего и не будешь уметь!


 
Digitman
 
(2003-08-29 14:46)
[37]



> Организацию памяти я знаю

какой памяти ? конкретно ?


 
Miralex
 
(2003-08-29 15:00)
[38]



> какой памяти ? конкретно ?



памяти программ!

Точнее сказать как винда выделяет память для программ!


 
Digitman
 
(2003-08-29 15:09)
[39]

в таком случае ты должен четко представлять себе , что есть “виртуальное адресное пространство процесса” (ВАП)

ты должен понимать, что ВАП любого процесса делится на страницы

ты должен понимать, что регион – это группа смежных страниц, имеющих один и тот же статус

ты должен понимать, что непосредственный доступ к “чужому” ВАП из своего ВАП на 3-м уровне привелегий не возможен, и для осуществления этого (в определенных ограниченных пределах) ядро Win32 предоставляет некий механизм в виде набора только что упомянутых ф-ций

что ж тогда вопросы-то задаешь, коль понимаешь все это ?


 
Miralex
 
(2003-08-29 15:15)
[40]

Про ВАП мне как раз все понятно!

Но как програмно реализовать ету мысль!..

Вот над етим я ломаю голову! (((


 

SkyShark

Пользователь

Сообщений: 71
Регистрация: 18.01.2013

#1

01.03.2013 13:21:07

Добрый День!

Искал и по этому форуму и в гугле, но ни чего к сожалению не нашел :(
Вопрос такой, есть скажем в модуле объявленные переменные допустим:

Код
Public WsR as Worksheet
Public i as Integer, j as Long, s as String

К примеру требуется перед завершением выполнения кода получить список всех переменных и очистить их.

Все что смог сделать, это получить имена переменых в текстовом виде.
А вот как обратиться к переменной зная ее текстовое имя или как получить список всех переменных виде самих же переменных, или как очистить/удалить из памяти эту переменную зная ее имя, вот с этим разобраться не могу.
Помогите, пожалуйста! … кто чем может :)

пример моего кода:

Код
Public WsPD As Worksheet
Public Folder2 As Folder
Public NedStart As Date, NedFin As Date
Public z As Byte, FVS As Byte, RN As Byte
Public MagArr()

Sub test()

'Получаем список всех модулей, форм, листов и т.д. в данной книге
For Each iVBcomponent In ThisWorkbook.VBProject.VBComponents
    'Проверяем являеться ли модулем или формой
    If iVBcomponent.Type = 1 Or iVBcomponent.Type = 3 Then
        'Построчно просматриваем часть модуля с объявленными переменными
        For i = 1 To iVBcomponent.CodeModule.CountOfDeclarationLines
            'Разделям по ","
            x = Split(iVBcomponent.CodeModule.Lines(i, 1), ",")
            'просматриваем получившиеся части
            For j = 0 To UBound(x)
                'Разделям по " " и выбираем переменную
                x1 = Split(x(j), " ")(1)

'**********************************************************************
'Выделенная часть на данный момент не имеет смысла, так как x1 всегда будет string содержащий имя переменной

                Debug.Print x1, TypeName(x1)
                'определяем тип переменной
                Select Case VarLife(x1)
                    Case 1
                        Set x1 = Nothing
                    Case 2
                        Erase x1
                    Case 3
                        x1 = ""
                End Select
'*********************************************************************
            Next j
        Next i
    End If
Next

End Sub

Function VarLife(curVariables As Variant) As Byte
    If IsObject(curVariables) Then VarLife = 1: Exit Function
    If IsArray(curVariables) Then VarLife = 2: Exit Function
    VarLife = 3
End Function

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#2

01.03.2013 22:51:10

можно так

Спасибо

 

SkyShark

Пользователь

Сообщений: 71
Регистрация: 18.01.2013

Спасибо за ответ!

На сколько смог понять, Вы предлагаете изначально все переменные создавать как элементы словаря, правильно? В любом случае идея интересная и точно пригодится, но не в данном случае.

Предположим, что это не возможно, то есть мы не можем изменить текущий код и даже не знаем имена всех переменных.
Единственное что можем это либо предложенный мной вариант получения списка имен ввиде текста, либо другие варианты о которых я не знаю.

Может что то из WinAPI? … Хотя на сколько я понял обратиться к переменной напрямую в память по имени нельзя…

Изменено: SkyShark01.03.2013 23:49:33

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#4

01.03.2013 23:18:36

Цитата
SkyShark пишет:
К примеру требуется перед завершением выполнения кода получить список всех переменных и очистить их

А зачем это нужно? После завершения процедуры все ее переменные уничтожаются, память освобождается. Исключение составляют переменные, объявленные как Static, они на самом деле хранятся в модуле и “живут” вместе с переменными уровня модуля, пока модуль загружен в память.
Массивы можно очистить оператором Erase.

Изменено: Казанский01.03.2013 23:19:15

 

SkyShark

Пользователь

Сообщений: 71
Регистрация: 18.01.2013

Может не совсем корректно выразился. Код не завершается, а идет ожидание действий пользователя при этом все переменные продолжают существовать и как результат занимают память. Конечно можно не обращать внимания скажем на переменные byte, long, Boolean и т. д. при текущих гигобайтных объемах памяти, но все таки это не совсем правильно.

Плюс ко всем, чем не вариант проверки всех переменных и скажем в случае обнаружения в памяти: 4-х объектов, 5-ти целых и 8-и строковых переменных объявленных и не очищенных в результате работы кода, завершить программу или выдать сообщение.

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#6

02.03.2013 00:16:03

Цитата
SkyShark пишет:
Код не завершается, а идет ожидание действий пользователя при этом все переменные продолжают существовать и как результат занимают память

я, например знаю, что делается с той или иной переменной в определенном участке кода, во время его исполнения.

Спасибо

 

SkyShark

Пользователь

Сообщений: 71
Регистрация: 18.01.2013

Я тоже знаю, или стараюсь знать и понимать, но дело ни в этом.

Моих знаний просто не хватает что бы решить эту задачу, и даже не знаю в каком направлении искать решение. Можете считать это навязчивой идеей, но хочется все таки найти способ реализации :)

 

Юрий М

Модератор

Сообщений: 60700
Регистрация: 14.09.2012

Контакты см. в профиле

А в чём сверхзадача – у Вас недостаточно физической памяти?

 

SkyShark

Пользователь

Сообщений: 71
Регистрация: 18.01.2013

Памяти хватает, хотя железо встречается разное и бывает удивляет своей “новизной” ;)

Интересен сам принцип подобного обращения к переменным зная только имя переменной, которое хранится ввиде текстовой строки.

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

#10

13.03.2013 12:11:21

Цитата
SkyShark пишет:
а идет ожидание действий пользователя при этом все переменные продолжают существовать и как результат занимают память

экономия на спичках

Цитата
SkyShark пишет:
Интересен сам принцип подобного обращения к переменным зная только имя переменной, которое хранится ввиде текстовой строки
Цитата
R Dmitry пишет:

Код
Public Dict As Object
Sub LoadVar()
Set Dict = CreateObject("scripting.dictionary")
With Dict
.Add "testA", "String"
.Add "testB", 1
.Add "testC", Array(1, 2, 3)
End With
End Sub
Sub tst()
Debug.Print Dict("testA")
Debug.Print Dict("testB")
Debug.Print Join(Dict("testC"), ",")
Set Dict = Nothing
test
On Error Resume Next
Debug.Print Dict("testA")
Debug.Print Dict("testB")
Debug.Print Join(Dict("testC"), "==")
End Sub

Изменено: nerv13.03.2013 12:12:42

Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина – самый громкий звук
https://github.com/nervgh

Добавить комментарий