Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

помогите найти источник варнинга.   Найти похожие ветки 

 
jack128 ©   (2004-08-10 21:09) [0]

procedure TPropertyEditorFrame.VSTNewText(Sender: TBaseVirtualTree;
 Node: PVirtualNode; Column: TColumnIndex; NewText: WideString);
var
 NodeData: PNodeData;
 IdentMap: TDynIdentMapEntryArray;
 OrdValue: Integer;
begin
 NodeData := Sender.GetNodeData(Node);
 if NodeData.IsCategory then Exit;
 if NodeData.PropInfo.PropType^^.Kind in OrdTypes then
 begin
   IdentMap := GetIdentMap(NodeData.PropInfo);
   if not IdentToInt(NewText, OrdValue, IdentMap) then
   begin
     OrdValue := GetEnumValue(NodeData.PropInfo.PropType^, NewText);
     if OrdValue = - 1 then
     begin
       DoSetPropValue(NodeData.PropInfo, NewText);
       Exit;
     end;
   end;
   if NodeData.IsUserProp then
     DoSetPropValue(NodeData.PropInfo, OrdValue)
   else
     SetOrdProp(FObj, NodeData.PropInfo, OrdValue)
 end
 else
 if NodeData.PropInfo.PropType^^.Kind in StrTypes then
   if NodeData.IsUserProp then
     DoSetPropValue(NodeData.PropInfo, NewText)
   else
     SetStrProp(FObj, NodeData.PropInfo, NewText)
 else
 if NodeData.PropInfo.PropType^^.Kind = tkFloat then
   if NodeData.IsUserProp then
     DoSetPropValue(NodeData.PropInfo, StrToFloat(NewText))
   else
     SetFloatProp(FObj, NodeData.PropInfo, StrToFloat(NewText));
end;


на последней строчке метода - варнинг
[Warning] UPROPERTYEDITORFRAME.pas(552): Variable "IdentMap" might not have been initialized
Весзде, где используется эта переменная я пометил жирным.. Как она может быть не инициализирована - я не понимаю..


 
GuAV ©   (2004-08-10 21:30) [1]

На последней? да, она там не инициализированна/ это же после else. вот пример покороче.

type TDynArray = array of Integer;

procedure TForm1.FormCreate(Sender: TObject);
var A: TDynArray;
begin

end;


 
Юрий Зотов ©   (2004-08-10 21:32) [2]

Видимо, компилятор подходит формально. Это же не ИИ, а всего лишь компилятор.

А зачем вообще нужна эта переменная? Вроде бы, без нее можно обойтись.


 
GuAV ©   (2004-08-10 21:33) [3]

procedure TForm1.FormCreate(Sender: TObject);
var A: TDynArray;
begin
 if Sender=nil then
 begin
   Tag:=0;
   A:=TDynArray(Tag);
   //Finalize(A); - разкоментируй чтобы убрать варнинг.
 end
 else
 begin
   Tag:=2;
 end
end;

Дело оказывается  в том что компилер не хочет автоматически очищать A...


 
jack128 ©   (2004-08-10 21:37) [4]


> / это же после else.
хе. А для обычных переменных (не дин массивов) такого варнинга не возникает ...

var
 i: Integer;
begin
 if Random(100) < 50 then
 begin
   i := Random(50);
   ShowMessage(IntToStr(i));
 end
 else
 begin
   ShowMessage("Great")
 end;// тут варнинга на не инициализированный i нету..
end;


 
GuAV ©   (2004-08-10 21:42) [5]

GuAV ©   (10.08.04 21:33) [3]

Вернее нет.. бред... похоже это таки глюк.


> А для обычных переменных (не дин массивов) такого варнинга
> не возникает ...

Причем тут обычные. дин массив надо финализировать, а с таким  i: Integer; ничё не надо.


 
jack128 ©   (2004-08-10 21:45) [6]


> А зачем вообще нужна эта переменная? Вроде бы, без нее можно
> обойтись.
хе. Не помню.. Раньше, наверно, была нужна.. Я как то не обратил внимания, что можно без переменной обойтись - больше привлёк внимание факт необъяснимого warning"a


