Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странное поведение переменной [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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо