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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2012, 21:05   #1
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию Если переменная might not have been initialized то...?

При компиляции появляется предупреждение типа: "Variable 'KoefVipusk' might not have been initialized" ! таком случае необходимо присвоить этой переменной значение 0 перед ее расчетом, я правильно понимаю или нет?
kta87 вне форума Ответить с цитированием
Старый 31.01.2012, 21:44   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Правильно пониамаете.. иначе начальное значение переменной будет максимум её типа.

К примеру SmallInt (0..127)
Код:
var
 i:smallint;//variable 'i' might not have been initialized
begin
 //Сейчас i равно 127
end;
Явно задавайте переменным значения.
Человек_Борща вне форума Ответить с цитированием
Старый 31.01.2012, 22:41   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Человек_Борща, как не стыдно максимуму Smallint приписывать 127 Да и с чего он там будет, особенно в локальной переменной функции или процедуры
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.01.2012, 22:44   #4
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Ну вот например:
Код:
if(ComboBox1.ItemIndex >= 0) and (ComboBox1.ItemIndex <= 7) then
   Vmest1:= cConst1[ComboBox1.ItemIndex];
естественно поваляется это предупреждения т.к. переменная не явно задана, так что лучше перед этой строкой присвоить ей 0 или игнорировать это предупреждение?
kta87 вне форума Ответить с цитированием
Старый 31.01.2012, 22:50   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
переменная не явно задана
Нет такого понятия. В данном случае значение может быть присвоено, а может и нет. И компилятор в неудоумении, если дальше встречается обращение к значению этой переменной. Если вы обращаеетесь при выполнение того же условия, по которому значение присваивалось, то нет проблем и сообщение можно проигнорировать. В противном случае может быть масса проблем при использовании не инициализированной переменной
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.01.2012, 22:56   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Человек_Борща, как не стыдно максимуму Smallint приписывать 127 Да и с чего он там будет, особенно в локальной переменной функции или процедуры
Ой.. опять напутал.. не smallint а shortint[-128..127]

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

Цитата:
This warning is given if a variable has not been assigned a value on every code path leading to a point where it is used.

program Produce;
(*$WARNINGS ON*)
var
B: Boolean;
C: (Red,Green,Blue);

procedure Simple;
var
I : Integer;
begin
Writeln(I); (*<-- Warning here*)
end;

procedure IfStatement;
var
I : Integer;
begin
if B then
I := 42;
Writeln(I); (*<-- Warning here*)
end;

procedure CaseStatement;
var
I: Integer;
begin
case C of
Red..Blue: I := 42;
end;
Writeln(I); (*<-- Warning here*)
end;

procedure TryStatement;
var
I: Integer;
begin
try
I := 42;
except
Writeln('Should not get here!');
end;
Writeln(I); (*<-- Warning here*)
end;

begin
B := False;
end.

In an if statement, you have to make sure the variable is assigned in both branches. In a case statement, you need to add an else part to make sure the variable is assigned a value in every conceivable case. In a try-except construct, the compiler assumes that assignments in the try part may in fact not happen, even if they are at the very beginning of the try part and so simple that they cannot conceivably cause an exception.

program Solve;
(*$WARNINGS ON*)
var
B: Boolean;
C: (Red,Green,Blue);

procedure Simple;
var
I : Integer;
begin
I := 42;
Writeln(I);
end;

procedure IfStatement;
var
I : Integer;
begin
if B then
I := 42
else
I := 0;
Writeln(I); (*Need to assign I in the else part
end;

procedure CaseStatement;
var
I: Integer;
begin
case C of
Red..Blue: I := 42;
else I := 0;
end;
Writeln(I); (*Need to assign I in the else part*)
end;

procedure TryStatement;
var
I: Integer;
begin
I := 0;
try
I := 42;
except
Writeln('Should not get here!');
end;
Writeln(I); (*Need to assign I before the try*)
end;

begin
B := False;
end.

The solution is to either add assignments to the code paths where they were missing, or to add an assignment before a conditional statement or a try-except construct.

Последний раз редактировалось Человек_Борща; 31.01.2012 в 22:59.
Человек_Борща вне форума Ответить с цитированием
Старый 31.01.2012, 23:06   #7
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Нет такого понятия. В данном случае значение может быть присвоено, а может и нет. И компилятор в неудоумении, если дальше встречается обращение к значению этой переменной. Если вы обращаеетесь при выполнение того же условия, по которому значение присваивалось, то нет проблем и сообщение можно проигнорировать. В противном случае может быть масса проблем при использовании не инициализированной переменной
Т.е. присвоение этой переменной 0 решает эту проблему на первом этапе, но потом значение 0 может и не измениться? Или же решает глобально, т.е. полностью исключает вариант ошибки при обращении в других условиях?
kta87 вне форума Ответить с цитированием
Старый 31.01.2012, 23:14   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Или же решает глобально, т.е. полностью исключает вариант ошибки при обращении в других условиях?
Откуда мне может быть это известно? Все зависит от конкретного кода и как это начальное значение может повлиять на ход программы. Если другие условия 0 нормально обработают, как предусмотрено по алгоритму, то нет проблем, иначе... А значение в не инициализированной переменной есть, только оно не предсказуемое в данном случае
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.02.2012, 00:01   #9
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Аватар, спасибо за четкий диалог и ясность мысли!
kta87 вне форума Ответить с цитированием
Старый 01.02.2012, 01:30   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Буратине дали три яблока. Два он съел.

Сколько яблок осталось у Буратины?

Думаете одно? Hичего подобного. Hикто же не знает сколько у него уже было яблок до этого.

Мораль - обнуляйте переменные!
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
если я хочу чтобы переменная была рандом, нужно просто написать, что типа а:=random? какой это будет тип переменных? gylayko Помощь студентам 6 04.10.2011 12:58
Pl/sql Не обновлять поле если переменная пустая GenniY БД в Delphi 7 24.10.2010 13:28
Variable <Имя> might not have been initialized Anchut@ Общие вопросы Delphi 5 21.06.2010 11:01
Если y – вещественная переменная, а n – целая, то оператор присваивания какой будет иметь вид? Naruto63 Помощь студентам 6 23.11.2009 16:30
Написать программу в результате выполнения которой булевская переменная t получает true если выполняется Корделия Общие вопросы C/C++ 1 28.04.2009 13:53