Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.02 c
2-1200840259
savyhinst
2008-01-20 17:44
2008.02.10
TMemoryStream->TFileStream


2-1200561259
asdf
2008-01-17 12:14
2008.02.10
Запрос в MySQL


2-1200159348
istok
2008-01-12 20:35
2008.02.10
показать сообщение не из своей программы


15-1199641367
Lip
2008-01-06 20:42
2008.02.10
Как в ListBox получить выбранное значение?


15-1199810913
antonn
2008-01-08 19:48
2008.02.10
Билл Гейтс покидает Microsoft