Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.039 c
14-1092136775
Новенький
2004-08-10 15:19
2004.08.29
Помогите по железу


1-1092226114
TEXHAPb
2004-08-11 16:08
2004.08.29
Простой вопрос: C -> Pascal


1-1092146582
andy
2004-08-10 18:03
2004.08.29
размещение ListView из DLL на форме главного окна


1-1092503974
Gnec
2004-08-14 21:19
2004.08.29
как сделать пакер ???


14-1092175825
Baron
2004-08-11 02:10
2004.08.29
Средство от простуды и насморка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский