Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2010, 15:56   #1
Aleksey1989
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 127
По умолчанию Инициализация

Здравствуйте. Недавно возникла такая ситуация: если объявить глобальную переменную, а потом выполнить какие-нибудь математические действия над ней (r:=r*2), то в результате переменная будет равна 0. А если эту переменную объявить в обработчике событий, то при той же математической операции результат будет неопределённый. Почему???

Код:
var
  Form1: TForm1;
  d,t:real;
procedure TForm1.Button1Click(Sender: TObject);
var x:real;
begin
   d:=d*2;
  Label1.Caption:=FloatToStr(d);
   x:=x*2;
  Label2.Caption:=FloatToStr(x);
  end;

Последний раз редактировалось Aleksey1989; 10.09.2010 в 15:58.
Aleksey1989 вне форума Ответить с цитированием
Старый 10.09.2010, 15:59   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
sadasd

а можно текст этой функи поглядеть?
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 10.09.2010, 16:27   #3
Nater
Пользователь
 
Регистрация: 23.05.2009
Сообщений: 59
По умолчанию

а ничего что Вы изначально умножаете 0 на 2? Естественно и должен получиться 0:
Код:
x:=x*2
Nater вне форума Ответить с цитированием
Старый 10.09.2010, 16:44   #4
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Nater, читайте ВНИМАТЕЛЬНО вопрос и отвечайте по существу.
Баламут вне форума Ответить с цитированием
Старый 10.09.2010, 17:10   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Она и без математических действий глобальная Double выдаст 0, а объявленная внутри процедуры 1.804231708851E-307.
Помню в какой-то программе у меня не работал sql-запрос
select * from table where id=[число]
Пришлось написать
select * from table where (id>=[число]) and (id<[число+1])
Воистину так устроен мир
_SERGEYX_ вне форума Ответить с цитированием
Старый 11.09.2010, 08:36   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Потому что локальные переменные компилятор не обязан обнулять.
p51x вне форума Ответить с цитированием
Старый 11.09.2010, 14:01   #7
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

При объявлении локальной переменной значение ей не задаётся
Цитата:
Потому что локальные переменные компилятор не обязан обнулять.
, и поэтому значение неопределённое. Если хотите какойто определённый ответ задавайте значение переменной.
vovk вне форума Ответить с цитированием
Старый 11.09.2010, 15:08   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

2 vovk
К чему был ваш пост, смысловополностью повторяющий мой?

Цитата:
и поэтому значение неопределённое
спасибо Кэп.
p51x вне форума Ответить с цитированием
Старый 11.09.2010, 15:23   #9
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
2 vovk
К чему был ваш пост, смысловополностью повторяющий мой?


спасибо Кэп.
к тому, что он объёмнее и понятнее
ЗЫ а цитата, чтоб не присваивать себе первенство.
vovk вне форума Ответить с цитированием
Старый 11.09.2010, 15:36   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на самом деле, компилятор и глобальные переменные НЕ ОБЯЗАН обнулять! Иницилизировать переменные перед их использованием - святое дело программиста.
Но, с самых первых версий Delphi действительно обнуляет глобальные переменные. И даже в документации было об этом сказано. Дословно не помню, но приблизительно так: в настоящей версии Delphi происходит обнуление глобальных переменных, ..... Однако, разработчики НЕ ГАРАНТИРУЮТ, что в будущих версиях среды разработки/компилятора это будет так же!

а ещё, некоторые продвинутые ЯП (например, тот же .NET) не дадут использовать переменную, если она не иницилизированна. Что, имхо, АБСОЛЮТНО правильно!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Меню, инициализация Krumyura Общие вопросы C/C++ 4 22.03.2010 18:14
Ошибка инициализация Krumyura Общие вопросы C/C++ 2 22.03.2010 14:08
Инициализация Krumyura Общие вопросы C/C++ 5 20.03.2010 23:37
Инициализация Glut windzor Общие вопросы .NET 2 07.02.2010 12:17
Инициализация окна Anny Общие вопросы Delphi 9 13.03.2007 11:48