Форум: "Потрепаться";
Текущий архив: 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.031 c