Форум: "Потрепаться";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизНужно ли бороться с хинтами и ворнингами - 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;
Скачать: [xml.tar.bz2];
Память: 0.71 MB
Время: 0.038 c