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

Вниз

Нужно ли бороться с хинтами и ворнингами - 2   Найти похожие ветки 

 
Sergey Masloff   (2004-08-10 20:32) [0]

Или 1423 строчки кода которые потрясли мир (ну если и не мир то меня - точно).
 Пришлось тут сегодня покопаться в чужом коде. Делали для нас оутсорсеры кое-какую работу. Давно - почти 3 года назад. Все честь по чести контора серьезная контракт, ТЗ, приемка - сдача. Ну со сроками подзатянули чуток но все вроде заработало худо-бедно. Ну а тут пришлось кое-что подкрутить, да даже не подкрутить а посмотреть как одна вещь там работает и можно ли настроить под немножко другую задачу. Ну я взял исходники - думал на часик работы. И что я там увидел - это нечто. Наверное пост будет длинный - предупреждаю сразу.
 Для примера возьму один из модулей (от остальных полутора десятков отличается только тем что то что меня интересовало в нем реализовано). Начало меня обрадовало - компилятор с ходу выдал 183 хинта и около 50 варнингов. Тыкнув в первый же ворнинг я увидел чудо-конструкцию №1(привожу сокращенный вариант):

procedure SomeProc();
var
 bOK : Boolean;
begin
 if bOK then
    {Супер пупер код }
 else
    {Другой супер-пупер код}
end;


беглый просмотр модуля выявил еще 3 таких же участка. Такой видимо вариант русской рулетки

Код номер №2 меня уже не удивил

procedure SomeProc();
var
 bOK : Boolean;
begin
 if SomeCond then
   bOK := True
 else if SomeOtherCond then
   bOk := True
 else
   .....
 end;
 {Тут ничего связанного с использованием bOK нет}
end;


Таких было 6 штук

еще неплохой пример

procedure SomeProc();
var
 X1 : TSomeType;
 X2 : TOtherType;
 ...
 XN : TSomeNType;
begin
   {Тут ничего ни одна из локальных переменных не используется}
end;

такое встречалось раз 30 то есть практически в каждой процедуре

...ПРОДОЛЖЕНИЕ СЛЕДУЕТ


 
Юрий Зотов ©   (2004-08-10 20:38) [1]

Если SomeCond и SomeOtherCond в коде № 2 связаны с вызовом процедур, то код все же может быть оправдан - он не зависит от используемой схемы вычисления булевских выражений. А его аналог:
bOK := SomeCond or SomeOtherCond;
от нее зависит (SomeOtherCond может вычисляться, а может и нет).


 
Rouse_ ©   (2004-08-10 20:45) [2]

На дух не переношу вещей даже с хинтами, не говоря уже о ворнингах...
Код должен быть изначально верен и не допускать даже возможности возникновения ошибки (за исключением ошибок компилятора :)

> [1] Юрий Зотов ©   (10.08.04 20:38)
Если верить {Тут ничего связанного с использованием bOK нет} то налицо зашумленность кода, а так действительно SomeCond or SomeOtherCond

Вот такое мое ИМХО


 
Sergey Masloff   (2004-08-10 20:48) [3]

...ПРОДОЛЖЕНИЕ

Ну дальше я читал просто как комикс, например

procedure SomeProc();
var
 F : TSomeFormType;
begin
 if SomeCond then
   F := TSomeFormType.Create(nil);
 {тут всякий разный код в том числе использующий F}
 with F do begin
   SomeMehod();
   SomeOtherMethod();
   try
     SomeThirdMethod();
   finally
     Free;
   end;
 end;
end;

Таких было 3 вхождения

Зато было очень много комментариев. В пяти местах встречалось

 inc(i); {увеличиваем i}
 // Мой коммент - лучше б написали за каким ИКСОМ тут i когда нигде дальше не используется


Но больше всего мне понравился следующий комментарий (ДОСЛОВНО):

END.//КОНЕЦ
{************  Конец модуля  *************************}


Кстати еще одна находка - переменные цикла вне цикла использовались В КАЖДОЙ процедуре в которой был цикл. Буквально в каждой.

И напоследок - зачем я это написал. Может быть чтобы показать какой я умный? - нет, это и так все знают ;-)))) Чтобы замеряться с кем - нибудь - нет.
 Просто этот код писали люди считающие себя профессиональными программистами. Работающие (надеюсь что работавшие) в серьезной конторе. Не вчерашние студенты - примерно мои ровесники, за 30.
 Так вот для чего я это пишу - ребята, кто делает первые шаги или чуть больше, запомните-так писать нельзя. Это может проканать раз, может два. Это переходит в привычку - так писать. А мир программистский тесен. Я, не самый общительный в мире человек хорошо знаю коллег из минимум полутора десятков серьезных компаний. Думаю многие знают больше. Мы общаемся, и я вполне могу скажем при приеме на работу кандидата обзвонить своих знакомых - не знают ли такого. И они мне могут позвонить - и звонят. Ну и как я отрекомендую авторов такого кода? Причем люди не стемнялись, с каждом комментарии авторы чуть ли не с копирайтами.

 Так что берегите честь смолоду! Вляпаться легко отмыться потом - намного сложнее. Шутка но всерьез.

 С уважением


 
nikkie ©   (2004-08-10 20:49) [4]

ну уже весело :))
ждем продолжения :)


 
Sergey Masloff   (2004-08-10 20:51) [5]

Rouse_ ©   (10.08.04 20:45) [2]
>Если верить {...
зуб даю ;-) - не исполльзуется.


 
DiamondShark ©   (2004-08-10 21:11) [6]


> Юрий Зотов ©   (10.08.04 20:38) [1]
> Если SomeCond и SomeOtherCond в коде № 2 связаны с вызовом
> процедур, то код все же может быть оправдан - он не зависит
> от используемой схемы вычисления булевских выражений. А
> его аналог:
> bOK := SomeCond or SomeOtherCond;
> от нее зависит (SomeOtherCond может вычисляться, а может
> и нет).

Вечер трудного дня?


 
Cobalt ©   (2004-08-10 21:12) [7]

А как товарищи матёрые программисты относятся к таким вот хинтам:
[Warning] Unit1.pas(584): Unsafe typecast of "Integer" to "TObject"
[Warning] Unit1.pas(616): Unsafe typecast of "TObject" to "Integer"
И код к ним:

 s2:=FieldByName("CompanyName").AsString;
  if pos(AnsiUpperCase(s),AnsiUpperCase(s2))<>0
  then ClLBox.Items.AddObject(s2,TObject(FieldByName("ID").AsInteger));
---------
CLFId:=integer(ClLBox.Items.Objects[ClLBox.ItemIndex]);


 
jack128 ©   (2004-08-10 21:14) [8]

не знаю как матерые, а я бы отключил в семерке предепреждения об unsafe коде ;-)


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

> DiamondShark ©   (10.08.04 21:11) [6]
У Вас?

> jack128 ©   (10.08.04 21:14) [8]
А кто мешает?


 
jack128 ©   (2004-08-10 21:27) [17]


> > jack128 ©   (10.08.04 21:14) [8]
> А кто мешает?

Мне? То что я на пятёрке сижу ;-)  А вот что Кобальту мешает - не знаю..


 
Cobalt ©   (2004-08-10 21:34) [18]

2 Юрий Зотов ©   (10.08.04 21:23) [16]
То есть, вы хотите сказать, что этот хинт указывает на возможные проблемы при переносе на .Net ?
И при отсутствии таких перспектив можно не обращать внимание на него и отключить?


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

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


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

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


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

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


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

> Cobalt ©   (10.08.04 21:34) [18]

Я так и сделал. А заодно отключил и предупреждения о платформенной зависимости. Потому что проект изначально писался, как чисто виндовый, никаких дотнетов и кроссплатформенности в нем даже и в перспективе не появится. Иначе проще будет новый написать.


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


> не знаю как матерые, а я бы отключил в семерке предепреждения
> об unsafe коде ;-)

Ага среди них правильных ворнингов не видно - этих слишком много :)
У себя их гашу даже не директивами а опциями.

+ platform - эти на кой?


 
Piter ©   (2004-08-10 22:09) [24]

Sergey Masloff   (10.08.04 20:48) [3]
Кстати еще одна находка - переменные цикла вне цикла использовались В КАЖДОЙ процедуре в которой был цикл. Буквально в каждой


ну я тоже так делаю. Если цикл уже отработал и локальная абстрактная переменная i уже не нужна - почему бы ее не задействовать? не объявлять же новую (можно, но зачем?).

А вообще - ну подумаешь что такое есть. Проект ведь компилировался с оптимизацией, значит все что объявлено, но не использовано - было выброшено компилятором. И получающийся код не такой уж и плохой.

А так ты же сам говорил про сроки, небось спешили, просто забыли убрать объявления переменных (может хотели по другому реализовать, но в спешке не стали).

Ну это я так. Склонен сегодня к адвокатству

Cobalt ©   (10.08.04 21:34) [18]
То есть, вы хотите сказать, что этот хинт указывает на возможные проблемы при переносе на .Net ?


это вообще может породить проблемы. Сам подумай - число приводишь к TObject - ясно, что это небезопасно. Компилятор же не может понять, что ты используешь ListBox для хранения строки и просто приписанного к нему числа...


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

GuAV ©   (10.08.04 22:02) [23]
Ага среди них правильных ворнингов не видно - этих слишком много :)


А у меня семерка по умолчанию никогда и не выводила warning на Unsafe код


 
Anatoly Podgoretsky ©   (2004-08-10 22:14) [26]

Злой ты человек, думал спать буду спокойно, но после такого не получится :-)


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

> Piter ©   (10.08.04 22:09) [24]

> Если цикл уже отработал и локальная абстрактная переменная i
> уже не нужна - почему бы ее не задействовать? не объявлять же
> новую (можно, но зачем?).

Используя счетчик цикла вне цикла, Вы заставляете компилятор разместить его обязательно в памяти. А без этого он мог бы разместить его в регистре.


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

Поправка к [27].

Хотя надо смотреть ассемблерный код - не исключено, что компилятор достаточно умен и все равно строит цикл по регистру.


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

> Кстати еще одна находка - переменные цикла вне цикла использовались
> В КАЖДОЙ процедуре в которой был цикл.

Я что-то никак раздуплить не могу :) Приведи код, а то не понятно что кого и в каких местах пользует :))


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

> Rouse_ ©   (10.08.04 22:31) [29]

Насколько я понял, имеется в виду вот что:

for I := ... to ... do
begin
 ...
end;
I := ...
... // дальше работаем с I


 
jack128 ©   (2004-08-10 22:37) [31]


> > Кстати еще одна находка - переменные цикла вне цикла использовались
>
> > В КАЖДОЙ процедуре в которой был цикл.
все таки я пока не понимаю всей "позорности" такой практики.. ЮЗ [27] - это не причина, ИМХО.


 
Sergey Masloff   (2004-08-10 22:41) [32]

Юрий Зотов ©   (10.08.04 22:34) [30]
Несколько хуже

for I := ... to ... do
begin
...
end;

I := ... <<== ЭТОГО не было. То есть именно работа с тем что там после цикла осталось

... // дальше работаем с I


 
GuAV ©   (2004-08-10 22:42) [33]


> А у меня семерка по умолчанию никогда и не выводила warning
> на Unsafe код

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


 
Ihor Osov'yak ©   (2004-08-10 22:43) [34]

2 Cobalt ©   (10.08.04 21:12) [7]

Нормально отношусь. Ибо по существу. Особенно в предверии перехода к дотнету.   Если же в коллекции вместо указателя ставим сознательно какой-то целочисельный идентификатор - что впрочем, есть вполне нормальной практикой в мире win32 - сознательно отключаем сотв. варнинг. Это один из тех немногих случаев, когда соотв. варнинги есть смысл отключать.


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

> Sergey Masloff   (10.08.04 22:41) [32]

Да-а-а... Слов нет, одни буквы. И это работало?


 
Sergey Masloff   (2004-08-10 22:52) [36]

Юрий Зотов ©   (10.08.04 22:47) [35]
>И это работало?
Ну вобщем, работало. Ну эпизодически происходили всякие побочные эффекты. Типа при запуске на одних и тех же данных то отрабатывало то нет, то обращение к памяти по 0 адресу но вобщем приемный акт им подписали да и использовалась программа все это время. С сегодняшнего дня правда не используется.


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

> [32] Sergey Masloff   (10.08.04 22:41)
Хм, даю пример:

for I := 0 to Len - 1 do
 if Buff[I] = Условие then Break;
if I < Len then (Выполняем операции с Buff[I])

Довольно нормальный код, или я не так понял и все намного запущеней?

ЗЫ: Я сам часто использую повторно переменные типа I после их повторной инициализации и только потому, что не вижу смысла создавать кучу временных переменных...


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

> Sergey Masloff   (10.08.04 22:52) [36]

> при запуске на одних и тех же данных то отрабатывало то нет,
> то обращение к памяти по 0 адресу

Неудивительно. Только я бы не называл это "работало".

> вобщем приемный акт им подписали

IMHO, поторопились. Стоило сначала посмотреть код.


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

> Rouse_ ©   (10.08.04 22:54) [37]

for I := 0 to Len - 1 do
if Buff[I] = Условие then Break;
if I < Len then (Выполняем операции с Buff[I]);

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


 
Rouse_ ©   (2004-08-10 23:01) [40]

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

В смысле ты имеешь ввиду если цикл пройдет до конца и условие не выполнится ни одного раза (не сработает Break)?


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

Юрий Зотов ©   (10.08.04 22:19) [27]
Используя счетчик цикла вне цикла, Вы заставляете компилятор


Юрий! Ну зачем ко мне обращаться на вы?! Даже не на вы, а на Вы!
А вообще интересно, спасибо. Не знал.

Sergey Masloff   (10.08.04 22:41) [32]
I := ... <<== ЭТОГО не было. То есть именно работа с тем что там после цикла осталось

... // дальше работаем с I


то есть, сразу работа со значением I? Это, конечно, другое дело совсем, это беспредел.

Но я вот что не понимаю. Если было просто забыто вновь инициализировать переменную - то как это все правильно работает? (ты говорил, что работает то все верно).

P.S. Если не ошибаюсь компилятор должен выдать предупреждение что-то типа неизвестного значения локальной переменной после выхода из цикла...


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

Sergey Masloff   (10.08.04 22:52) [36]
но вобщем приемный акт им подписали да и использовалась программа все это время. С сегодняшнего дня правда не используется


неужели так сложно было просто хотя бы окинуть код взглядом, это же все увидеть можно за минуту. Тем более вы ж деньги, видимо, платили. И немалые...


 
Sergey Masloff   (2004-08-10 23:10) [43]

Piter ©   (10.08.04 23:05) [41]
>Если не ошибаюсь компилятор должен
Не ошибаешься. Должен и выдавал. Только суперпрограммисты ж их не читают ;-)

>Но я вот что не понимаю. Если было просто забыто вновь >инициализировать переменную - то как это все правильно работает?
Да не забыто. Там на этом логика строится. То есть так и задумано. А как работало? Ну, писалось в лог не то сообщение (которое по индексу бралось). Ну, еще подобного рода фигня вылезала. "Основная" функциональность обеспечивалась. В какой-то мере ;-)


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

> Rouse_ ©   (10.08.04 23:01) [40]

Нет, не это. Если компилятор построил цикл по регистру, то, когда программа гонит цикл, его счетчик хранится не в памяти, а в регистре (например, в ECX). После выхода из цикла этот регистр используется уже совсем для другого и содержит совешенно другое значение, никак не связанное со счетчиком. А программа обращается к переменной I, которая хранится уже в памяти и тоже содержит какое-то значение, со счетчиком никак не связанное. В частности, если оно не было проинициализировано, то там будет любой случайный мусор.

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


 
GuAV ©   (2004-08-10 23:12) [45]


> В смысле ты имеешь ввиду если цикл пройдет до конца и условие
> не выполнится ни одного раза (не сработает Break)?

имхо если пусть Break сработал. но в цикле использована "переменная" регистр. а под повторное и будет или другая "переменная" регистр, или если даже место в стеке под эту выделят, в цикле её все равно юзать не будут
for + Ctrl+Alt+C


 
Sergey Masloff   (2004-08-10 23:13) [46]

Piter ©   (10.08.04 23:07) [42]
>неужели так сложно было просто хотя бы окинуть код взглядом, >это же все увидеть можно за минуту.
А чего я смотреть-то буду? Своих дел чтоли нет? Не я заказывал не я принимал. Как только ко мне попало я посмотрел.

>Тем более вы ж деньги, >видимо, платили. И немалые...
Ну насчет этого не знаю. Малые там или не малые - эту бухгалтерия пусть считает. Не моего ума дела. ИМХО за такое еще с них надо было денег взять ;-)


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

> [44] Юрий Зотов ©   (10.08.04 23:12)
Погоди, если я не ошибаюсь таким образом компилятор действует когда внутри цикла нет обращения к переменой - счетчику, но вот если к I всеже обращаются, то все работает нормально. Это кстати и ответ на вопрос многих, мол почему у меня цикл начитается не с начала до конца а с конца до начала (да потомучто так быстрее)...


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


> таким образом компилятор действует когда внутри цикла нет
> обращения к переменой

И когда есть ему часто бывает обращатся к ECX удобнее чем к "памяти"


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

> [48] GuAV ©   (10.08.04 23:20)
Хм... поэксперементирую, хотя и не замечал какогото странного его поведения


 
Cobalt ©   (2004-08-10 23:26) [50]

Там, наверное, ещё и оптимизация включена?


 
GuAV ©   (2004-08-10 23:30) [51]

procedure TForm1.FormCreate(Sender: TObject);
var S:string; I: Integer;
begin
 SetLength(S,10);
 for I:=10 downto 0 do S[I]:="G" // тута ставь бряку - EBX считает
end;


 
Sergey Masloff   (2004-08-10 23:38) [52]

хинты... варнинги... самое главное забыл. У меня сегодня младший пошел. Ну в смысле впервые своими ногами без посторонней помощи ;-)  Вот так.


 
Ihor Osov'yak ©   (2004-08-10 23:50) [53]

2 [52] Sergey Masloff   (10.08.04 23:38)

Поздравляю. Это событие. А хинты и варнинги - действительно, ну их.. Как говорится - думающему и так понятно, а не очень думающему доказывать... В общем-то есть более полезные занятия.


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

Rouse_ ©   (10.08.04 23:16) [47]
таким образом компилятор действует когда внутри цикла нет обращения к переменой - счетчику, но вот если к I всеже обращаются, то все работает нормально. Это кстати и ответ на вопрос многих, мол почему у меня цикл начитается не с начала до конца а с конца до начала


непонятно. Вообще-то компилятор строит цикл задом наперед даже если в цикле есть обращения к счетчику цикла - если я тебя правильно понял, то ты не прав :)


 
GuAV ©   (2004-08-11 00:46) [55]


> Вообще-то компилятор строит цикл задом наперед даже если
> в цикле есть обращения к счетчику цикла - если я тебя правильно
> понял, то ты не прав :)

Кажись Rouse_ имел ввиду, что если  есть обращения к счетчику, то компилятор _не_ перестроит цикл задом наперёд, потому лучше самому задом наперед построить...


 
Piter ©   (2004-08-11 00:52) [56]

GuAV ©   (11.08.04 0:46) [55]
Кажись Rouse_ имел ввиду, что если  есть обращения к счетчику, то компилятор _не_ перестроит цикл задом наперёд


так ведь я как раз о том и говорю, что перестроит.
И если мы его правильно понимает - то в данном пункте он не прав.


 
Zlodey   (2004-08-11 02:07) [57]

я не понимаю в чём здесь варнинг:

if (edtNOAnsh.Text="")
 or (StrToInt(edtNOAnsh.Text)>High(Longint))         //ругается здесь
 or (StrToInt(edtNOAnsh.Text)=0) then flag:=flag+1;  //не введён номер аншлага


Пишет Comparsion always evaluate to False


 
Piter ©   (2004-08-11 02:33) [58]

Zlodey   (11.08.04 2:07) [57]

Хех, а почему бы компиляторы не ругаться? :)

У тебя одно из условий:

StrToInt(edtNOAnsh.Text)>High(Longint)

High(Longint) это константа=2147483647
StrToInt возвращает число типа  Integer. То есть, МАКСИМУМ что оно может вернуть, это теже самые 2147483647

А как 2147483647 может быть больше чем 2147483647?

То есть, это условие ВСЕГДА ложно. Более того, у тебя там одни OR - поэтому в IF попадет ВСЕГДА False. То есть, оператор:

flag:=flag+1;

НИКОГДА НЕ БУДЕТ ВЫПОЛНЕН.

Теперь вопрос - ЗАЧЕМ писать эти строки, которые все равно никогда не будут выполнены. Более того, скорее всего эти комманды и компилироваться то не будут.


 
Aldor_   (2004-08-11 05:43) [59]


> Zlodey   (11.08.04 02:07) [57]
> if (edtNOAnsh.Text="")
>  or (StrToInt(edtNOAnsh.Text)>High(Longint))  

 LOOOL, смотрится очень прикольно :))))))))))
 Навереное, имелось в виду UnsignedInteger > High(Longint)), тогда не StrToInt использовать нужно, а Val напрямую.


 
Кщд ©   (2004-08-11 06:49) [60]

Piter ©   (11.08.04 02:33) [58]
истина или ложь=истина


 
Думкин ©   (2004-08-11 06:55) [61]

> [16] Юрий Зотов ©   (10.08.04 21:23)
> > DiamondShark ©   (10.08.04 21:11) [6]
> У Вас?

Имелось в виду, что код приведенный работает точно также как и при:
bOK := SomeCond or SomeOtherCond;


 
Думкин ©   (2004-08-11 07:07) [62]

> Думкин ©   (11.08.04 06:55)

Беру слова взад. При полной схеме не так. Звиняюсь.


 
noname_   (2004-08-11 08:23) [63]

2 Rouse_ © [37]

> for I := 0 to Len - 1 do
>  if Buff[I] = Условие then Break;
> if I < Len then (Выполняем операции с Buff[I])
>
> Довольно нормальный код, или я не так понял и все намного
> запущеней?

Справка Delphi, раздел "For statements":
"After the for statement terminates, the value of counter is undefined."


 
Rouse_ ©   (2004-08-11 09:29) [64]

> [56] Piter ©   (11.08.04 00:52)
Где я не прав?

procedure TForm1.Button1Click(Sender: TObject);
var
 I: Integer;
begin
 for I := 0 to 10 do
   Caption := "qwe";
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 I: Integer;
begin
 for I := 0 to 10 do
   if (i mod 2) = 1 then Caption := "qwe";
end;


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


 
Anatoly Podgoretsky ©   (2004-08-11 09:41) [65]

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


 
Rouse_ ©   (2004-08-11 09:49) [66]

В асме тоде все нормально. В первом случае DEC во втором INC


 
Anatoly Podgoretsky ©   (2004-08-11 10:02) [67]

Rouse_ ©   (11.08.04 09:49) [66]
Есть и другие случаи, я к тому что показания в отладчике могут отличаться от реального направления в коде. В коде может оказаться и два счетчики прямой для индексации и обратный для отсчета, а может быть и такая конструкция High(I)-I для прямой индексации и обратного отчета по I
У меня на сайте есть пару статей по АСМу там немного затрагивают и это.

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

Mov [sp], eax
Mov eax, [sp]


 
Vetek ©   (2004-08-11 11:10) [68]

помогите "избавиться" от хинта "Value assigned to "z1" never used"
код:

procedure SendCmd(Var q:string);
Var z1,z2,z3,z4,z5:integer; p11:string;
Begin
str((Length(q)+8):8,p11);
q:=p11+q;
z1:=0;z2:=0;
z3:=length(q);z4:=length(q);
metka:=gettickcount;
while true do begin
sleep(debugdelay);
buf2s:=z4;
buf2r:=z2;
fillchar(buf2,sizeOf(buf2),0);
if z3>snd then begin
for z5:=0 to snd-1 do
buf2[z5]:=q[z2+z5+1];
z1:=send(S,buf2,snd,0); end else begin
for z5:=0 to z3-1 do
buf2[z5]:=q[z2+z5+1];
z1:=send(S,buf2,z3,0);   end;
z2:=z2+z1;
z3:=z3-z1;
if (not(z1>0))then begin
form1.Statusbar1.SimpleText:="ошибка сокета отправки";
sleep(10);
if form1.CheckBox6.Checked then form1.button1.Click;
break;
end;
if (z2>=z4) then break;
end;
buf2s:=0;
buf2r:=0;
End;



эта процедура работает правильно, но этот хинт не даёт мне покоя ...
в коде- S- переменная типа TSocket;
buf2s,buf2r- переменные для контроля состояния отправки.


 
Григорьев Антон ©   (2004-08-11 11:13) [69]


> Vetek ©   (11.08.04 11:10) [68]
> помогите "избавиться" от хинта "Value assigned to "z1" never
> used"


По-хорошему, надо проверять, что вернула функция Send, а то вдруг связи уже нет, а вы всё данные посылаете. Но если вы считаете, что и без проверки обойдётесь, то лучше вызывать Send как процедуру, без использования значения. И Z1:=0 из 6-ой строки тоже выкинуть.

P.S. А имена переменных до жути информативные...


 
вразлет ©   (2004-08-11 11:16) [70]

Юрий Зотов ©   (10.08.04 23:12) [44]
> Rouse_ ©   (10.08.04 23:01) [40]

Нет, не это. Если компилятор построил цикл по регистру, то, когда программа гонит цикл, его счетчик хранится не в памяти, а в регистре (например, в ECX). После выхода из цикла этот регистр используется уже совсем для другого и содержит совешенно другое значение, никак не связанное со счетчиком. А программа обращается к переменной I, которая хранится уже в памяти и тоже содержит какое-то значение, со счетчиком никак не связанное. В частности, если оно не было проинициализировано, то там будет любой случайный мусор.

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


Я так понимаю это проблема именно Паскаля?


 
Anatoly Podgoretsky ©   (2004-08-11 11:17) [71]

Лень форматировать код, а продираться через линейный без оступов с гениальными имена тоже нет желания.


 
Danilka ©   (2004-08-11 11:19) [72]

[70] вразлет ©   (11.08.04 11:16)
> Я так понимаю это проблема именно Паскаля?

Думаю, разработчика. :)) Да и вообще, это не проблема. :))


 
Vetek ©   (2004-08-11 11:23) [73]

Григорьев Антон ©   (11.08.04 11:13) [69]
if (not(z1>0))then begin
form1.Statusbar1.SimpleText:="ошибка сокета отправки";
- проверка на наличие связи
- я эту процедуру использую во всех своих "сокетных" программах :))
- да, надо бужет изменить имена переменных ...
> И Z1:=0 из 6-ой строки тоже выкинуть.
- инициализировать не обязательно ?


 
вразлет ©   (2004-08-11 11:23) [74]

Danilka ©

Это понятно)


 
Sandman25 ©   (2004-08-11 11:23) [75]

if (not(z1>0))

->
if z1 <= 0


 
Григорьев Антон ©   (2004-08-11 11:33) [76]


> Vetek ©   (11.08.04 11:23) [73]
> Григорьев Антон ©   (11.08.04 11:13) [69]
> if (not(z1>0))then begin
> form1.Statusbar1.SimpleText:="ошибка сокета отправки";
> - проверка на наличие связи
> - я эту процедуру использую во всех своих "сокетных" программах
> :))


Прямо классика! Ошибка в 17-ой строке :))) Кроме шуток, в 17-ой строке вызывается z1:=send(...), а потом это значение нигде не используется.

> > И Z1:=0 из 6-ой строки тоже выкинуть.
> - инициализировать не обязательно ?

Так при первом присвоении она и инициализируется.

А вообще, Анатолий Подгорецкий прав. Просить людей разобраться с таким неформатированным кодом - это проявление неуважения, граничащего с хамством. Я замучался искать, какому end"у какой begin соответствует.


 
Игорь Шевченко ©   (2004-08-11 11:34) [77]

Sergey Masloff   (10.08.04 22:52) [36]


> >И это работало?
> Ну вобщем, работало. Ну эпизодически происходили всякие
> побочные эффекты. Типа при запуске на одних и тех же данных
> то отрабатывало то нет, то обращение к памяти по 0 адресу
> но вобщем приемный акт им подписали да и использовалась
> программа все это время.


Про код, это конечно интересно и поучительно :)
Я даже рад, что ты его выкладываешь с критикой :)


> У меня сегодня младший пошел. Ну в смысле впервые своими  
> ногами без посторонней помощи ;-)


Поздравляю! Ну их нафиг, хинты и варнинги :))

Rouse_ ©   (10.08.04 22:54) [37]

> for I := 0 to Len - 1 do
>  if Buff[I] = Условие then Break;
> if I < Len then (Выполняем операции с Buff[I])
>
> Довольно нормальный код, или я не так понял и все намного
> запущеней?
>
> ЗЫ: Я сам часто использую повторно переменные типа I после
> их повторной инициализации и только потому, что не вижу
> смысла создавать кучу временных переменных...


И что, компилятор молчит ? Сомневаюсь...


 
Плохиш ©   (2004-08-11 11:37) [78]


> Vetek ©   (11.08.04 11:23) [73]
> - инициализировать не обязательно ?

А смысл, если перед использованием ты ей всё равно новое значение присваиваешь.

PS. кстати см. [71] и ответь на вопрос: Почему ты нас так не уважаешь?


 
Danilka ©   (2004-08-11 11:41) [79]


> И что, компилятор молчит ? Сомневаюсь...

Еще как молчит, по-крайней мере на Д5. И по-моему на всех предыдущих версиях тоже молчал.


 
Vetek ©   (2004-08-11 11:42) [80]

Григорьев Антон ©   (11.08.04 11:33) [76]
//.. Просить людей разобраться с таким неформатированным кодом - //это проявление неуважения, граничащего с хамством. ...
ок, извините, понял, исправлюсь :)
- просто я всегда писал тока "для себя" - и об именах переменных и о форматировании кода думал в песледнюю очередь - по мне главное - чтобы правильно работало ..


 
Danilka ©   (2004-08-11 11:45) [81]


> по мне главное - чтобы правильно работало ..

"чем лучше отформатировано, тем правильнее работает."
примета народная. :))


 
Юрий Зотов ©   (2004-08-11 12:49) [82]

> Sergey Masloff   (10.08.04 23:38) [52]
> У меня сегодня младший пошел.

Поздравляю. Но это и есть самый серьезный варнинг - мол, начинай готовиться к свадьбе, папаша.
:о)

> вразлет ©   (11.08.04 11:16) [70]
> Я так понимаю это проблема именно Паскаля?

Во-первых, это вообще никакая не проблема. А если и проблема, то не Паскаля, а тех программистов, которые:
- не понимают, как устроен используемый ими компилятор;
- не хотят читать справку и следовать ее рекомендациям.

Во-вторых, такая фича присуща многим компиляторам, так что Паскаль здесь уж точно ни при чем.


 
Ihor Osov'yak ©   (2004-08-11 13:07) [83]

2 [80] Vetek ©   (11.08.04 11:42)

> просто я всегда писал тока "для себя" - и об именах переменных и о форматировании кода думал в песледнюю очередь - по мне главное - чтобы правильно работало ..

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


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


> просто я всегда писал тока "для себя" - и об именах переменных
> и о форматировании кода думал в песледнюю очередь
странно. Я тоже в первою очередь думаю о себе - и именно по этому даю переменным информативные имена и стараюсь нормально код форматировать ;-)


 
Ajax ©   (2004-08-11 14:12) [85]

А как бы Мастер поборол варнинг на таком вот коде?

var
 wnd : HWND;
 Param : LPARAM;
...
begin
...
if wnd=Param then SomeAсtion;
...
end;


Причем справку я по этой теме прочитал, но что-то так и не пойму как сделать, чтобы было правильно.


 
Игорь Шевченко ©   (2004-08-11 14:14) [86]


> if wnd=Param then SomeAсtion;


if wnd = HWND(Param) then


 
Anatoly Podgoretsky ©   (2004-08-11 14:17) [87]

jack128 ©   (11.08.04 13:12) [84]
Именно так, речь не про уважения нас, а про уважение самого себя :-)


 
Piter ©   (2004-08-11 18:30) [88]

Кщд ©   (11.08.04 6:49) [60]
истина или ложь=истина


ну да. Просто было поздно, ступил. Тогда компилятор ругался просто, что одно из условий в IF всегда ложно - зачем оно тогда нужно?

Rouse_ ©   (11.08.04 9:29) [64]
В жирных местах ставь бряк и смотри что в первом случае счетчик крутится с конца на начало а во втором как и было задумано.
Не понимаю, что тут можно не понять и где я был не прав? :)


хех. Тогда ты будешь очень удивлен следующим примером (собственно, я сам долго искал причину в аналогичного коде, пока не рассмеялся себе в лицо):

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 ArrS: array[0..10] of string;
begin
for i:=0 to 9 do
 ArrS[i]:=ArrS[i+1]; // ЗДЕСЬ БРЕКПОИНТ
end;


теперь запусти программу и посмотри значение i на первом же брекпоинте - что теперь скажешь? Оптимизация, конечно, должна быть включена.
Я даже писал о таком Александру Мальгину - создателю раздела "Подводные камни" на "Королевстве". Но он отвечал, что поведение FOR давно разобрано на королевстве...

Игорь Шевченко ©   (11.08.04 11:34) [77]
> ЗЫ: Я сам часто использую повторно переменные типа I после
> их повторной инициализации и только потому, что не вижу
> смысла создавать кучу временных переменных...

И что, компилятор молчит ? Сомневаюсь...


ИГОРЬ! А что ему говорить? По-моему, все верно. Переменная заново проинициализирована (это необходимо, так как после выхода из цикла у нее неопределенное значение). Ее жизнь считай начиналась заново. Почему бы ее не использовать еще раз? Компилятор естественно молчит.


 
Юрий Зотов ©   (2004-08-11 19:49) [89]

> Piter ©   (11.08.04 18:30) [88]

Все же проверьте в окне CPU. Если компилятор все равно строит цикл по регистру, то все ОК. А если по ячейке памяти, то лучше объявить отдельную переменную.


 
Piter ©   (2004-08-12 12:07) [90]

Юрий Зотов ©   (11.08.04 19:49) [89]
Все же проверьте в окне CPU


можео на ты!

Rouse_, ну как, оценил?


 
Юрий Зотов ©   (2004-08-12 12:15) [91]

> Piter ©   (12.08.04 12:07) [90]

Sorry, забыл. Впредь попробую не забывать.


 
noname_   (2004-08-12 13:02) [92]

2 Piter © [88]
> ... будешь очень удивлен следующим примером ...

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

Ошибка была бы, если результат работы оптимизированного кода отличался от неоптимизированного.


 
Яод   (2004-08-12 13:13) [93]

noname_
а все-таки, какой результат-то? Случайный?


 
Яод   (2004-08-12 13:20) [94]

Насчет переменных, которые могут быть неициализированы с точки зрения компилятора: покажите код постороннему человеку, он тоже будет сначала недоумевать, почему да как.
Видимо надо компилятору изначально каким-то образом задавать выражения, которые будут считаться верными в данном куске кода, примерно такое-же есть в мат-пакетах, там тоже по другому тогда оптимизация и работа с формулами идет. Что-то типа Assertion, но для компилятора


 
Vycheslav Maslow   (2004-08-12 13:45) [95]

i:=0;
SetLength(BuffMass,indexline);
if ActivLine[1]=true then begin
buffmass[i]:=StringGreen1;
Inc(i);
end;
if ActivLine[2]=true then begin
buffmass[i]:=StringGreen2;
Inc(i);
end;
if ActivLine[3]=true then begin
buffmass[i]:=StringGreen3;
Inc(i);
end;
if ActivLine[4]=true then begin
buffmass[i]:=StringGreen4;
Inc(i);
end;
if ActivLine[5]=true then begin
buffmass[i]:=StringGreen5;
Inc(i);
end;
i:=0;


 
Vycheslav Maslow   (2004-08-12 13:47) [96]

Удалено модератором
Примечание: Дубль


 
noname_   (2004-08-12 13:51) [97]

2 Яод [93]
> а все-таки, какой результат-то? Случайный?

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


 
Piter ©   (2004-08-13 12:01) [98]

noname_   (12.08.04 13:51) [97]
от режима оптимизации он не меняется


естественно. А кто говорил обратное?

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


 
olookin ©   (2004-08-13 15:20) [99]

А каковы причины появление warnings? Я вот ради интереса у себя посмотрел. Много нашел. Вот один работает на такой код:

var c: Char;
   leading: integer;
begin
..тут код
 f.Read(c,SizeOf(c));
 if (c="F") or (c="S") then begin
   if c="F" then leading:=2;
   if c="S" then leading:=2;
   .. не надо обращать внимание на одинаковость реакции на условие - это не признак скудоумия, а результат лени при переделке другой процедуры
 end
 else
 leading:=3;
..тут снова код
 if (leading=3) and (ver<>0) then .. а тут warning "Variable "leading" might not have been initialized".
Итак, в чем смысл указанного warninga?


 
Юрий Зотов ©   (2004-08-13 15:46) [100]

> olookin ©   (13.08.04 15:20) [99]

> Итак, в чем смысл указанного warninga?

В том, что компилятор - это не искусственный интеллект, смысла Вашего кода понять не может и не собирается. Поэтому он не знает, что у Вас охвачены ВСЕ возможные варанты C и Leading будет проинициализирована ВСЕГДА. Он видит, что по СТРУКТУРЕ кода этого может и не быть - вот и предупреждает.

И правильно делает, потому что код действительно корявый. НЕКОРЯВЫЙ же код всегда прекрасно понимается компилятором и никаких варнингов не будет. Выкиньте все эти многократные IF"ы и напишите эффективно, просто и понятно ВСЕМ, в том числе и компилятору:

case C of
 "F": Leading := ...;
 "S": Leading := ...;
 ...
 else
   Leading := ...
end;


 
olookin ©   (2004-08-13 15:59) [101]

Ага. Виноват интеллект, да? А тут?:

нажатие на кнопку

  IsoPart:=RadioGroup1.ItemIndex;
  и вызов процедуры

в этой вызванной процедуре рекуррентно вызывается еще одна процедура, в которой warning:

 case IsoPart of
 0: begin fp:=0;
      tp:=Length(rv)-1;
      n:=trunc(Length(rv)/IsoPoints);
    end;
 1: begin fp:=0;  tp:=p;
      n:=trunc(p/IsoPoints);
    end;
 2: begin fp:=p;
      tp:=Length(rv)-1;
      n:=trunc((Length(rv)-p)/IsoPoints);
    end;
 end;
...
 for i:=fp to tp do //warning "Variable "fp" might not have и т.д.

Что теперь? Тоже виноват интеллект? Или тоже коряво?


 
olookin ©   (2004-08-13 16:01) [102]

Да. Упомяну, что у меня в свойствах RadioGroup1 стоит ItemIndex=0. И что нигде иначе вызов куска с fp не происходит, кроме как по нажатию на кнопку.


 
nikkie ©   (2004-08-13 16:08) [103]

а завтра ты добавишь в RadioGroup новый элемент, а case свой поправить забудешь...


 
olookin ©   (2004-08-13 16:09) [104]

[103] nikkie ©   (13.08.04 16:08)

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


 
Игорь Шевченко ©   (2004-08-13 16:12) [105]

olookin ©   (13.08.04 15:59) [101]


> Что теперь? Тоже виноват интеллект? Или тоже коряво?


Если нет else от case, то второе.

Компилятор писали очень неглупые люди, и warning"и он выдает совсем не зря.


 
Sandman25 ©   (2004-08-13 16:12) [106]

[101] olookin ©   (13.08.04 15:59)

Неужели трудно завести свой перечислимый тип
TMyType = (mtSmysl1, mtSmysl2, mtSmysl3) и использовать
case TMyType(rgSmysl.ItemIndex) of
 mtSmysl1:
...

Я уже за использование цифр в именах переменных и выражениях расстреливать готов...


 
olookin ©   (2004-08-13 16:24) [107]

[105] Игорь Шевченко ©   (13.08.04 16:12)

Итак, чтобы считать себя писателем АБСОЛЮТНО корректного кода, я должен прописывать все варианты. Я так понял. Но я не понял - зачем это нужно(разумеется для пользователя конечной программы, а не для эстафетчика)? На моем приведенном примере невозможно действие пользователя, которое бы привело к возникновению ошибки. Равно как и я знаю, что выполняю этот код по совершенно определнному действию пользователя. Следовательно, ситуация выглядит так: компилятор мне кричит о потенциальной ошибке, однако эта ошибка возникнет лишь тогда, когда я сам захочу этого. Более того, компилятор говорит мне, что избавиться от потенциальной ошибки можно, добавив еще кода. Т.е. увеличив размер исполняемого файла, и конечно с моими временными и не только затратами. Мне это не подходит.

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

[106] Sandman25 ©   (13.08.04 16:12)

Я делаю это только тогда, когда это имеет смысл. Т.е. тогда, когда подобная конструкция встречается N раз, при N>3.

А насчет цифр в именах я не понял...


 
Sandman25 ©   (2004-08-13 16:27) [108]

>А насчет цифр в именах я не понял...

RadioGroup1.ItemIndex

Правда, сразу становится ясна смысловая нагрузка данного компонента?
и особенно ясно, почему код в if RadioGroup1.ItemIndex = 1 именно такой, какой он есть...


 
Мюмзик в мове   (2004-08-13 16:30) [109]

olookin ©

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

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


 
Sandman25 ©   (2004-08-13 16:32) [110]

Я считаю, что обращать внимания на warnings и hints не следует.

+ на имена переменных + на стиль кода?


 
Игорь Шевченко ©   (2004-08-13 16:34) [111]


> Итак, чтобы считать себя писателем АБСОЛЮТНО корректного
> кода, я должен прописывать все варианты. Я так понял. Но
> я не понял - зачем это нужно(разумеется для пользователя
> конечной программы, а не для эстафетчика)?


А пользователю вообще пофиг, как код написан, ему надо, чтобы программа выполняла нужные ему функции. Желательно так, как задумано.


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


Ошибка чаще всего возникает, когда ты этого не хочешь.


> Пожалуй, самое время озвучить мое мнение по поводу темы
> ветки - Я считаю, что обращать внимания на warnings и hints
> не следует.


Твое право, можешь делать все, что тебе хочется.

Кто-то завел ветку про Image Editor, кстати...Там, судя по всему, тоже придерживались твоей философии, что нефиг обращать внимания на код.


 
Юрий Зотов ©   (2004-08-13 16:38) [112]

> olookin ©   (13.08.04 16:09) [104]

Что спорить?

Пишите, как Вам хочется. Можете не обращать внимания ни на какие варнинги, никто Вас не заставляет этого делать. Вам просто показывают приемы и примеры написания НАДЕЖНОГО кода. Не нравится - пишите НЕнадежный, дело хозяйское. Только потом не удивляйтесь невесть откуда взявшимся глюкам.

Вы спросили, в чем смысл варнинга. Вам объяснили. И почему-то вместо "спасибо" Вы начали спорить непонятно о чем.

Кстати, уже не в первый раз. Елы-палы, если Вам так не нравятся ответы, зачем задавать вопросы?

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


 
olookin ©   (2004-08-13 16:41) [113]

[111] Игорь Шевченко ©   (13.08.04 16:34)

Про Image Editor я завел ветку, не припомню только, чтобы там такое говорилось...

>>Там, судя по всему, тоже придерживались твоей философии, что нефиг обращать внимания на код.

Нет у меня такой философии. Впрочем, как я считаю, неработавши ни разу в команде - если ты даешь кому-то свой код за так (неважно, корявый или нет), то ты освобожден от любых обязательств к его оформлению. А все другие случаи не в моей юрисдикции, это уж решает сам кто как хочет. Лично я парится из-за оформления и обсасывания кода, который кому-то вдруг понадобился, не буду. А сам в своем коде пока разбираюсь без особых проблем. Причем пишу я его, как ты помнишь может быть, квадратиками (припоминаю, как ты говорил о том, что если я вдруг впредь буду у кого просить совета и давать код, то должен буду его оформить соответствующе). Ну так вот для этого я конечно постараюсь. А сам для себя - не буду. Вот моя философия.


 
Игорь Шевченко ©   (2004-08-13 16:44) [114]

olookin ©   (13.08.04 16:41) [113]


> Впрочем, как я считаю, неработавши ни разу в команде - если
> ты даешь кому-то свой код за так (неважно, корявый или нет),
> то ты освобожден от любых обязательств к его оформлению


Разумеется. Если ты найдешь того, кто его возьмет "за так" :)

Охота тебе писать квадратиками - пиши :) Никто тебя не заставляет писать иначе, до тех пор, пока ты не просишь по написанному консультации.


 
nikkie ©   (2004-08-13 16:44) [115]

>А... Т.е. как однако ж далеко загядывает компилятор...
это не компилятор далеко заглядывает, это ты в голове держишь, что
1. IsoPart устанавливается в значение ItemIndex, а dfm такой, что это значение может быть только 0,1,2.
2. IsoPart всегда правильно проинициализирован перед вызовом процедуры.

компилятор же смотрит на это проще. в твоей процедуре используется integer процедура. при любом значении, кроме 0,1,2 fp у тебя не инициализируется. компилятор не волнует, какая у тебя логика и правильно ли ты закодировал ее. он тебе говорит - fp может быть не инициализирована. и он прав. если тебе не хочется писать else или инициализировать fp перед case, можешь объявить IsoPart как enum.


 
VMcL ©   (2004-08-13 16:48) [116]

>>olookin ©  (13.08.04 16:41) [113]

>Ну так вот для этого я конечно постараюсь. А сам для себя - не буду.

Хммм. Я в первую очередь код пишу для себя, даже если работаю в команде. Веришь или нет, но хорошо отформатированный код читается и понимается быстрее, чем плохо/не- отформатированный. А как же не постараться для себя-то любимого?


 
nikkie ©   (2004-08-13 16:51) [117]

вместо "integer процедура" читать "integer переменная"


 
Юрий Зотов ©   (2004-08-13 16:53) [118]

> All

Обратите внимание:
> неработавши ни разу в команде

Вот и вся причина. Объяснять бесполезно.


 
GuAV ©   (2004-08-13 17:03) [119]


> Все же проверьте в окне CPU. Если компилятор все равно строит
> цикл по регистру, то все ОК. А если по ячейке памяти, то
> лучше объявить отдельную переменную.

Хм... я наблюдал такое, то компилятор считал эти фактически разными переменными. Например, проверьте это:
procedure TForm1.FormCreate(Sender: TObject);
var I, J: Integer;
begin
 for J:=7 to 10 do ShowMessage("Hey"); // I - EBX
 I:=3;  // I - EAX
 J:=I;  // J - EBX
 Tag:=J;
end;


 
GuAV ©   (2004-08-13 17:07) [120]

GuAV ©   (13.08.04 17:03) [119]
Точнее нет, не то - пропробовал так
procedure TForm1.FormCreate(Sender: TObject);
var I, J: Integer;
begin
 for I:=7 to 10 do ShowMessage("Hey");
 I:=3;
 Tag:=Integer(@I);
end;

так переменная цикла - в стеке, т.е. Вы правы, нужна отдельная.


 
Думкин ©   (2004-08-13 17:09) [121]

> [107] olookin ©   (13.08.04 16:24)
> Итак, чтобы считать себя писателем АБСОЛЮТНО корректного
> кода, я должен прописывать все варианты. Я так понял. Но
> я не понял - зачем это нужно(разумеется для пользователя
> конечной программы, а не для эстафетчика)?

Код - это твое общение с компилятором. Не более. Хочешь с ним матом - матерись. Но и не менее. Он с тобой общается а не спользователем, а спользователем будешь общатся ты, а не он. Но он тебя всего лишь ПРЕДУПРЕЖДАЛ. Когда твой опыт выйдет дальше наколенок - поговорим.


 
Sandman25 ©   (2004-08-13 17:15) [122]

Какая разница, в команде ты или нет.
Даже без команды может быть столько кода...
Да и вообще, что это за программа, если все ее нюансы можно в голове удержать?! :)


 
Думкин ©   (2004-08-13 17:18) [123]

>  [122] Sandman25 ©   (13.08.04 17:15)

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


 
Sandman25 ©   (2004-08-13 17:20) [124]

[123] Думкин ©   (13.08.04 17:18)

Ну так. Я за 2 года практически полностью забыл java, потом по своим же исходникам фактически заново язык учил :)


 
Anatoly Podgoretsky ©   (2004-08-13 17:25) [125]

Думкин ©   (13.08.04 17:09) [121]
Э нет это только на первых порах ты с компилятором материшься, а вот потом уже материшься с кодом, точнее на него.


 
Григорьев Антон ©   (2004-08-13 17:38) [126]

Случайно наткнулся на такую фичу компилятора Delphi 7 (думаю, в других версиях будет то же самое):

procedure DoSomething;
var S:string;
 begin
  S:="Some text constant";  {*}
 end;

Компилятор не даёт никаких хинтов на строке {*}, хотя, по идее, должен. Почему это происходит, в общем, понятно: S потом неявно используется при финализации. Но нам то от этого не легче - это ничуть не лучше, чем если бы там стояла, например, целая переменная, не нуждающаяся в финализации. Это всё я к тому, что компилятор всё-таки глупее человека, и поэтому впадать в крайность и стремиться к безусловному удалению всех хинтов и ворнингов, ИМХО, всё же не стоит.


 
VMcL ©   (2004-08-13 17:44) [127]

>>Григорьев Антон ©  (13.08.04 17:38) [126]

В моих персональных проектах нет ни одного хинта и ни одного ворнинга, когда выпускается релиз.


 
olookin ©   (2004-08-13 17:51) [128]

[118] Юрий Зотов ©   (13.08.04 16:53)
>>Вот и вся причина. Объяснять бесполезно.

Хм... Никто и не просит объяснять. Насчет зеркальца - я задал вопрос, я получил на него ответ, я потрепался о том и о сем. Это какой форум? Хотите критиковать меня за то, что я выражаю свои мысли так, а не иначе - вперед. Это ваше право.

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

[121] Думкин ©   (13.08.04 17:09)
>>Когда твой опыт выйдет дальше наколенок - поговорим.

Когда что?


 
olookin ©   (2004-08-13 17:52) [129]

[116] VMcL ©   (13.08.04 16:48)

С моей точки зрения мой код хорошо отформатирован


 
Anatoly Podgoretsky ©   (2004-08-13 17:52) [130]

Григорьев Антон ©   (13.08.04 17:38) [126]

procedure X;
var
  S: string;
  I: integer;
begin
  S := "avc";
  I := 1;
end;

У компилятора особое отношение к string, вот за Integer он ругнется, может потому что string резервирумое имя, а Integer нет. Не знаю, так просто дикое предположение.


 
nikkie ©   (2004-08-13 17:57) [131]

>[130] Anatoly Podgoretsky
читаем внимательно:
[126] Григорьев Антон
Почему это происходит, в общем, понятно: S потом неявно используется при финализации.


 
Anatoly Podgoretsky ©   (2004-08-13 18:00) [132]

nikkie ©   (13.08.04 17:57) [131]
Понял, это означает, что используется, каюсь не обратил внимание на это замечание. Этим все объясняется.


 
Piter ©   (2004-08-13 18:07) [133]

Нет у меня такой философии. Впрочем, как я считаю, неработавши ни разу в команде - если ты даешь кому-то свой код за так (неважно, корявый или нет), то ты освобожден от любых обязательств к его оформлению. А все другие случаи не в моей юрисдикции, это уж решает сам кто как хочет. Лично я парится из-за оформления и обсасывания кода, который кому-то вдруг понадобился, не буду. А сам в своем коде пока разбираюсь без особых проблем. Причем пишу я его, как ты помнишь может быть, квадратиками (припоминаю, как ты говорил о том, что если я вдруг впредь буду у кого просить совета и давать код, то должен буду его оформить соответствующе). Ну так вот для этого я конечно постараюсь. А сам для себя - не буду. Вот моя философия

ты никогда не писал серьезных программ. Учить и вдалбливать тут невозможно - как только попробуешь написать нечтно серьезное (в рамках одного человека) - поймешь сам. 100%

P.S. Ну или просто не доведешь проект до конца


 
Piter ©   (2004-08-13 18:11) [134]

Григорьев Антон ©   (13.08.04 17:38) [126]
поэтому впадать в крайность и стремиться к безусловному удалению всех хинтов и ворнингов, ИМХО, всё же не стоит


что-то я не понял, как ты пришел к такому заключению.

Из того, что компилятор НЕ ВЫДАЛ ПРЕДУПРЕЖДЕНИЯ, ты заключил, что на некоторые предупреждения можно не обращать внимания? :)))

Может, вывод и правильный, но он никак не следует из опыта


 
Юрий Зотов ©   (2004-08-13 18:25) [135]

> olookin ©   (13.08.04 17:51) [128]

Похоже, мистер спорщик, что Вы даже и не задумываетесь над тем, а стоит ли Вам спорить по тем вопросам, где Ваш опыт и знания на порядок меньше, чем у оппонентов.

Значит, объяснять действительно бесполезно. Видимо, это черта характера такая - спорить с кем угодно и о чем угодно. А правду воспринимать, как личную обиду.


 
Игорь Шевченко ©   (2004-08-13 21:12) [136]

Григорьев Антон ©   (13.08.04 17:38) [126]


> впадать в крайность и стремиться к безусловному удалению
> всех хинтов и ворнингов, ИМХО, всё же не стоит.


Это не крайность, это норма.

Компилятор не так глуп, как кажется, потому что описанная конструкция со строкой, с точки зрения компилятора, выглядит примерно так:


var
 S: string;
begin
 S := string.Init;
 try
   S.Assign ("Some string");
 finally
   S.Clear;
 end;
end;


И это документировано в Object Pascal Language Guide.


 
olookin ©   (2004-08-14 09:28) [137]

Piter ©   (13.08.04 18:07) [133]
Юрий Зотов ©   (13.08.04 18:25) [135]

Поражаюсь я на вас обоих. Вы что, в курсе моих работ? Их серьезности? Или вы считаете, что если я игнорирую warnings или пишу корявый код - то я не способен написать серьезную программу? Только поэтому? В таком случае я бы вам посоветовал - прежде чем кидаться словами, покажите свои результаты, а не куски мыслей, кода, глубокомысленных утверждений или цитат. Впрочем, это не повлияет на мой стиль, мои проекты и мои ошибки в моих проектах. Просто так я буду уверен, что имею дело с профессионалами, причем не в написании кода и знании теории, а именно результата. А до тех пор ЛИЧНО МНЕ кажется что такие как вы - это любители порассуждать на глубокие темы. Не более того.

И отдельно МИСТЕРУ Зотову. По поводу

"Похоже, мистер спорщик, что Вы даже и не задумываетесь над тем, а стоит ли Вам спорить по тем вопросам, где Ваш опыт и знания на порядок меньше, чем у оппонентов. Значит, объяснять действительно бесполезно. Видимо, это черта характера такая - спорить с кем угодно и о чем угодно. А правду воспринимать, как личную обиду."

В той самой ветке про компоненты, в которой вы так активно дергались, вы, возможно, и были правы. При этом, даже там ЛИЧНО МНЕ вы не принесли пользы, потому как ЛИЧНО Я обошелся без ваших советов. В этой ветке я дал кусок своего кода и спросил, что в нем такого, что могло бы вызвать warnings. Вы ответили мне сразу же, но не поленились сказать, что "И правильно делает, потому что код действительно корявый.", хотя я до этого о корявости не говорил. Хм, подумал я. Мой код ведь работает, и ошибок в том месте не возникает, и вообще я могу любое условие написать так и эдак - это позволяет сам компилятор. А МИСТЕР Зотов вдруг о корявости говорит. Странно, я ведь его (и других) спрашивал не о том, коряв ли мой код, а о смысле появления warning.

Хорошо, в конце концов, критика не вредит. И действительно мой код коряв. И действительно, не знал, что можно case для символов использовать. Я даже с указателями почти не умею работать. Так ведь я никогда и не говорил, что я профессионал в программировании. Но! Те задачи, которые я решал в программировании, я решил без использования этих указателей, но ведь решил! Сам. И работает. И пользуются другие люди, хоть их и немного. И уверяю, что я не пишу блокноты и калькуляторы. Я не программист как таковой, я не этим занимаюсь, и мне сложно оценивать правильность своего и чужого кода. Но я сделал реальную программу для реальных задач, которая меня устраивает и на которую я потратил несколько лет. Да, мне глубоко безразлично, какого вы мнения о моих программах. Но мне не безразлична ситуация, когда НЕПОНЯТНО КТО ТАКОЙ СИДИТ НА ФОРУМЕ ЗА СОТНИ КИЛОМЕТРОВ И РАССУЖДАЕТ О МОЕЙ КВАЛИФИКАЦИИ, что называется, за глаза. Вот это и обидно. Это я действительно воспринимаю как личную обиду, с той только разницей по отношению к вашим словам, что она НЕ есть правда. Хотя, разумеется, это обидно ровно столько, сколько я помню об этом разговоре.

