Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-1093216809
массив
2004-08-23 03:20
2004.09.12
Какой самый корркетный способ добавления шрифта в систему ?


14-1093507145
Baks
2004-08-26 11:59
2004.09.12
Мастера подскажите


3-1092728279
Марат
2004-08-17 11:37
2004.09.12
Ошибка в процедуре


4-1090774018
юзверь
2004-07-25 20:46
2004.09.12
Transparent BITMAP


8-1088053247
Agent[007]
2004-06-24 09:00
2004.09.12
Render





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