Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.01.25;
Скачать: CL | DM;

Вниз

Странное поведение переменной   Найти похожие ветки 

 
aka   (2013-12-26 17:15) [0]

Что выдаст программа?
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.


 
Palladin ©   (2013-12-26 17:26) [1]

Случайный набор чисел, а что ты ожидал? Локальные переменные инициализируются только в случае если их время жизни контролируется компилятором (дин массивы, варианты, интерфейсы)


 
Вова   (2013-12-26 17:27) [2]

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


 
aka   (2013-12-26 17:29) [3]

выдаст

0
1
2
3
4
5
6
7
8
9

Вообще бред, я же не Digit вывожу


 
Palladin ©   (2013-12-26 17:30) [4]


> выдаст
>
> 0
> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
> 9

Отвечаешь? Зуб даешь?


 
sniknik ©   (2013-12-26 17:31) [5]

> Случайный набор чисел
неопределенный набор...

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


 
Palladin ©   (2013-12-26 17:32) [6]

http://clip2net.com/s/6td2X0
Что я делаю не так?


 
aka   (2013-12-26 17:33) [7]

Palladin ©   (26.12.13 17:30) [4]

Даю


 
sniknik ©   (2013-12-26 17:34) [8]

о, стоит начать ее использовать, и ситуация меняется... видать оптимизатор убирая лишнюю Digit реально локальную переменную по тому же адресу размещал.


 
aka   (2013-12-26 17:34) [9]

Palladin ©   (26.12.13 17:32) [6] все так

Только я в D7 запускал


 
Palladin ©   (2013-12-26 17:35) [10]


> видать оптимизатор убирая лишнюю Digit реально

Очень похоже.


 
sniknik ©   (2013-12-26 17:35) [11]

> Что я делаю не так?
не D7... в нем, то что ты показываешь получается если  procedure MyProc(var Digit: Integer); поставить.


 
aka   (2013-12-26 17:51) [12]

Вообще я очень сильно на этом обжегся, пол дня ища ошибку.
Упрощая код, оставляю суть проблемы:
procedure MyProc(digit: Integer)
var
 MyVar: Integer;
begin
 Writeln(MyVar);
 MyVar := digit;
end;

for i := 0 to 10 do MyProc(i);


при первом вызове понятно что должен выдать SizeOf(Integer);
но при последующих ведь MyVar должна быть про инициализирована, но не тут то было


 
Inovet ©   (2013-12-26 18:02) [13]

> [12] aka   (26.12.13 17:51)
> при первом вызове понятно что должен выдать SizeOf(Integer);

Чёй-то так?

> [12] aka   (26.12.13 17:51)
> но при последующих ведь MyVar должна быть про инициализирована

Чёй-то так?


 
Dimka Maslov ©   (2013-12-26 18:17) [14]

SizeOf(Integer) при любом вызове вернёт 4.


 
aka   (2013-12-26 18:19) [15]

>>Inovet ©   (26.12.13 18:02) [13]
SizeOf(Integer); это я в скорях оговорился


 
Inovet ©   (2013-12-26 18:19) [16]

> [15] aka   (26.12.13 18:19)

А второе?


 
sniknik ©   (2013-12-26 18:21) [17]

> но при последующих ведь MyVar должна быть про инициализирована, но не тут то было
стек всякий раз новый, заново выделился, так с чего "должна"?

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



Страницы: 1 вся ветка

Текущий архив: 2015.01.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.006 c
15-1402790532
Пит
2014-06-15 04:02
2015.01.25
Термодинамика отдельно взятого человека


3-1302158824
OW
2011-04-07 10:47
2015.01.25
Почему дольше стало выполняться? oracle


2-1387969962
aka
2013-12-25 15:12
2015.01.25
if then


2-1387655618
Alen
2013-12-21 23:53
2015.01.25
База данных


15-1403276454
RDen
2014-06-20 19:00
2015.01.25
установка вин98