Ну а Вы то, МИСТЕР Зотов? Вы давите своими знаниями всех и вся, и это хорошо. Вы давите пусть не всех, но меня своим апломбом. Хм, почему вы вообще здесь торчите, на каком-то форуме? Почему вы до сих пор не работаете в Borland? Не потому-ли, что вам больше по душе поговорить, порассуждать, поучить, пожурить или просто откритиковать, нежели чем сделать что-то реальное.

Кстати говоря, эти мои последние слова вызваны следующим наблюдением. Я вот часто вижу МИСТЕРА Зотова здесь и в других форумах. Очень часто. Настолько часто, что начинаю вопрошать - а когда ж он находит время поработать? Ведь надо все-таки ветку прочитать + обдумать + написать ответ. Возможно, что я неправ в этом выводе, но честное слово, я в рабочее время позволяю себе не более 5-7 ответов за день, а уходит у меня на это 20-30 минут.

Итак, мораль. Если МИСТЕР Зотов готов кусать меня по поводу моего профессионализма - я готов кусать его по поводу его недостаточно высокого виртуального морального облика. Надоело мне выслушивать от МИСТЕРА Зотова нравоучения, которыми он злоупотребляет.

Вот такой опус получился.


 
Юрий Зотов ©   (2004-08-14 23:42) [138]

> olookin ©   (14.08.04 09:28) [137]

Получился даже не один опус, а сразу несколько.

Опус № 1.

> Или вы считаете, что если я игнорирую warnings или пишу
> корявый код - то я не способен написать серьезную
> программу?

> И действительно мой код коряв. И действительно, не знал, что
> можно case для символов использовать. Я даже с указателями
> почти не умею работать.


Опус № 2.

> Хорошо, в конце концов, критика не вредит.

> Это я действительно воспринимаю как личную обиду,

Опус № 3.

> Вы давите своими знаниями всех и вся, и это хорошо.

Опус № 4.

> Вы давите пусть не всех, но меня своим апломбом.

Опус № 5.

> Я вот часто вижу МИСТЕРА Зотова здесь и в других форумах.
> Очень часто. Настолько часто, что начинаю вопрошать - а когда
> ж он находит время поработать?

====================================================

Вот такие вот опусы получились, обидчивый Вы наш. Одно сплошное LOL.

:о)


 
Anatoly Podgoretsky ©   (2004-08-15 08:14) [139]

Как подборка для орешника, чтобы составители не тратили время.


 
olookin ©   (2004-08-15 08:39) [140]

[138] Юрий Зотов ©   (14.08.04 23:42)

Хм, ну ваш ответ подтверждает мое мнение. Балабол вы, батенька. Просто балабол. Вы все принимаете через свой фильтр. Как работает ваш фильтр - видно на примере вашего 138-го ответа. Вот он, весь ваш фильтр. Вот оно - ваше мышление. Подергали из контекста - и все, готов ответ.

Не знаю, надо оно вам вообще, но все-таки. Поучились бы вы быть более самокритичным. Ничему вас не учит мнение других людей. Ну и ладно.

PS Думал, что вы более серьезный человек.


 
app ©   (2004-08-15 08:43) [141]

Прошу обеих в персональную переписку.


 
olookin ©   (2004-08-15 09:10) [142]

[141] app ©   (15.08.04 08:43)

Ок, я больше ни слова в адрес МИСТЕРА Зотова не скажу.


 
olookin ©   (2004-08-15 09:10) [143]

[141] app ©   (15.08.04 08:43)
Прошу обеих в персональную переписку.

Только не обеих, а обоих.


 
Юрий Зотов ©   (2004-08-15 09:19) [144]

> olookin ©   (15.08.04 08:39) [140]

Поскольку Ваше сообщение [137] содержит переход на личности, его, видимо, удалят. Поэтому в [138] я решил его процитировать - такие опусы не должны пропадать. Их чтение продлевает жизнь.

Поскольку Ваше сообщение [138] тоже содержит переход на личности (и даже прямые оскорбления), его, видимо, тоже удалят. А жаль - Вы нарисовали великолепный автопортрет.

Помнится, знавал я одного человека. Странная была у него особенность. Например, если у него что-то не получалось, то он задавал вопрос более опытным людям: "что неправильно"? Странно, конечно, не это, а то, что когда ему отвечали и объясняли, что и почему у него неправильно, то он обижался и начинал спорить. А когда ему говорили: "ну что ты споришь о том, в чем толком не разбираешься, ведь ты же делаешь действительно неправильно, у тебя просто не хватает знаний, чтобы это понять", то он обижался еще сильнее и начинал уже просто обзываться.

А самое интересное, что при этом он еще и советовал другим "быть более самокритичными".

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

Действительно интересный человек, не правда ли? Мне кажется, что ему бывает непросто жить на этом свете, причем его истинная проблема сидит в нем же самом. Но представляете, как он обидится, если посоветовать ему поговорить, например, с психологом? Хотя это было бы лучше для него же.

Тупик, однако. Вот что бы Вы ему посоветовали?


 
Юрий Зотов ©   (2004-08-15 09:21) [145]

> app ©   (15.08.04 08:43) [141]

Сорри, когда постил [144], еще не видел [141].
Действительно, пора завязывать.


 
olookin ©   (2004-08-15 09:23) [146]

[144] Юрий Зотов ©   (15.08.04 09:19)

Удалят не только мои сообщения, так как и другие имеют непосредственные ко мне отношения (по поводу перехода на личности), если конечно здесь нет критерия отбора "правильных" и "неправильных" сообщений. Как заметил app, будем выяснять дальше? - тогда по мылу или как либо еще. Здесь не буду.


 
Sergey_Masloff   (2004-08-15 11:46) [147]

olookin ©   (15.08.04 09:10) [143]
>Только не обеих, а обоих.
Так, русского языка тоже не знаем ;-)


 
Юрий Зотов ©   (2004-08-15 16:02) [148]

> olookin ©   (15.08.04 09:23) [146]

Чего-о-о? С Вами? По мылу? Ну уж нет, пишите свои опусы кому-нибудь другому. А я лучше завяжу этот разговор совсем.

> All

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

Вот эта ссылочка:
http://delphimaster.net/view/5-1083587136/

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


 
Piter ©   (2004-08-25 00:26) [149]

olookin ©   (14.08.04 9:28) [137]
поэтому? В таком случае я бы вам посоветовал - прежде чем кидаться словами, покажите свои результаты


я сюда хожу не силами меряться. Да и другие тоже.

olookin ©   (14.08.04 9:28) [137]
Просто так я буду уверен, что имею дело с профессионалами, причем не в написании кода и знании теории, а именно результата


Тебе здесь 70% подтвердят профессионализм Зотова. Можешь почитать его статьи, написанные черт знает когда.
Просто понимаешь:

И действительно, не знал, что можно case для символов использовать. Я даже с указателями почти не умею работать

такое не может говорить о хорошем уровне. То, что ты можешь больше, чем любой человек в соседнем доме ничего не означает (если только в этом доме не живет Юрий Зотов :)

Ну  не можешь ты писать ПРОФЕССИОНАЛЬНЫЕ программы, не зная такого. Прежде чем спорить - задай такой вопрос на любой более менее популярной конференции.

А вот насчет ссылки http://delphimaster.net/view/5-1083587136/ я не понимаю, почему ее Юрий привел. Поведение olookin там вполне корректно...



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

Форум: "Потрепаться";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.18 MB
Время: 0.049 c
3-1092368626
Dub
2004-08-13 07:43
2004.09.12
автоинкрементное поле в dbf


1-1093427866
Layner
2004-08-25 13:57
2004.09.12
Как программно добавит суб меню в PopupMenu?


4-1090641072
гном1
2004-07-24 07:51
2004.09.12
реакция иконки на мышь...


3-1092521194
Fantasy
2004-08-15 02:06
2004.09.12
DATA


1-1093357599
барбос
2004-08-24 18:26
2004.09.12
бесконечный цикл





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