Текущий архив: 2008.02.10;
Скачать: CL | DM;
Вниз
Вопрос про компилятор и предупреждения Найти похожие ветки
← →
Дуболом (2008-01-10 14:22) [0]Сколько предупреждений и каких даст компилятор на сие (без использования среды попробовать ответить):
procedure TForm1.FormCreate(Sender: TObject);
label a,b;
var i,n : integer;
begin
n := 0;
for i := 1 to 100 do begin
n := n + i;
goto b;
a:
end;
Caption := IntToStr(n);
exit;
b: n := i+1;
goto a
end;
← →
Сергей М. © (2008-01-10 14:25) [1]Такой бред может разве что присниться сивой кобыле в новолуние)
← →
Дуболом (2008-01-10 14:28) [2]> Сергей М. © (10.01.08 14:25) [1]
Оно так, но выросло из практичного.
В одном бедном языке никак не организовать рекурсию. Искал выход. В итоге решил организовать выход из цикла по метке(эти средства в языке есть). Но забавно потом - при возврате в цикл, многие переменные сыпятся. Решил попробать в Паскале. Работает, но и предупреждает. Забавно количество предупреждений. :)
← →
Дуболом (2008-01-10 14:30) [3]Причем при замене
b: n := i+1;
наb: n := n+1;
Число предупреждений уменьшается в 1,5 раза.
← →
ыы (2008-01-10 14:31) [4]Сумма ряда вычисляется и без умопомрачительных циклов. ;-)
← →
Дуболом (2008-01-10 14:32) [5]> ыы (10.01.08 14:31) [4]
Это модельный пример.
← →
Сергей М. © (2008-01-10 14:33) [6]
> В одном бедном языке никак не организовать рекурсию
Возможно. Но причем здесь Паскаль ?
> Решил попробать в Паскале
Заняться что ли более нечем было ?)
Сразу и писал бы грамотный и эффективный паскаль-код, тогда бы и предупреждений не было)
← →
Сергей М. © (2008-01-10 14:34) [7]
> никак не организовать рекурсию
>
>
к рекурсии приведенный тобой код не имеет никакого отношения
← →
Дуболом (2008-01-10 14:34) [8]> Сергей М. © (10.01.08 14:33) [6]
?
смотреть фильм Сережа и 2 раза.
← →
Дуболом (2008-01-10 14:36) [9]
> Сергей М. © (10.01.08 14:34) [7]
Без твоего гениального замечания я бы никак не догадался.
Речь о том. что там переменные сыпались при выходе из цикла по метке и входе по метке. Тут не сыпятся. Доступно? но при этом вылазит 6 предупреждений. причем дублирующих.
← →
ыы (2008-01-10 14:38) [10]
> Это модельный пример.
Реальные пацаны ещё счётчик цикла меняют. Пыонэры меняют границы цикла, но реальных пацанофф таким не смутить. ;-)
← →
Rouse_ © (2008-01-10 14:39) [11]
Очень удачны бывают переходы в тело цикла Dо, особенно из других модулей. Хотя трансляторы, как правило, это запрещают, их легко можно обвести вокруг пальца, пользуясь переменными типа метки. Передача управления в вызываемую процедуру в обход заголовка принесет вам долгие часы счастливых раздумий над кодом завершения 0хС5.
© :)
← →
Дуболом (2008-01-10 14:41) [12]> Rouse_ © (10.01.08 14:39) [11]
Это да. :) Но 6 предупреждений...
← →
ыы (2008-01-10 14:44) [13]Делфи 6 -- 4 варнинга, два хинта о неиспользовании значения переменной. Более того, хинты весьма справедливые, потому как если соответствующие строки закоментировать, то результат не изменится и в результате будет for I := 1 to 100 do N := I + 1...
← →
ыы (2008-01-10 14:49) [14]Демонстрация того, что делфи может выдать четыре одинаковых варнинга на один оператор -- отличная. А какие-то ещё ценные уроки из этой темы почерпнуть можно? %-)
← →
Anatoly Podgoretsky © (2008-01-10 16:05) [15]> ыы (10.01.2008 14:49:14) [14]
Самый важный - никогда так не делать.
← →
isasa © (2008-01-10 16:17) [16]Anatoly Podgoretsky © (10.01.08 16:05) [15]
> ыы (10.01.2008 14:49:14) [14]
Самый важный - никогда так не делать.
Это ж каким нестандартным мышлением надо обладать, что-бы в реальной жизни до такого дойти?
← →
ZeroDivide © (2008-01-10 16:47) [17]LMD
← →
Дуболом (2008-01-10 17:16) [18]> ZeroDivide © (10.01.08 16:47) [17]
Знакомо. И очень самокритично. Вы еще живы, а здря.
А теперь заводим шарманку:
1.procedure TForm1.FormCreate(Sender: TObject);
label a,b;
var i,n : integer;
begin
n := 0;
for i := 1 to 100 do begin
n := n + i;
goto b;
a:
end;
Caption := IntToStr(n);
exit;
b: n := i+1;
goto a
end;
Сколько и каких предупреждений?
2.procedure TForm1.FormCreate(Sender: TObject);
label a,b;
var i,n : integer;
begin
n := 0;
for i := 1 to 100 do begin
n := n + 1;
goto b;
a:
end;
Caption := IntToStr(n);
exit;
b: n := n + 1;
goto a
end;
Сколько и каких предупреждений? Спеси не сбило? Жаль.
3. Вот такой "псевдокод".переменная a
a=2
пиши a
повторять пока а=2{
перейти к метка1
a = a+ 2
метка2: пиши a}
пиши a
перейти к метка3
метка1:
a=a+3
пиши a
перейти к метка2
метка3:
Кто угадает с 3-х раз вывод?
4. То что приведено в 3 не псевдокод. Это программа для парктикума, который прилагается к учебнику одобреному минобром для обучения в 8-9 классах. И этому учат, и по программе, которая транслирует все в реал. Для наших детй. В частности моих. Вывод я сообщу, но вы придумайте свой.
5. Воистину LMD. Воинствующий LMD. Вы еще живы? А жаль. Не по нику надо бить, а по мячу.
← →
Дуболом (2008-01-10 17:33) [19]> ыы (10.01.08 14:49) [14]
Простые.
1. Вы никогда не смогли бы все-таки понять где же варнинги которые бы выдал компилятор на код, который я привел и в чем именно их суть.
2. Вы и сейчас на это не способны.
3. Вы бьете по нику, а не по мячу. А это и есть Ламерство. С чем и поздравляю. Итак, тут отметились кроме Саши Багеля ламеры. Дикси.
← →
ыы (2008-01-10 17:51) [20]
> То что приведено в 3 не псевдокод.
Увы, на бейсике писались мною и не такие красоты.
> Вы никогда не смогли бы все-таки понять где же варнинги
> которые бы выдал компилятор на код
Да, правда. В практике Паскаля ни разу не пользовался метками, был уверен, что будет три варнинга: "переход за пределы цикла", "переход внутрь цикла", "использование переменной цикла вне цикла".
> Вы и сейчас на это не способны
Ну... В общем да, я не стану учить варнинги, чтоб в дурацком (почему дурацкий -- [13]) тесте проявить себя.
> Вы бьете по нику
Я что-то говорил о нике?
← →
Mystic © (2008-01-10 17:54) [21]> 1. Вы никогда не смогли бы все-таки понять где же варнинги
> которые бы выдал компилятор на код, который я привел и в
> чем именно их суть.
Где и какие предупреждения могут вылезти для такого кода очень сильно зависит от версии компилятора, среды (Delphi или FreePascal) и т. д. Чтобы конкретно знать, что быдет выдано, надо знать алгоритм работы компилятора (какие проверки он выполняет). В любом случае предупреждения это некоторые эвристики, которые иногда срабатывают и в корректном коде, что иногда указывает на его нечитабельность. Лично мне не интересно, какие конкретно предупреждения будут в данном коде.
Вообще, если есть необходимость в цикле менять счетчик (использовать счетчик после цикла), то я предпочитаю писать цикл while (repeat) и самому все контролировать. Так как в противном случае можно легко получить UB.
← →
Dib@zol © (2008-01-10 18:06) [22]Мой тебе совет, уважаемый Дуболом: раз уж так хоцца понавтыкать везде меток - юзай билт-ин АСМ. И никаких ворнингов и хинтов не будет :)
ЗЫ ща скажут что я тоже лмд %)
← →
Дуболом (2008-01-10 18:32) [23]> ыы (10.01.08 17:51) [20]
Верю. Но это не Бейсик.
Варнинги там не такие. Это и было неочевидно, о чем и сообщил. Я ожидал другого.
> Ну... В общем да, я не стану учить варнинги, чтоб в дурацком
> (почему дурацкий -- [13]) тесте проявить себя.
Кто не видит сути, говоря с умным видом, выглядит глупо.
> Mystic © (10.01.08 17:54) [21]
Согласен и не спорю. Я это проверял В Турбо2006. Почему и для чего код использовал, я фактически описал. Написал, как думалось, как полную логическую аналогию такого же кода на предложенном языке. Повторяю, на языке, который сейчас реально дается в школах России вместе со средой. Ссылку на оную я приводил уже сегодня.
http://myrobot.ru/logo/whygamelogo.php
Т.е это не праздное. Оказалось, что работа не эквивалента. При этом еще по пути получил варнинги. На вскидку, я вот не могу почему варниги так меняются при смене кода 2 на 1. Я бы ожидал скорее обратного поведения. Про эвристику и пр. я понимаю прекрасно. Совершеннов этом плане не понимаю попыток иных лечить меня - не их это дело, куда удачнее жену щи варить у них получится, ибо кишка слабовата, сам поучить могу.
Это про варнинги. Если тебе очевидно, просвети.
А про ссылку - вот попробуй. Удивись. Я написал разработчикам - пока тихо.
Мне изначально понравилось, а потом начал ловить там всякое. Вообще, попробовал нарисовать подобие фрактала - треугольник шипастый(ты наверняа знаешь о чем я). Получилось, что всякое вложение надо описыватьявно каждое внутри. Это скучно. На этом пути и не шел. Потом подумалось, как бы сам в интерпретируемом и т.п. Паскаль отработал на 5. То что хотел, то и дал. А варнинги чуток ... О чем и поделился. А начали учить щи варить. :) Смяшно. Ладно бы Борис или Игорь, а то полукодеры малограмотные.
> Dib@zol © (10.01.08 18:06) [22]
Меня это не интересует. Как и что делать на Паскале - меня учить не надо. Сам с усам и бородой. Если не втыкаешь - отойди.
← →
Дуболом (2008-01-10 18:40) [24]Про работу по п3.
Вся штука в том, что выдача программы такова:2
2
и все. На Паскале будет при такой подаче другая, и варниниги тут НИ ПРИ ЧЕМ. Каковы бы они не были. Но если уж появились - то неужели не забавна история именно такого их проявления?
Или пустое?
> ЗЫ ща скажут что я тоже лмд %)
Ты не лмд и никто не скажет, но ты меня не понял. Видимо, я и не объяснил. Но при любом раскладе - ...
← →
Дуболом (2008-01-10 18:53) [25]>Да, правда. В практике Паскаля ни разу не пользовался метками, был уверен, что будет три варнинга: "переход за пределы цикла", "переход внутрь цикла", "использование переменной цикла вне цикла".
Варнинги штука простая, кто писал на Дельфи все-таки их помнит немного. :)
При п1. варнингов 6, при этом уникальных 3(остальные копии):
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
К строке b: n := i + 1;
[Pascal Hint] Unit1.pas(31): H2077 Value assigned to "n" never used
К строке n := n + 1;
[Pascal Hint] Unit1.pas(29): H2077 Value assigned to "n" never used
К строке n := 0;
Ну, лгично допустим.
А вот по п2.
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
[Pascal Warning] Unit1.pas(37): W1037 FOR-Loop variable "i" may be undefined after loop
К строке for i := 1 to 100 do begin
и все.
← →
Dib@zol © (2008-01-10 18:59) [26]Хм... Занятная вещь творитсо - у меня после того как я закрыл модуль с прописанной туда конструкцией "a=:a+1", и нажал F9, компилятор стал каждые три секунды выдавать по фатал еррору: Could not compile used unit "Unit1.pas"
← →
Дуболом (2008-01-10 19:05) [27]> Вообще, если есть необходимость в цикле менять счетчик (использовать
> счетчик после цикла), то я предпочитаю писать цикл while
> (repeat) и самому все контролировать. Так как в противном
> случае можно легко получить UB.
Как можно заметить, я не менял и вообще не трогал счетчик. Уж в п2. - вообще никак.
> Dib@zol © (10.01.08 18:59) [26]
Бывает.
← →
ыы (2008-01-10 19:07) [28]
> Варнинги штука простая, кто писал на Дельфи все-таки их
> помнит немного.
Помню, но сказать, что варнингов будет четыре, что они будут в одной строке и что они будут одинаковые -- я б не смог. Хинты варнингами считать всё-таки не стоит.
> А вот по п2.
У меня таки три... Делфи 6 build 6.240.
← →
DiamondShark © (2008-01-10 19:14) [29]Компиляторы от версии к версии всё чудесатее и чудесатее.
Для варианта (1) два хинта:
n := n + 1;
[Hint] Unit1.pas(30): Value assigned to "n" never used
n := 0;
[Hint] Unit1.pas(28): Value assigned to "n" never used
Для варианта (2) вообще ничего.
Дельфи-5.
← →
Дуболом (2008-01-10 19:17) [30]> ыы (10.01.08 19:07) [28]
1. Ну что чего стоит - разговор третий. :) Если бы я вынес в функцию или процедуру, то ничего бы и не вякнуло даже. Мне это и понравилось.
А если уж про считать, то у меня кредо простое - ни того, ни другого. Сейчас пишу в системе с несколькими уровнями проверки на всякое хинтовое и варнинговое. Пишу в самом жестом режиме - ни одного. Как и раньше в Дельфи. Ибо тогда работа не чистая. :) Безусловно, сам бы у себя в рабочем ничего подобного не допустил. Но тут то другой случай. Пошел по кругу....
2. Да 3. Не то из буфера вытащилось. И не 37, а 30 строка , что и соответствует приведеному.
← →
DiamondShark © (2008-01-10 19:18) [31]
> Повторяю, на языке, который сейчас реально дается в школах
> России вместе со средой
Ну, если Вы детей учите, то и научите как мантре:
Не прыгать в/из структурного оператора
И будет им в жизне щасье.
← →
Дуболом (2008-01-10 19:27) [32]> DiamondShark © (10.01.08 19:18) [31]
Да, в Турбо по этим пунктам тоже хинты, я их варнингами назвал. И меня тоже удивило их исчезновение в п.2 хотя код отрабатывается.
Я не учу. Сын недавно притаранил из школы систему(А по ней и учебник и практикум). Я начал ею баловаться. Вначале понравилось. Ряд штучек забавных сделал. А потом столкнулся с этим.
Причем, если бы я писал такое на Бейсике или Паскале - по описалову идентичное, то и в мыслях бы не возникло, что возможно кривое поведение, уровня того что п.3 выдаст 2 и 2 и все. Да, это некрасиво и т.п. но они(Паскаль и Бейсик) отрабатывают честно и ожидаемо. Тут же, я вначале удивился, когда банально вынес код из цикла в меточное пространство - цикл развалился, хотя переменные цикла не трогались.
Как нарисовать ту штуку шипастую я найду(для 4 уровней можно просто втупую - это и сделал). Но удара именно со стороны того, что цикл валится и глобалы начинают чудить - меньше всего ожидал.
← →
Дуболом (2008-01-10 19:29) [33]> Не прыгать в/из структурного оператора
А использование функции или процедуры в структурном операторе? Или тут тихая договоренность, что вернемся?
Страницы: 1 вся ветка
Текущий архив: 2008.02.10;
Скачать: CL | DM;
Память: 0.55 MB
Время: 0.046 c