Форум: "Начинающим";
Текущий архив: 2015.01.25;
Скачать: [xml.tar.bz2];
ВнизСтранное поведение переменной Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.002 c