Главная страница
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]


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

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


 
GuAV ©   (2004-08-11 01:54) [41]


> Ладно забей

Та нет, самому теперь интересно стало... ворнинги явно не по делу... переменная инциируется компилером... и сам же видишь, что функция и процедура - онди хрен, а они почему то только в функции...
В Борланд написать, что ли...

Как ещё мысля :) если весь код твой, перепиши, чтоб были процедуры.


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


> перед вызовом функции

в начале метода.


 
Piter ©   (2004-08-11 02:35) [43]

GuAV ©   (11.08.04 1:44) [39]
А если не хочешь так, то в nil инициализируй сам перед вызовом функции - но тогда будет одна лишшшняя инструкция в коде и губительно скажется на производительности


Да, такая программа даже на P4 будет тормозить... однозначно...


 
GuAV ©   (2004-08-11 02:52) [44]

jack128 ©   (11.08.04 01:48) [40]
Piter ©   (11.08.04 02:35) [43]

Хотите ещё посмеятся? Это типа как GuAV добился резкого прироста производительности:
было
           begin
             if (F.Name<>".") and (F.Name<>"..") then
               Process(F.Name);
           end
стало
           begin
             if DirIsNotThisOrParent(F.Name) then
               Process(F.Name);
           end
...
function DirIsNotThisOrParent(const S: string): Boolean;
asm
       MOV    EDX, EAX
       CALL   System.@LStrLen
       OR     EAX, EAX   // Нуль?
       JZ     @@2        // если нуль
       CMP    EAX, 2
       JG     @@2        // Длинее
       JE     @@1        // Равна
                         // Короче
       CMP    [EDX].Byte, "."
       SETNZ  AL    // True если не равна
       RET

 @@1:  CMP    [EDX].Word, ".."
       SETNZ  AL
       RET

 @@2:  MOV    AL, True
end;


 
jack128 ©   (2004-08-11 11:11) [45]

А можно узнать что выполняется в Process(F.Name), что по сравнению так сильно влияние двух сравнений? Да и вообще, я так понимаю f - TSearchRec ? тогда процедуры поиска FindFirst/Next - должны также нивилировать значение этих сравнений.. Вобщем задачу опиши - интересно же ;-)


 
GuAV ©   (2004-08-11 12:10) [46]

по оффтопу:
Рекурсивный поиск. Ищет по подпапкам, ели Recourse = True. Вызывает AddFile для каждого файла.
закоментируй проверку if DirIsNotThisOrParent(F.Name) then - и будет Стек Оверфлов.
 procedure TfrmMain.AddDir(const FileName: string);
 const AttrArr: array[Boolean] of Integer
   =(faAnyFile and not faDirectory, faAnyFile);
 var SrcAttr: Integer;
 procedure Process(const FileName: string);
 var F: TSearchRec;
 begin
   ChDir(FileName);
   if FindFirst("*",SrcAttr,F)=0 then
     try
       repeat
         if (F.Attr and faDirectory)<>0 then
           begin
             if DirIsNotThisOrParent(F.Name) then
               Process(F.Name);
           end
         else AddFile(ExpandFileName(F.Name));
       until FindNext(F)<>0;
     finally
       FindClose(F);
     end;
   ChDir("..");
 end;
begin
 BeginUpdate;
 try
   SrcAttr:=AttrArr[Recourse];
   Process(ExpandFileName(FileName));
 finally
   EndUpdate;
 end;
end;
по сабжу:
в самом начале метода присвоить nil не помогает?


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


> по оффтопу:
Мы ж потрепаться, какие оффтопы ;-)

не знаю.
procedure TfrmMain.AddFile(const s: string);
begin
 ListBox1.Items.Add(s);
end;
procedure TfrmMain.AddDir(const FileName: string);
...
begin
ListBox1.Items.BeginUpdate;
try
  SrcAttr:=AttrArr[true];
  Process(ExpandFileName(FileName));
finally
  ListBox1.Items.EndUpdate;
end;
end;

Почти без разницы, использовал ли я асм или паскаль.. Странно все это..


> по сабжу:
Да, конечно, никто и не сомневался..


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


> Почти без разницы, использовал ли я асм или паскаль.. Странно
> все это..

Я же сказал: добился резкого прироста, столь резкого, сколь резко сказалась для твоего кода лишнее привоение 0 ;-) Не уверен даже прирост ли :-)

> Да, конечно, никто и не сомневался..

Не помогает? Ну тогда объяви как интежер и при кождом юзании typecast делай.


 
Anatoly Podgoretsky ©   (2004-08-11 13:33) [49]

jack128 ©   (11.08.04 13:08) [47]
Мы ж потрепаться, какие оффтопы ;-)

В Потрепать кроме соблюдения темы ты еще обязан и трепаться.



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

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

Наверх




Память: 0.61 MB
Время: 0.022 c
10-1023799426
Delph
2002-06-11 16:43
2004.08.29
NS и автоматическое создание сервантов


4-1090172218
Makhanev A.S.
2004-07-18 21:36
2004.08.29
Как запустить службу сразу после её инсталляции?


3-1091563127
Жека
2004-08-03 23:58
2004.08.29
Вопрос по Access


4-1090061970
Cara
2004-07-17 14:59
2004.08.29
Widestring to String


8-1086771174
Юля
2004-06-09 12:52
2004.08.29
*.cdr , *.pdf - изображения в Image