> Причем тут обычные. дин массив надо финализировать,
зачем? Компилятор это сам сделает.
Кстати, а разве дин массивы и длинные строки компилятором же не инициализируются?


 
GuAV ©   (2004-08-10 21:47) [7]


> зачем? Компилятор это сам сделает.
> Кстати, а разве дин массивы и длинные строки компилятором
> же не инициализируются?

Да, да. похоже это таки глюк


 
GuAV ©   (2004-08-10 21:50) [8]

Весело. Компилятор инициализировал переменную, а потом ещё ему не нравится, чт она не инициализированна. В орешник компилятор!


 
jack128 ©   (2004-08-10 21:57) [9]


> ] GuAV ©   (10.08.04 21:50)
> Весело.

те весело, а мне грусно.. Всю статистику портит.
 ...
 if PropInfo = GetPropInfo(EditObject, "WindingCircuitIndex") then
 begin
   Circuits := EditObject.GetSupportedWindingCircuits;
   SetLength(Result, Length(Circuits));
   for i := 0 to Length(Result) - 1 do
   begin
     Result[i].Value := i;
     Result[i].Name := WindingCircuitToString(Circuits[i]);
   end;
 end
 else
   Result := inherited GetIdentMap(PropInfo);
// то же предупреждение на Circuits ...И как от него избавиться? Так же просто как в первом примере не удастся.. {$WARNINGS OFF} - не катит ;-)


 
имя   (2004-08-10 21:57) [10]

Удалено модератором


 
имя   (2004-08-10 22:00) [11]

Удалено модератором


 
Юрий Зотов ©   (2004-08-10 22:06) [12]

> jack128 ©   (10.08.04 21:57) [9]

> то же предупреждение на Circuits ...И как от него избавиться?
> Так же просто как в первом примере не удастся..

Удастся. :о)

if PropInfo <> GetPropInfo(...) then
 Result := inherited GetIdentMap(PropInfo)
else
 begin
   ...
 end


 
jack128 ©   (2004-08-10 22:11) [13]


> Юрий Зотов ©   (10.08.04 22:06)
Все не так просто ;-) У мя не прокатило (D5 SP1)

Вот полный код метода

function TBaseTransformerEditorFrame.GetIdentMap(
 PropInfo: PPropInfo): TDynIdentMapEntryArray;
var
 i, j: Integer;
 Circuits: TDynWindingCircuitsArray;
begin
 for i := EditObject.WindingCount to EditObject.WindingCount * 2 - 1 do
   if FProps[i] = PropInfo then // Если это свойства "режим нейтрали"
   begin
     SetLength(Result, ord(high(TNeutralMode)) + 1);
     for j := 0 to Length(Result) - 1 do
     begin
       Result[j].Value := j;
       Result[j].Name := NeutralModeNames[TNeutralMode(j)];
     end;
     Exit;
   end;
 if PropInfo <> GetPropInfo(EditObject, "WindingCircuitIndex") then
   Result := inherited GetIdentMap(PropInfo)
 else
 begin
   Circuits := EditObject.GetSupportedWindingCircuits;
   SetLength(Result, Length(Circuits));
   for i := 0 to Length(Result) - 1 do
   begin
     Result[i].Value := i;
     Result[i].Name := WindingCircuitToString(Circuits[i]);
   end;
 end
end;


 
GuAV ©   (2004-08-10 22:15) [14]

type TDynArray=array of Integer;

procedure A1(var DynArray: TDynArray);
begin
end;

function A2: TDynArray;
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var A: TDynArray;
begin
if Sender=nil then
begin
  Tag:=0;
//  A:=A2;        //  физический смысл
  A1(A);          //  этих двух одинаков
end
else
begin
  Tag:=2;
end
end;

Если процедура то ворнинга нет
Если функция то ворнинг есть


 
GuAV ©   (2004-08-10 22:19) [15]

<off>

> имя   (10.08.04 22:00) [11]
> Удалено модератором

Я вот тока не пойму, чё этого красным выделяют и так глаза мозолят серым надо имхо
</off>


 
Rouse_ ©   (2004-08-10 22:22) [16]

Жень да все очень просто, у тебя переменная инициализируется после
if NodeData.PropInfo.PropType^^.Kind in OrdTypes then
соответственно он не обсчитывает что используется она внутри IF и выдает предупреждение (ведь IF может и не выполниться)...
Сделай перед этой строчкой принудительно IdentMap := (чегото по умолчанию)...


 
jack128 ©   (2004-08-10 22:29) [17]


> соответственно он не обсчитывает что используется она внутри
> IF и выдает предупреждение (ведь IF может и не выполниться)...

самоцитирование

> > А для обычных переменных (не дин массивов) такого варнинга
> > не возникает ...


 
GuAV ©   (2004-08-10 22:46) [18]

А как тебе [14] - A1 и A2 скомпилятся в идентичный набор инструкций... Слушай, а если
type TDynArray=array of Integer;

procedure A1(var DynArray: TDynArray);
begin
end;

type TA1=procedure(var DynArray: TDynArray);

function A2: TDynArray;
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var A: TDynArray;
begin
if Sender<>nil then
begin
  Tag:=0;
  TA1(@A2)(A);
end
else
begin
  Tag:=2;
end
end;


 
Rouse_ ©   (2004-08-10 23:07) [19]

> А для обычных переменных (не дин массивов) такого варнинга
> > > не возникает ...

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


 
Piter ©   (2004-08-10 23:08) [20]

ну так динамический массив и инициализируется автоматом... нет?


 
Rouse_ ©   (2004-08-10 23:09) [21]

Нет естественно, как он может инициализироваться если он не знает своего размера?


 
GuAV ©   (2004-08-10 23:15) [22]


> Нет естественно, как он может инициализироваться если он
> не знает своего размера?

ДА, он инициализируется автоматом в nil.
Ctrl+Alt+C


 
jack128 ©   (2004-08-10 23:34) [23]


> Rouse_ ©   (10.08.04 23:09)
> Нет естественно, как он может инициализироваться если он
> не знает своего размера?
 Дин массивы/длинные строки/варианты/интерфейсы нужно файнализировать. Если компилятор эти переменные принудительно не инициализирует, то в них будет мусор. И при файнализации нас ждет горячо любимый AV.


 
jack128 ©   (2004-08-10 23:37) [24]


> ДА, он инициализируется автоматом в nil.
> Ctrl+Alt+C
А к чему это? Или просто комбинация клавиш так понравилась, что ты её теперь вместо F1 пишешь? :-))


 
Piter ©   (2004-08-10 23:57) [25]

jack128 ©   (10.08.04 23:37) [24]
А к чему это? Или просто комбинация клавиш так понравилась, что ты её теперь вместо F1 пишешь?


вероятно, он про то, что инициализацию динамического массива можно увидеть в дебаггере?

Rouse_ ©   (10.08.04 23:09) [21]
Нет естественно, как он может инициализироваться если он не знает своего размера?


ну конечно он не иницилизируется в понимании статических массивов. Но jack128 правильно заметил - если бы компилятор не инициализировал динам. массив - как он его потом мог бы финализировать?! Тоже относится и к AnsiString... И вообще ко всем типам с автоматической уборкой муссора...


 
jack128 ©   (2004-08-11 00:03) [26]


> вероятно, он про то, что инициализацию динамического массива
> можно увидеть в дебаггере?
угу, я спутал с Shift + Ctrl + C, потому и не понял..


 
GuAV ©   (2004-08-11 00:43) [27]


> угу, я спутал с Shift + Ctrl + C, потому и не понял..

Эти я также часто путаю :)
Кстати, понял, что A1 и A2 в [14] одно и тоже?


 
GuAV ©   (2004-08-11 00:48) [28]


> А к чему это? Или просто комбинация клавиш так понравилась,
> что ты её теперь вместо F1 пишешь? :-))

Кстати, давно мою анкету смотрел? :)


 
Piter ©   (2004-08-11 00:50) [29]

jack128 ©   (11.08.04 0:03) [26]
угу, я спутал с Shift + Ctrl + C


