Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1388222719
SKIPtr
2013-12-28 13:25
2015.01.25
создание заданий


15-1403446108
Timer
2014-06-22 18:08
2015.01.25
Посоветуйте аудио-плеер


2-1388063712
aka
2013-12-26 17:15
2015.01.25
Странное поведение переменной


2-1388401221
Вопрошающий
2013-12-30 15:00
2015.01.25
E2089 Invalid typecast


2-1387886265
Demo
2013-12-24 15:57
2015.01.25
Import Excel with Unicode





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский