0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
1

О локальных переменных

20.08.2017, 13:41. Показов 2400. Ответов 8
Метки нет (Все метки)

В функцию в качестве аргумента приходит таблица data = { 'a', 'b', 'c', 'd', 'e' }
Для удобства я делаю следующее:

local var1 = data[1]
local var2 = data[2]
local var3 = data[3]
local var4 = data[4]
local var5 = data[5]

Вопрос состоит в следующем: при выходе из этой функции, что случится с переменными var1-5 и таблицей data? Будут ли они храниться в окружении данной функции или уничтожатся? Если data будут храниться, то не будет ли расточительством делать переменные var1-5? (т.к. это по сути копии таблицы data). Просто мне удобно использовать var1-5 (т.к. легче обращаться к значениям по имени переменной, а не по индексу в в таблице data), но в то же время опасаюсь, что это будет лишним засорением памяти.


// Появилась ещё идея, после ввода переменных var1-5 выполнить код: data = nil. Что скажете?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2017, 13:41
Ответы с готовыми решениями:

Рассмотреть программу, написать имена глобальных переменных, локальных переменных, формальных параметров
Program P1; var s:string; procedure P(var s:string) ; var i, j : integer; ...

Неинициализация локальных переменных
Здравствуйте.Пишу в Visual studio 2012.Пишет что использованы неинициализированные локальные...

Обьявление локальных переменных
Добрый день. В какой последовательности объявляются локальные переменные в функции? Если вызвать...

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

8
668 / 470 / 123
Регистрация: 07.05.2013
Сообщений: 1,726
Записей в блоге: 1
20.08.2017, 17:34 2
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

При выходе из функции все локальные переменные будут вычищены из памяти сразу после запуска сборщика мусора.
Ваша таблица data останется в памяти, если она объявлена глобально.

На Луа можно делать вот так:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
function my_func( t )
 
  print( t.var1, t.var2, t.var3, t.var4, t.var5 )
 
end
 
my_func({
  var1 = "a",
  var2 = "b",
  var3 = "c",
  var4 = "d",
  var5 = "e"
})
0
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
20.08.2017, 20:45  [ТС] 3
Если data не объявлена глобально, то она будет также уничтожена, как и var1-5?

И еще вопрос. Допустим, такой код:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
local var_func
 
function func()
      local var = 'abc' -- Создаем локальную переменную
   
      function func_2()
            print(var)
      end
   
      var_func = func_2 -- сохраняем во внешнюю переменную созданную функцию
   
      -- Выход из функции, локальная переменная 'var' уничтожается.
end
 
func()
 
var_func() -- по сути запускаем ранее созданную функцию func_2
 
 
-- ВЫВОД: 'abc'
Если локальные переменные уничтожаются при выходе из функции, почему тогда мы прочли локальную переменную 'var'?
0
668 / 470 / 123
Регистрация: 07.05.2013
Сообщений: 1,726
Записей в блоге: 1
21.08.2017, 08:55 4
Ваш вопрос касается сразу двух тем - области видимости идентификаторов и времени существования объектов Луа (переменных, таблиц, функций и т.д.).
Вы модули умеете использовать? Я имею в виду функцию require... если да, я попробую на примере модулей ответить на ваши вопросы...

Добавлено через 15 минут
Да, и на всякий случай - какую версию Lua Вы используете?
0
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
21.08.2017, 10:09  [ТС] 5
Версия - 5.1

По поводу модулей - не умею
0
668 / 470 / 123
Регистрация: 07.05.2013
Сообщений: 1,726
Записей в блоге: 1
21.08.2017, 11:17 6
Хорошо, давайте попробуем разобраться в пределах одного модуля...

Итак. Область видимости локального идентификатора распространяется исключительно на тот блок, в котором он определен.

Пример 1:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
local a = 123 -- переменная объявлена локальной, но (!) в пределах модуля она видна всем.
 
function example_01()
 
    local a = 456
    print( a )
 
end
 
example_01()  -- выведется 456, поскольку функция считается блоком видимости
 
print( a ) -- выведется 123, поскольку мы вне функции и область видимости теперь ограничена модулем ( тем исходником, где все это написано )
Пример 2:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
local a = 12345
 
function example_02()
 
    local a = 456
    print( a ) -- выведется 456
 
    for i = 1, 5 do
        local a = 789
        print( a ) -- в цикле 5 раз выведется 789
    end
 
    print( a ) -- выведется 456, мы вышли из области видимости цикла и вернулись к локальной переменной определенной выше этого блока
 
end
 
example_02() -- выведется 456, пять раз 789 и снова 456
 
print( a ) -- выведется 12345, мы вышли за область видимости функции
Это пока понятно или что-то требует объяснений?
0
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
21.08.2017, 14:13  [ТС] 7
Это понятно
0
0 / 0 / 0
Регистрация: 20.08.2017
Сообщений: 5
24.08.2017, 21:22  [ТС] 8
что дальше?
0
668 / 470 / 123
Регистрация: 07.05.2013
Сообщений: 1,726
Записей в блоге: 1
24.08.2017, 21:47 9
Лучший ответ Сообщение было отмечено IvanJ как решение

Решение

Если коротко, то видимость локальных идентификаторов, определенных внутри модуля аналогична видимости внутри блока - то есть за пределами модуля не видна.

Что касается времени жизни данных, на которые ссылается идентификатор - то оно определяется очень просто - данные не могут быть уничтожены из памяти до тех пор, пока на них ссылается хотя бы один глобальный идентификатор.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2017, 21:47

Использование локальных переменных
Необходимо: Сначала отрицательные элементы в обратном порядке, затем нули, а в конце положительные...

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

Рекурсия и никаких локальных переменных
Нужно решить задание используя рекурсию и не используя никаких for,while и т.д.И локальных...

Проблемы с созданием локальных переменных
#include <iostream> using namespace std; int* f() { int* p = new int; int k = 5; p =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.