а что, тоже очень полезная комбинация, очень я ее люблю :)


 
jack128 ©   (2004-08-11 01:01) [30]


> Кстати, понял, что A1 и A2 в [14] одно и тоже?
в смысле, что код одинаковый генериться? Проясни - я правильно понял.  Так как при вызове A2(функции) - её результат фактически передается как вар параметр, то получается в таком коде

type TDynArray=array of Integer;

procedure A1(var DynArray: TDynArray);
begin
end;

function A2: TDynArray;
begin
 Result[2] := 10; // учитывая Button1Click - я AV никогда не получу!!!
end;

procedure TForm1.Button1Click(Sender: TObject);
var A: TDynArray;
begin
if Sender<>nil then
begin
 Tag:=0;
 SetLength(a, 10);
 A:=A2;        //  физический смысл
 A1(A);          //  этих двух одинаков
end
else
begin
 Tag:=2;
end
end;


 
jack128 ©   (2004-08-11 01:02) [31]


> Кстати, давно мою анкету смотрел? :)
ты графу "Интересное о себе" каждый месяц меняешь?


 
GuAV ©   (2004-08-11 01:22) [32]


> в смысле, что код одинаковый генериться? Проясни - я правильно
> понял.

Фактически stringи и дин массивы передаются как var параметры.
именно поэтому инициализируются в nil они в _вызывающей_ функции

> function A2: TDynArray;
> begin
>  Result[2] := 10; // учитывая Button1Click - я AV никогда
> не получу!!!
> end;

Да, получается. Поставь BreakPoint и нажми Ctrl+Alt+C.
Увидишь: вызовы идентичны!
А не учитывая - инициализировать надо в function, но можно предполагать, что он там инициализирован в nil.

> ты графу "Интересное о себе" каждый месяц меняешь?

Я остановлюсь, когда придумаю что-то действительно интересное.


 
jack128 ©   (2004-08-11 01:26) [33]


> можно предполагать, что он там инициализирован в nil
вот этого как раз и нельзя предполагать. псевдо переменную Result в отличии от обычных переменных нужно инициализировать в ручную всегда.


 
GuAV ©   (2004-08-11 01:27) [34]


> вот этого как раз и нельзя предполагать.

Да. можно предполагать, что он там инициализирован. Но не обязательно в nil. Вот так правильно.


 
GuAV ©   (2004-08-11 01:29) [35]


> именно поэтому инициализируются в nil

и отсюда "в nil" выкинуть


 
GuAV ©   (2004-08-11 01:32) [36]

Кстати, если понял и согласен, то [18] - способ исключения варнинга :)


 
jack128 ©   (2004-08-11 01:37) [37]


> то [18] - способ исключения варнинга :)
:-) Шютник ;-)


 
GuAV ©   (2004-08-11 01:42) [38]

Нет, ну почему бу и нет. Warning"а не будет - проверял см [14].
Будет warning unsafe typecast и/или unsafe code - это в Д7, и там всё равно придётся такое отключать.
Идентичность кода тоже легко сам проверишь.


 
GuAV ©   (2004-08-11 01:44) [39]

А если не хочешь так, то в nil инициализируй сам перед вызовом функции - но тогда будет одна лишшшняя инструкция в коде и губительно скажется на производительности.


 
jack128 ©   (2004-08-11 01:48) [40]


> и губительно скажется на производительности.
ЛОЛ!!!

Ладно забей - как нить избавлюсь от этих варнингов..



Страницы: 1 2 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.027 c
1-1092308148
Zlodey
2004-08-12 14:55
2004.08.29
qtintf70.dll


14-1092223767
Vlad Oshin
2004-08-11 15:29
2004.08.29
Куда бы деть ~200 пустых полторашек, из-под пива/лимонада


9-1084353434
Proger
2004-05-12 13:17
2004.08.29
Маски


1-1092222808
Боян Георгиев
2004-08-11 15:13
2004.08.29
Вопрос о TJPEGImage


4-1089869386
lexus3d
2004-07-15 09:29
2004.08.29
Заполнение ComboBox а на WinApi