All streams
Search
Write a publication
Pull to refresh
0
Send message
>> Не факт. Это могут быть регистры.

Поскольку речь шла про выделение памяти переменных в момент запуска exe файла, можно было додумать, что речь идёт про глобальные. Глобальные переменные могут храниться только в ОЗУ. Есть исключение: delphi — реализация цикла for, в котором переменная хранится и в ОЗУ и в регистрах, а по завершению цикла delphi-программистам предписывается считать, что её значение неопределено.
>> lair

Допустим, что первая строка программы — такая: MyArray[12345]:=6.

Объясните, как программа может начать выполняться до того, как под статический массив MyArray была выделена память?
Вот в том-то и дело, что нет. Достаточно сделать пьян и тусуюсь свойствами я, которое я и передавать в ДавайДавай. Здравствуй, ООП.

Смотрите как рассуждает религиозный человек: разве весь этот прекрасный мир мог возникнуть сам собой? Нет!!! Значит, его создал Бог. Поэтому, я поклоняюсь Богу.
При этом религиозного человека никак не смущает тот факт, что этот самый бог возник сам собой, ага.

Так же рассуждаете вы. Разве красиво, чтобы были глобальные переменные — сова, ЯПьян?, и т.д.? Нет!!! Значит, это свойства глобального объекта Я. И при этом вас не смущает, что теперь, Я — это глобальная переменная…
Затем, что если она будет локальной, то после выполнения процедуры в которой эта локальная переменная, её значение будет потеряно.

Да вот вам пример, найдите ошибку в коде (не совсем Delphi, но смысл ясен):

var ЯТусуюсь:boolean;

Procedure ДавайДавай!;
var ЯПьян?:boolean:=False;
begin
  case Random(4) of
  1:Потанцевать;
  2:Поорать;
  3:begin
       Выпивать;
       ЯПьян:=True;
     end;
  else Тусить;
  end;
  if Time>=23:30 then
  begin
     ЯТусуюсь:=False;
     if ЯПьян? then ЕхатьНаТаксиДомой
     else ЕхатьНаСвоейМашинеДомой;
  end;
end;

Procedure Тусовка;
begin
  ЯТусуюсь:=True;
  while ЯТусуюсь do
     ДавайДавай!
end;


Ошибка в том, что ЯПьян? — локальная переменная. Должна быть глобальной.
«Говорит» — неудачный термин, так как код к этому моменту ещё не начал выполняться. Я говорю про exe файлы. В PHP, JavaScript, СУБД — не так.
В моем понимании цикл жизни переменной начинается с момента ее инициализации, т.е. присвоения ей значения
А вам не кажется, что для того, чтобы присвоить «ей» значение, сначала «она» должна уже существовать?

Физически, переменные это области ОЗУ. Допустим, программа использует 200 переменных. Значит, машинный код внутри exe файла будет переменную номер 19 рассматривать как место в блоке ОЗУ, выделенном программе, начальный адрес которого равен размеру всех переменных с 1 по 18. (Там чуть сложнее, так как размер переменной компилятор часто дополняет до чуть большего ради роста скорости обработки).

Программа при запуске не запрашивает у операционной системы (любителям свеххточности — у менджера памяти) каждую из 200 переменных отдельно. Программа сразу говорит винде, сколько памяти уже занято блоком из переменных. Выделение этой памяти выполняется на уровне виндовс до того как программа начнёт работу.

При чём тут присваивание значения? Это произойдёт позже, по мере выполненния кода.
Есть сопротивление, у него есть два контакта. Вы прикасаетесь ими к источнику напряжения. Вот, вы приложили напряжение к резистору.

Теперь, расскажите, как именно вы напрямую приложите к резистору силу тока.
Любое утверждение имеет область действия, некорректно требовать чтобы оно оставалось верным вне своего контента. Вы можете победить в шахматах используя молоток, но в правилах игры этого нет и не будет. Сжигание резистора высоким напряжением — это использование молотка в шахматах.
Рассмотрим сценарий:
1) День. На сову пролилась чернильница.
2) Вечер. Поттер ужинает. Рядом есть сова.
3) Ночь. Поттер спит, и ему снится, что он бабочка. Рядом нет совы.
4) Утро следующего дня. Поттер завтракает. Рядом есть сова.

Если мы удалим сову в начале пункта 3 и создадим в начале пункта 4, то как при отрисовке совы мы узнаем, что на неё менее семи дней назад пролилась чернильница, и поэтому на ней есть синее пятнышко?
Вот совершенно не понятно, зачем она «есть», особенно когда мы наконец выяснили, что объект, на который она ссылается, может как быть, так и не быть.
А затем, что «у меня нет совы» (переменная пуста) и «мне не известно что такое сова» (переменная отсутствует) — не одно и то же.
Я дополню ваш код секцией var:
var GlobalVar,LocalVar:TObject;
begin
GlobalVar := TObject.Create;
LocalVar := GlobalVar; 
GlobalVar.Destroy;

Здесь, переменные GlobalVar и LocalVar работают как тип pointer. Они состоят из 4х байт (если выбрать 64х-битный режим компиляции, из 8 байт), а сама структура лежит в ОЗУ.

Вы создали две переменных, указывающих на одну и ту же область памяти. Затем, командой Destroy (если в самом деле будете писать на Delphi коммерческий продукт, никогда не используйте Destroy, используйте Free или FreeAndNil.) эту память освободили, а ссылка осталась.

Затем… я даже не понимаю что вы делаете. Строка
WriteLn(LocalVar);
ожидаемо, не компилируется, она не имеет смысла.

Но допустим, вы имели ввиду что надо считать что-нибудь из объекта. Вы ожидаемо получите ошибку чтения (либо, что намного хуже, её не получите), так как память на которую ссылался LocalVar удалена. Но это не говорит о том что переменной не существует.

Представьте, что переменная это билет на поезд, в нём написано что вам надо сесть в вагон номер 10. Приехал поезд, а в нём только 7 вагонов. Продолжает ли существовать купленный вами билет? Да.
>> lair Мне вот очень интересно: а что, Гарри правда всегда имеет связь со своей совой (...)

Не всегда. Но сова — глобальная переменная.

Это так же, как время суток. Глобальная переменная время суток имеет значение — сейчас день. А я в данный момент могу быть в лифте. И это может быть не тот лифт который в ТЦ Европейский возле м. Киевская в Москве, который снаружи здания, а самый обычный лифт. Я не контактирую в данный момент с природой напрямую. Но день остаётся днём.
Я «не читаю википедию» — в том же смысле, в каком водитель со стажем не читает повествование где в его машине педаль тормоза.
>> ads83
Мне неизвестно, как в Delphi прервать существование глобальной переменной до завершения работы программы. Можно освободить память, можно присвоить длину ноль динамическому массиву (присвоением nil), можно сделать экземпляру объекта Free или FreeAndNil, но удалить переменную в этом языке, как мне представляется, нельзя.

Смысл, которого так можно добиться — а именно, когда переменная больше не нужна, то использовать ту же область памяти для хранения других данных другого типа — в Delphi реализовать можно, используя механизм record case of. Но развоплощения переменных в этом языке нет.
Если игра однопользовательская по геймплею, почему ей нужен игровой сервер?

Даже в такой реализации, глобальная переменная на клиентском устройстве тоже нужна. Аппендекс в виде ненужного сервера не меняет этот факт.
Молодец, пять.

А теперь, давайте сделаем диалог менее философским. Напишите на любом языке программирования глобальную переменную с ограниченным сроком жизни. (Я могу, кстати. Drop Sequence в Оракле. Но это настолько редкий и вырожденный случай......)

Только не путать удаление переменной с обнулением её значения.
Сове нужна видимость там где Поттер, а игра от его лица.
Для элемента активной заставки например. Зачем создавать замок, если пользователь не начал играть в Unreal1?

Но ваш вопрос не имеет отношения к написанному мной: глобальная переменная просто есть. До того как пользователь зашёл в игру, и до того как сова появилась по сюжету, и после того как её убили из-за неаккуратных действий игрока, в ней может быть nil. Пусто. Но переменная-то есть.

В каком языке программирования вы пишете, что глобальные переменные в нём требуется «создавать» в рантайм?
Под глобальной переменной обычно понимают переменную с временем жизни — весь сеанс работы программы, и видимостью — везде. (Поскольку тут очень любят выискивать исключения, поясняю что видимость везде не отменяет действия по доступу к ней если того требует язык, как это сделано в PHP)
Я имел ввиду сеанс работы программы до её выключения.
Не сеанс юзера в ней.

Information

Rating
Does not participate
Registered
Activity