Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про компилятор и предупреждения   Найти похожие ветки 

 
Дуболом   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.053 c
2-1200224535
Lotse
2008-01-13 14:42
2008.02.10
Вопрос о работе программы вне среды Delphi


15-1199560136
kuvalda
2008-01-05 22:08
2008.02.10
Сгорела материнка?


4-1183566201
RAndrey
2007-07-04 20:23
2008.02.10
не работает ShellExecute


15-1199931425
дучф_ч
2008-01-10 05:17
2008.02.10
ошибка при открытии Progecta


2-1200906858
Builder
2008-01-21 12:14
2008.02.10
DBCombobox





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