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


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

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


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

Наверх




Память: 0.59 MB
Время: 0.033 c
14-1092297118
DeadMeat
2004-08-12 11:51
2004.08.29
Наша судьба в их руках


3-1091703869
mak_kam
2004-08-05 15:04
2004.08.29
Проблема с ADO (Access) под WinXP


4-1090223134
DmitryMN
2004-07-19 11:45
2004.08.29
Поиск директории Program Files


1-1092298386
Ренат
2004-08-12 12:13
2004.08.29
Загрузить .gif файл


3-1091687674
РВА
2004-08-05 10:34
2004.08.29
Постаничное суммирование в FRep





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