![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странное поведение переменной [D7]
aka © (2013-12-26 17:15:00)Что выдаст программа?
program Test;
{$APPTYPE CONSOLE}
var
i: Integer;
procedure MyProc(Digit: Integer);
var
MyVar: Integer;
begin
Writeln(MyVar);
end;
begin
for i := 0 to 9 do
MyProc(i);
Readln;
end.
sniknik (2013-12-26 18:21:00) [1]> но при последующих ведь MyVar должна быть про инициализирована, но не тут то было
стек всякий раз новый, заново выделился, так с чего "должна"?
обжегся ты на не знании основ, и игнорировании варнингов... локальная переменная инициализации имеет не определенное значение... все никаких домыслов.
ну если это не "маджик обьект" типа строки.
Inovet (2013-12-26 18:19:00) [2]> [15] aka (26.12.13 18:19)
А второе?
aka (2013-12-26 18:19:00) [3]>>Inovet © (26.12.13 18:02) [13]
SizeOf(Integer); это я в скорях оговорился
Dimka Maslov (2013-12-26 18:17:00) [4]SizeOf(Integer) при любом вызове вернёт 4.
Inovet (2013-12-26 18:02:00) [5]> [12] aka (26.12.13 17:51)
> при первом вызове понятно что должен выдать SizeOf(Integer);
Чёй-то так?
> [12] aka (26.12.13 17:51)
> но при последующих ведь MyVar должна быть про инициализирована
Чёй-то так?
aka (2013-12-26 17:51:00) [6]Вообще я очень сильно на этом обжегся, пол дня ища ошибку.
Упрощая код, оставляю суть проблемы:
procedure MyProc(digit: Integer)
var
MyVar: Integer;
begin
Writeln(MyVar);
MyVar := digit;
end;
for i := 0 to 10 do MyProc(i);
при первом вызове понятно что должен выдать SizeOf(Integer);
но при последующих ведь MyVar должна быть про инициализирована, но не тут то было
sniknik (2013-12-26 17:35:00) [7]> Что я делаю не так?
не D7... в нем, то что ты показываешь получается если procedure MyProc( varDigit: Integer); поставить.
Palladin (2013-12-26 17:35:00) [8]
> видать оптимизатор убирая лишнюю Digit реально
Очень похоже.
aka (2013-12-26 17:34:00) [9]Palladin © (26.12.13 17:32) [6] все так
Только я в D7 запускал
sniknik (2013-12-26 17:34:00) [10]о, стоит начать ее использовать, и ситуация меняется... видать оптимизатор убирая лишнюю Digit реально локальную переменную по тому же адресу размещал.
aka (2013-12-26 17:33:00) [11]Palladin © (26.12.13 17:30) [4]
Даю
Palladin (2013-12-26 17:32:00) [12]http://clip2net.com/s/6td2X0
Что я делаю не так?
sniknik (2013-12-26 17:31:00) [13]> Случайный набор чисел
неопределенный набор...
тут выдает (не удержался, проверил) значение передаваемой внутрь переменной, а если поставить var то адрес переменной... видать локальная в том же месте стека располагается через которое значение переменной прошло.
Palladin (2013-12-26 17:30:00) [14]
> выдаст
>
> 0
> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
> 9
Отвечаешь? Зуб даешь?
aka (2013-12-26 17:29:00) [15]выдаст
0
1
2
3
4
5
6
7
8
9
Вообще бред, я же не Digit вывожу
Вова (2013-12-26 17:27:00) [16]тут скорей странное поведение ака имеет место быть. Не вопросы задает, а шарады загадывает.
Palladin (2013-12-26 17:26:00) [17]Случайный набор чисел, а что ты ожидал? Локальные переменные инициализируются только в случае если их время жизни контролируется компилятором (дин массивы, варианты, интерфейсы)