Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

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

 
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;

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



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

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

Наверх




Память: 0.72 MB
Время: 0.065 c
1-1093626070
Lord de Mon
2004-08-27 21:01
2004.09.12
Как после клика на пункте меню открыть определённую страницу в бр


14-1093067609
kaZaNoVa
2004-08-21 09:53
2004.09.12
TThread и через CreateThread


14-1093282847
shc
2004-08-23 21:40
2004.09.12
Основная конференция жива?


14-1093077055
olookin
2004-08-21 12:30
2004.09.12
Не подскажете ли, кто написал и исполнил песню со словами "У меня


14-1093032386
Knight
2004-08-21 00:06
2004.09.12
Вопрос к знатокам третьей кваки - арена...