Что нового

Удаление переменной

Атос

Новичок
Сообщения
85
Репутация
0
Привет.

А возможно ли, уничтожить уже объявленную переменную? Полностью.
Чтобы она была не просто пустая, а чтобы она исчезла из сегмента памяти, в котором хранятся объявленные переменные.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Атос [?]
чтобы она исчезла из сегмента памяти, в котором храняться объявленные переменные
А можно поподробнее, что это за сегмент такой? И как вы узнаёте, есть в нём переменная или нет?
 
Автор
А

Атос

Новичок
Сообщения
85
Репутация
0
Вот у меня есть функция. В определённый момент, при совпадении условий, я объявляю глобальную переменную.
Уже другая функция проверяет, объявлена ли эта переменная, или нет.
И в зависимости от этой проверки, выполянет одно из действий.
Ну так вот. Я хочу, при определённых условиях уничтожать эту переменную, чтобы та функция,
которая проверяет наличие этой переменной выполняло нужное мне действие.

Возможно ли разинициировать имя переменной?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Значит так.
Глобальную переменную нужно объявить сразу, в начале скрипта.
Функция, которая у вас создаёт переменную, должна присваивать этой переменной значение.
Функция, которая у вас проверяет наличие переменной, должна проверять значение этой переменной.
Всё.

разинициировать
Слова-то какие мудрёные :stars:
Освободить память, выделенную под переменную, в AutoIt нельзя.
 

Norm

Продвинутый
Сообщения
278
Репутация
74
Вы правы InnI, удалить глобальную переменную не получится.
Вы знаете так же, что лучшим способом обойти это, это "перезаписать" её, присвоить 0 или "".
Это очень полезно при обнулении массивов или больших строковых Glob. переменных.

При создании GUI с большим количеством элементов приходится создавать много глобальных (особенно в режиме Opt("GUIOnEventMode", 1) ),
поскольку к ним нужно обращаться в разных функциях.
Таких переменных в большом проекте может насобираться очень много.
В этих переменных хранятся лишь ID и поэтому не будет большого изменения, если вместо 123 записать 0.
Кроме того следить за этим глобальным сборищем будет тоже не просто. В итоге они так и останутся висеть в памяти до закрытия программы.
Не знаю на сколько это окажется эффективным, но при создании элементов GUI вообще можно отказаться от глобальных переменных,
решить это как в примере, а при закрытии окна просто удалить весь "мусор". После этого можно открывать/создавать другие окна по этому же принципу.
В примере создано только две глобальные переменные,
хотя при стандартном походе их должно быть пять и более в зависимости от количества элементов.
Для окна GUI нужна обязательно стандартная переменная (не объект)

Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $hGui, $oDict = ObjCreate("Scripting.Dictionary")
_TestGui()
While 1
    Sleep(100)
WEnd

Func _TestGui()
    Opt("GUIOnEventMode", 1)
    $hGui = GUICreate("GUI без глобальных переменных", 380, 120, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
    $oDict.Item("Input") = GUICtrlCreateInput("Опрос элементов", 10, 15, 360, 20)
    $oDict.Item("CheckBx") = GUICtrlCreateCheckbox("Checkbox", 10, 40)
    $oDict.Item("BtnOk") = GUICtrlCreateButton("OK", (380 - 70) / 2, 80, 70, 26)
    GUICtrlSetOnEvent(-1, "_Auslesen")
    GUISetState()
EndFunc

Func _Auslesen()
    $sText = "Input = " & GUICtrlRead($oDict.Item("Input")) & @CRLF & _
    "Checkbox = "& BitAND(GUICtrlRead($oDict.Item("CheckBx")),$GUI_CHECKED) & @CRLF & _
    "ID-Кнопки = " & $oDict.Item("BtnOk")
    MsgBox(0, "Результат", $sText, 0, $hGui)
EndFunc

Func _EXIT()
    GUIDelete($hGui)
    $oDict.RemoveAll()
    If MsgBox(4, "Проверка существования элементов", "Cуществование ID-Кнопки = "& $oDict.Exists("BtnOk") & @CRLF & _
    "Желаете запустить программу снова?") = 6 Then
        _TestGui()
    Else
        Exit
    EndIf
EndFunc
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Код:
$GlobalVar = 'Full'
CheckVar($GlobalVar)
$GlobalVar = ''
CheckVar($GlobalVar)

Func CheckVar($Var)
   If $Var Then
      MsgBox(0, 0, 'Переменная содержит данные.')
   Else
      MsgBox(0, 0, 'Переменная пустая.')
   EndIf
EndFunc
 
  • Like
Реакции: Norm

Norm

Продвинутый
Сообщения
278
Репутация
74
Вы знаете так же, что лучшим способом обойти это, это "перезаписать" её, присвоить 0 или "".
Но за пример всё же спасибо.
Я его его дополнил, что бы соответствовало названию темы
Код:
$GlobalVar = "Full"
CheckVar($GlobalVar)
$GlobalVar = ""
CheckVar($GlobalVar)

Func CheckVar($Var)
   If $Var Then
      MsgBox(0, 0, "Переменная содержит данные."& @CRLF & @CRLF & _
      "Проверка существования переменной"& @CRLF & _
      "IsDeclared(""GlobalVar"") = "& IsDeclared("GlobalVar"))
   Else
      MsgBox(0, 0, "Переменная пустая."& @CRLF & @CRLF & _
      "Продолжает ли существовать глобальная переменная?"& @CRLF & _
      "IsDeclared(""GlobalVar"") = "& IsDeclared("GlobalVar"))
   EndIf
EndFunc
 
Последнее редактирование:
Верх