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

Вниз

как-то видел на этом форуме...   Найти похожие ветки 

 
kai ©   (2004-12-13 15:04) [0]

...ветки, в которых написано, что использование Exit в функциях и break в циклах - признак дурного тона. Почему-то не согласен с этим, например, пишу:
[code]
procedure ....
 ...какой-то код
 try
   if ...какой-то код then
     Exit;
   ...какой-то код
 finally
   ...какой-то код, необходимый для корректного завершения
 end;
end;
[/code]
где дурной тон?


 
Cobalt ©   (2004-12-13 15:08) [1]

А я тут слышал от кого-то, что Goto - дурной тон.
И ничего.
А Васька слушает да ест ;)


 
kai ©   (2004-12-13 15:11) [2]

Cobalt ©   (13.12.04 15:08) [1]
а goto разве не дурной?


 
Игорь Шевченко ©   (2004-12-13 15:15) [3]


> Почему-то не согласен с этим


Borland тоже не согласен.


 
KSergey ©   (2004-12-13 15:19) [4]

> [2] kai ©   (13.12.04 15:11)
> Cobalt ©   (13.12.04 15:08) [1]
> а goto разве не дурной?

Нет.
"Каждый фрукт, будучи..." - и далее по тексту.

> kai ©   (13.12.04 15:04)
> в которых написано, что использование Exit в функциях
> и break в циклах - признак дурного тона.

Ну и не бери в голову. Там, увы, так и не удалось получить от автора полного ответа. Да еще пришел кто-то из мастеров (прошу прощения, забыл) - и все опошлил грамотной расстановкой акцентов в ассемблерном коде... ;) Более ответов автора я уже так и не услышал. Да и зачем? Теологические методы в этих вопросах - неприменимы...


 
марсианин ©   (2004-12-13 15:24) [5]


> где дурной тон?

exit в блоке try-finally. работать, конечно, будет, но лучше избегать.. благо это не сложно


 
kai ©   (2004-12-13 15:36) [6]

марсианин ©   (13.12.04 15:24) [5]
почему? если не сложно - объясните?


 
марсианин ©   (2004-12-13 15:50) [7]


> почему? если не сложно - объясните?

ИМХО, try предназначен для обработки исключений, и, чтоб сработал finally, компилятор должен сделать финт ушами.. там наверняка будет не совсем эффективный код. могу ошибаться, т.к. в листинги ассемблерные не заглядывал.. короче, это тот самый случай, когда фрукт не совсем полезен..


 
kai ©   (2004-12-13 16:03) [8]

марсианин ©   (13.12.04 15:50) [7]
если так рассуждать, то ООП вообще неэффективно по оптимальности кода.


 
Piter ©   (2004-12-13 16:03) [9]

марсианин ©   (13.12.04 15:24) [5]
exit в блоке try-finally. работать, конечно, будет, но лучше избегать.. благо это не сложно


а что такого в Exit в блоке try..finally?
Finally все равно будет выполнен...


 
Ihor Osov'yak ©   (2004-12-13 16:32) [10]

2 [5] марсианин ©   (13.12.04 15:24)

Не согласен..  Вообще-то на марсе - не знаю, а в наших краях - вполне нормально воспринимается..


 
Igorek ©   (2004-12-13 16:54) [11]

kai ©   (13.12.04 15:04)
Насчет Exit. Типичный случай применения - начало процедуры записи свойства if fValue = aValue then Exit. Позволяет избежать лишней вложенности if fValue <> aValue then begin ...{уже на один уровень глубже} end. А таких предусловий может быть несколько.

Насчет break - вообще глупо мне кажется. Как иначе цикл завершить? Напр. найти в массиве первое нечетно число. Переменную цикла в теле менять - еще более дурной тон. Можно переписать на while do или repeat until, то логика будет не так очевидна. Большинству.

Хотя на вкус и цвет... Кому-то и код автосхемы понравится может.


 
Piter ©   (2004-12-13 17:18) [12]

Igorek ©   (13.12.04 16:54) [11]
Переменную цикла в теле менять - еще более дурной тон


это не дурной тон, так как сделать этого просто нельзя


 
Gero ©   (2004-12-13 17:39) [13]

Вот та ветка:

http://delphimaster.net/view/1-1100705690/

К сожалению, уже ушла в архив.


 
Vasya.ru ©   (2004-12-13 18:34) [14]

Переменную цикла в теле менять - еще более дурной тон
неверно принцим работы for а представляешь


 
марсианин ©   (2004-12-13 19:03) [15]


> [10] Ihor Osov"yak ©   (13.12.04 16:32)

а как же насчет локальной раскрутки?
тот же Рихтер делать этого очень не рекомендует ( см.ГЛАВА 23 Обработчики завершения-> И еще о блоке finally  )
хотя, конечно, там речь идет о SEH. не очень логично распространять это на другие обработчики исключений ( в делфи, в стандартном С++), но раз в 1 месте возможны проблемы, наверное, стоит избегать их и в других местах?


 
begin...end ©   (2004-12-13 19:05) [16]

> [12] Piter ©   (13.12.04 17:18)

> это не дурной тон, так как сделать этого просто нельзя

Уточнение: начиная с Delphi 2.


 
SergP ©   (2004-12-13 23:29) [17]


> Хотя на вкус и цвет... Кому-то и код автосхемы понравится
> может.


Бедный DmitryO. Опять на него нападаете...

Кстати а ты видел код этой автосхемы?


 
Knight ©   (2004-12-14 00:35) [18]

Нам это объясняли так, что Goto, break и др. exit"ы в Паскале, нарушают один из принципов структурного программирования... "блок должен иметь один вход и один выход"... после чего за их использование гнали в шею с лабораторных... :)


 
Igorek ©   (2004-12-14 00:59) [19]

SergP ©   (13.12.04 23:29) [17]

> Бедный DmitryO. Опять на него нападаете...

Нет, нет! Ни в коем случае! Наоборот я лично к Диме отношусь с достаточным уважением.

> Кстати а ты видел код этой автосхемы?

Да.


 
Alex Konshin ©   (2004-12-14 01:02) [20]

Goto, Break и Exit не любят теоретики, им видите-ли трудно доказывать правильность программ. А вы знаете хоть одну программу на Delphi для которых доказывалась их правильность? Ну так и нафига придумывать себе препятствия, чтоб потом героически их предолевать?  Если хорошо понимаешь то, что делаешь, то можешь приминять все, что считаешь нужным. Теологи от программирования пусть ищут себе более полезное применение.

Насчет finally - да, действительно там прилагаются некие усилия для его реализации, но на мой взгляд в данном случае надежность превыше всего. Есть такая вещь, как "защита от дурака" - когда делаешь проверки всех входных параметров, возвращаемые из других функций результаты и всегда предполагаешь самый худший вариант. Вот в этом try finally и try except чрезвычайно полезны. Если же не использовать такой подход к программированию, то получаем программы, которые падают от косого взгляда, и шаг в сторону от предполагаемого "программистом" пути рассматривается как попытка к бегству и карается расстрелом на месте.


 
KSergey ©   (2004-12-14 07:59) [21]

По поводу всех эти Break вспоминается мне все время такой случай.
Quark XDK, примеры.
В одном из них встречаю конструкцию такого вида (было на Си, ну да не суть):

while (TRUE) {
  ....
  if (...) break;
  ....
  if (...) break;
  ....
  break;
}


Ну наверчено там было лихо, я эту конструкцию не сразу усек. Все башку ломал: нафиг цикл, вроде всегда из него на первой же итерации выходим... Искал условия когда же не выйдем на первой же итерации - никак... Потом таки дошло: этим гадам GOTO было написать противно... Типа приверженцы структурного программизма и все такое...


 
Кудесник ©   (2004-12-14 11:08) [22]


> KSergey ©   (14.12.04 07:59) [21]

Си - это отдельная тема... там тот же break является, для некоторых конструкций, обязательным элементом... но когда его начинают необдуманно совать везде где не попадя... программы тоже начинают падать при любом изменении погоды на Марсе... %)

Хотя, как было сказано выше, каждому слову есть время и место... кроме goto, употребления которого в Паскале действительно следует избегать... конечно, имхо :)


 
DiamondShark ©   (2004-12-14 11:40) [23]

Удалено модератором


 
pasha_golub ©   (2004-12-14 11:51) [24]

DiamondShark ©   (14.12.04 11:40) [23]
А пионер, увидев массив, сначала радостно напишет цикл for, потом начнёт мучительно думать, как из него выйти, а потом ещё более мучительно думать, как он будет выкручиваться из ситуации, когда в массиве вообще нет элементов, удовлетворяющих условию поиска. Вероятно, что он даже напишет в форум о "глюке компилятора".

Абсолютно согласен. Я вообще не признаю методику, в которой людям сначала рассказывают о циклах for, а уж потом о while&repeat. Ведь первый, по сути, подвид второго.


 
Piter ©   (2004-12-14 12:19) [25]

DiamondShark ©   (14.12.04 11:40) [23]

если не ошибаюсь, по условию надо было найти ПЕРВОЕ нечетное число...

Я не вижу другого пути, кроме Break. Ведь если это число найдено - ЗАЧЕМ продолжать поиск, особенно учитывая то, что массив может быть из 1000 элементов, а нужный элемент мы нашли уже на первых 10 итерациях?

Ну или вводить какую-нибудь дополнительную переменную, типа Flag: boolean, только нафига?


 
VictorT ©   (2004-12-14 12:25) [26]

Я часто использую как break, так и continue. В принципе можно было бы и обойтись без них, но тогда было бы больше кода.


 
DiamondShark ©   (2004-12-14 12:30) [27]


> Piter ©   (14.12.04 12:19) [25]
> DiamondShark ©   (14.12.04 11:40) [23]
>
> если не ошибаюсь, по условию надо было найти ПЕРВОЕ нечетное
> число...

А там какое находится? Десятое?


 
ламер ©   (2004-12-14 13:41) [28]

за последние лет 5-6 ни разу не воспользовался оператором goto. причём никакого ущерба эффективности кода это не нанесло. а break и continue использую очень часто. вот от exit пытаюсь отказаться, но пока не очень получается.


 
Zacho ©   (2004-12-14 14:27) [29]

ламер ©   (14.12.04 13:41) [28]
вот от exit пытаюсь отказаться, но пока не очень получается.


А зачем отказываться от exit ? Imho, все аргументы (типа "дурной тон") надуманные


 
Igorek ©   (2004-12-14 15:02) [30]

DiamondShark ©   (14.12.04 12:30) [27]

> Видимо, в школе хорошо учиться.

Спасибо, очень мило.

>i := 0;
>while (i < Len) and not odd(M[i]) do inc(i);
>if i < Len then // делаем чего-то с m[i]
> else // вообще нету нечётных чисел

Абзац до конца дочитал? :-)
Также после прочтения до конца, еще раз см. [25]


 
марсианин ©   (2004-12-14 15:16) [31]

полнстью согласен с [20] Alex Konshin ©   (14.12.04 01:02)

написание программ ради хорошего стиля - уже плохой стиль...

но ведь есть вещи, которые просто делать не рекомендуется.. вот не знаю почему, но тем не менее они прекрасно работают..
оставим exit внутри finally, работает и хорошо (к тому же для SEH фреймов как альтернатива есть комманда __leave правда только в Визуал Студио)

а как вот насчет, например, вызова виртуальных функций в конструкторе?
Страуструп не рекомендует.
на паскале не пробовал, а если и пробовал, то не задумывался.. а Визуал Студио такое проходит просто со свистом..


 
имя   (2004-12-14 15:23) [32]

Удалено модератором


 
vidiv ©   (2004-12-14 15:25) [33]


> KSergey ©   (14.12.04 07:59) [21]
> По поводу всех эти Break вспоминается мне все время такой
> случай.
> Quark XDK, примеры.
> В одном из них встречаю конструкцию такого вида (было на
> Си, ну да не суть):
>
> while (TRUE) {
>   ....
>   if (...) break;
>   ....
>   if (...) break;
>   ....
>   break;
> }


Я на php так делаю :)


 
Игорь Шевченко ©   (2004-12-14 15:27) [34]

марсианин ©   (14.12.04 15:16) [31]


> а как вот насчет, например, вызова виртуальных функций в
> конструкторе?
> Страуструп не рекомендует.


Ну пусть не вызывает :)

Обычно, когда чего-то рекомендуют, то приводят к рекомендациям аргументы. В противном случае сообщение относится к разряду религиозных, а религия и программирование вещи не сильно совместимые.

С уважением,


 
DiamondShark ©   (2004-12-14 15:29) [35]

Удалено модератором


 
Суслик ©   (2004-12-14 15:30) [36]


> for i := 0 to Len - 1 do
>  if Odd(M[i]) then Break;

я тоже не против такого. Лично мне такой подход кажется более эргономичным.

goto не пользуюсь по тем же причинам - НЕ кажется эргономичным.

Вообще - это все дело привычки.


 
Игорь Шевченко ©   (2004-12-14 15:32) [37]


> > for i := 0 to Len - 1 do
> >  if Odd(M[i]) then Break;
>
> я тоже не против такого. Лично мне такой подход кажется
> более эргономичным


Ну и в лужу. Извиняюсь.


 
Суслик ©   (2004-12-14 15:34) [38]


>  [37] Игорь Шевченко ©   (14.12.04 15:32)


> Ну и в лужу

В твоем любимом стиле, если не против?

Хде доводы!??
Иначе как ты можешь знать про лужу - рядом стоял? :))


 
vidiv ©   (2004-12-14 15:35) [39]

имхо, главное логику операторов понимать чтобы использовать. для того их придумали и добавили.


 
Игорь Шевченко ©   (2004-12-14 15:38) [40]

Суслик ©   (14.12.04 15:34) [38]

Ви таки хотите доводов? Их есть у меня.

Дело в том, что используя такой код, ты не найдешь первое нечетное число. Ты даже не узнаешь, есть ли в массиве нечетные числа.


 
Суслик ©   (2004-12-14 15:41) [41]


>  [40] Игорь Шевченко ©   (14.12.04 15:38)


> Дело в том, что используя такой код, ты не найдешь первое
> нечетное число. Ты даже не узнаешь, есть ли в массиве нечетные
> числа.

А я его искал?
Мы вроде обсуждаем подход, а не функцию odd и невозможность пользования i после цикла.

Забыл сказать, что Odd моя кстати функция, выше описана - первые идущие подряд элементы равные 0 устанавливает в 1, как только не 0 - прерывается.

Ну?


 
KSergey ©   (2004-12-14 15:42) [42]

> [36] Суслик ©   (14.12.04 15:30)
>
> > for i := 0 to Len - 1 do
> >  if Odd(M[i]) then Break;
>
> я тоже не против такого.

В таком подходе меня заботит одно: приписочка в хелпе

After the for statement terminates, the value of counter is undefined.

(выделено мной)

И хотя на самом деле все работает (D5, либо я что-то проглядел, мож крыж какой есть?), т.е. если после цикла используешь - даже не ругается и оптимизацию "назад" не включает (хотя когда-то точно помню натыкался на предупреждение). Вот эсти бя не было такой приписки - все было бы здорово, а так...

ЗЫ
Надеюсь, цель не просто найти, а еще и индекс узнать.. Можно, конечно, в переменную какую перед break перенести - но выход ли это? Вернее, на сколько это красиво?


 
Verg ©   (2004-12-14 15:43) [43]


> [40] Игорь Шевченко ©   (14.12.04 15:38)


+1 :)

да уж, прграммеры


> [32] SharkKiller   (14.12.04 15:23)


I := 0;

Код  еще быстрее твоего, сохранив всю его ф-циональность :)))


 
имя   (2004-12-14 15:45) [44]

Удалено модератором


 
DiamondShark ©   (2004-12-14 15:48) [45]

Удалено модератором


 
Игорь Шевченко ©   (2004-12-14 15:48) [46]

Суслик ©   (14.12.04 15:41) [41]


> А я его искал?


Я забыл спросить: а ты его искал ? Если нет, то зачем код привел ?

Verg ©   (14.12.04 15:43) [43]


> +1 :)


Переведи ? :)


 
Суслик ©   (2004-12-14 15:51) [47]


> > +1 :)
>
>
> Переведи ? :)

Можно я ? Ну типа ты классную вещь сказал, достойно уважения.

Я так понимаю - это из системы оценок rsdn.


> Я забыл спросить: а ты его искал ? Если нет, то зачем код
> привел ?

Мы обсуждали подход - пользоваться break или нет. Все. Затем и привел.


 
Кудесник ©   (2004-12-14 15:53) [48]

А вот ещё помню, говорили, что следует избегать имён переменных - l, O и т.п... типа, обозвали переменную l (эль) оператор при вводе перепутал её с 1 (адин)... спутник улетел... долго выясняли... куда? %)


 
Кудесник ©   (2004-12-14 15:53) [49]

Удалено модератором
Примечание: Дубль


 
KSergey ©   (2004-12-14 15:57) [50]

> SharkKiller   (14.12.04 15:23)
> Прогони оба цикла при Len = High(Integer). Сравни скорость.
> Больше про школу не говори.

Ну я сравнил. Почему про школу не говорить - можно уточнить?


 
DiamondShark ©   (2004-12-14 16:01) [51]


> Мы обсуждали подход - пользоваться break или нет. Все. Затем
> и привел.

За что и получил. Ибо, задача поиска в массиве -- не самый удачный, да что уж там, совсем не удачный пример его использования.


 
KSergey ©   (2004-12-14 16:02) [52]

> [47] Суслик ©   (14.12.04 15:51)
> Мы обсуждали подход - пользоваться break или нет. Все. Затем
> и привел.

Не, гнилая отмазка ;) Уж извините.. ;)


 
имя   (2004-12-14 16:05) [53]

Удалено модератором


 
Суслик ©   (2004-12-14 16:07) [54]


> DiamondShark ©   (14.12.04 16:01) [51]

Не надо песен про получил.


> KSergey ©   (14.12.04 16:02) [52]

Гнилые слова, тоже без обид.

-----------
детский сад


 
имя   (2004-12-14 16:11) [55]

Удалено модератором


 
Mystic ©   (2004-12-14 16:17) [56]

Насколько я помню, мода на неиспользование Break и Continue давно прошла. Связано это было с существовавшими парадигмами. Сейчас, вроде бы как принято, чтобы при написании метода можно было легко определить главную (основную) последовательность выполняемых действий. Скажем там, последовательность, которая возникает в случае отсутствия ошибок, ... Для этой цели использование Break, Exit и Continue очень даже помогает.

Кстати, кому интересно, Д. Кнут даже в одно время написал статью "структурное программирование с использованием goto" В реализации TeX-а goto встречается, и не только в качестве сокращения Break, Exit и Continue, которых нет в стандарте паскаля, но и в других случаях. Но там используются принципы литературного программирования, код ну очень хорошо задокументирован и метки почти не мешают пониманию.


 
Игорь Шевченко ©   (2004-12-14 16:19) [57]

SharkKiller   (14.12.04 16:05) [53]

Те, кто в танке, смотрят на окно CPU


 
KSergey ©   (2004-12-14 16:22) [58]

> [55] SharkKiller   (14.12.04 16:11)
> > KSergey ©   (14.12.04 15:57) [50]
> Потому что первое бывает и последним.
> Массив заполнял перед прогоном? Чем?

Числами ;)
Ну уж заполнил как надо, будьте покойны.

Если интересно, сразу скажу, мерял "на глаз". Но явно оличия более, чем на 10% - не наблюдалось (это я так оцениваю свою ошибку изменения).

Код, если интересно:

procedure TForm1.Button1Click(Sender: TObject);
const
 ARR_MAX = 355350000;
var
 M: packed array of Shortint;
 i, Len: Integer;
begin
 //
 SetLength(M, ARR_MAX);
 for i := Low(M) to High(M)-1 do
   M[i] := 2;
 M[High(M)] := 3;
 Len := Length(M);
 ShowMessage ("--- Start ---");
 // - 1 -
 i := 0;
 while (i < Len) and not odd(M[i]) do inc(i);
 ShowMessage ("-1- " + IntToStr(i));
 // - 2 -
 for i := 0 to Len - 1 do
   if Odd(M[i]) then Break;
 ShowMessage ("-2- " + IntToStr(i));
end;


Мерял по появлению MessageBox"ов.
На моем компе это выполнялось примерно 5 сек, это вполне достаточное время, чтобы получить указанную точность, бОльшая меня и не интересовала.
Формально - да, это не High(Integer), однако, согласитесь, тенденция налицо.


 
DiamondShark ©   (2004-12-14 17:26) [59]


> SharkKiller   (14.12.04 16:05) [53]

Какой настырный пионер.

При Len=High(Integer) массив у тебя окажется в свопе (это если он of byte, с массивом integer ты будешь послан ещё на этапе компиляции).
Ловить блох с организацией цикла в этом случае -- скучно и пошло.
Это момент номер раз.

На размерах, влезающих в физ. память, никакого существенного различия не обнаруживается.
Это момент номер два.

Наконец, даже не гоняя бестолку машину, можно было посмотреть на полученный машинный код.
Это момент номер три.

Какой из этого всего вывод?
А очень простой: сам ты ничего не гонял, теоретические твои познания находятся на уровне плинтуса, а появилось ты здесь исключительно из желания повонять.
Посему надлежит тебе удавиться как можно скорее.


 
Юрий Зотов ©   (2004-12-14 18:42) [60]

> DiamondShark

Допустим, оппонент прав. Или неправ. Или частично прав. Или еще как угодно - но зачем же ТАК разговаривать?

Не в трамвае ведь.


 
Vovchik_A ©   (2004-12-14 19:18) [61]

2Юрий Зотов ©   (14.12.04 18:42) [60]

А в трамвае, выходит, можно ?


 
Nous Mellon_   (2004-12-14 19:24) [62]


>
> А в трамвае, выходит, можно ?

Тебе да.


 
Юрий Зотов ©   (2004-12-14 19:28) [63]

> Vovchik_A ©   (14.12.04 19:18) [61]

В пустом - можно. Только негромко.
:о)


 
DiamondShark ©   (2004-12-14 19:30) [64]

Удалено модератором
Примечание: Предупреждение тебе.


 
Igorek ©   (2004-12-14 20:03) [65]

DiamondShark ©   (14.12.04 15:29) [35]

> Ты хочешь сказать, что логика написанного тебе не
> очевидна?

Мне то очевидна. А может быть неочевидна другим. А если брать пионеров - то большинству. Хотя в данном случае думаю непонятка вышла из-за отсутствия форматирования.

> Так ведь и то не годится: два пионера -- ещё, отнюдь,
> не большинство.

Давай проголосуем? Напишем по варианту процедуры, а народ пусть скажет - какой вариант читабельнее, безопаснее, быстрее там и т.д. Ок?

Итак стоит задача: "написать функцию, которая ищет первое нечетное число в массиве в виде
function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean
Если число не найдено, то она возвращает false, иначе - true, а само число можно найти в FirstOdd."
Для начала с постановкой согласен? Если да, то можешь сразу кинуть свой вариант.


 
Alexander Panov ©   (2004-12-14 20:10) [66]

:-)

function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
 i: Integer;
begin
 Result := False;
 for i := 0 to Length(M)-1 do
 begin
   if (M[i] and 1) = 1  then
   begin
     FirstOdd := M[i];
     Result := True;
     break;
   end;
 end;
end;


 
Игорь Шевченко ©   (2004-12-14 20:21) [67]

Igorek ©   (14.12.04 20:03) [65]


> DiamondShark ©   (14.12.04 15:29) [35]
>
> > Ты хочешь сказать, что логика написанного тебе не
> > очевидна?
>
> Мне то очевидна. А может быть неочевидна другим. А если
> брать пионеров - то большинству. Хотя в данном случае думаю
> непонятка вышла из-за отсутствия форматирования.


Я наверное не совсем понимаю, это призыв к подробному толкованию для пионеров или как ?


 
jack128 ©   (2004-12-14 20:27) [68]

марсианин ©   (14.12.04 15:16) [31][Ответить]
> а как вот насчет, например, вызова виртуальных функций в
> конструкторе?
> Страуструп не рекомендует


AFAIK в C++ это просто невозможно.  Точнее вызвать то можно, но вызов будет не полиморфным.


 
Igorek ©   (2004-12-14 20:40) [69]

Piter ©   (13.12.04 17:18) [12]
Да в Дельфи нельзя. А в С++ можно. Просто я подумал, что разговор идет вообще об операторах прерывания цикла/процедуры.

Vasya.ru ©   (13.12.04 18:34) [14]

> неверно принцим работы for а представляешь

С чего ты взял?
KSergey ©   (14.12.04 7:59) [21]

> while (TRUE) {

Кстати "вечный цикл" очень даже хорош во многих ситуациях. Очевиднее, яснее.
pasha_golub ©   (14.12.04 11:51) [24]

> сначала рассказывают о циклах for, а уж потом о
> while&repeat. Ведь первый, по сути, подвид второго.

В каком смысле?


 
DiamondShark ©   (2004-12-14 20:43) [70]


> Igorek ©   (14.12.04 20:03) [65]


> Мне то очевидна. А может быть неочевидна другим.

Тут я согласен. Например, непрограммистам она не очевидна.

>  А если брать пионеров - то большинству.

Потому и написано было про школу.

> Для начала с постановкой согласен?

А то.


function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
 i: integer;
begin
 i := Low(M);
 while (i <= High(M)) and not odd(M[i]) do inc(i);
 Result := i <= High(M);
 if Result then FirstOdd := M[i];
end;


 
Piter ©   (2004-12-14 20:48) [71]

DiamondShark ©   (14.12.04 12:30) [27]
А там какое находится? Десятое?


Сори, не понял кода, подумал о другом...


 
Piter ©   (2004-12-14 22:06) [72]

DiamondShark ©   (14.12.04 15:48) [45]
А потом удавись


DiamondShark ©   (14.12.04 17:26) [59]
Посему надлежит тебе удавиться как можно скорее


в стиле DiamondShark...
Ты мне ответь - тебя в детстве часто били что ли, что ты на весь мир озлобленный?

P.S. Не понимаю, как модераторы такое с легкостью прощают. Может, за DiamondShark стоят хорошие знания, но что бросается в глаза - за ним стоит неприкрытое хамство.

Vovchik_A ©   (14.12.04 19:18) [61]
А в трамвае, выходит, можно ?


:))))


 
Igorek ©   (2004-12-14 22:58) [73]

Игорь Шевченко ©   (14.12.04 20:21) [67]

> Я наверное не совсем понимаю, это призыв к подробному
> толкованию для пионеров или как ?

Это призыв к ясности кода. А на пионерах хорошо проверяется.


 
Igorek ©   (2004-12-14 23:25) [74]

DiamondShark ©   (14.12.04 20:43) [70]
Вот мой вариант.

function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
I: Integer;
begin
Result := False;
for I := Low(M) to High(M) do
  if (M[I] mod 2) <> 0  then
  begin
    Result := True;
    FirstOdd := M[I];
    break;
  end;
end;


 
Igorek ©   (2004-12-14 23:28) [75]

Igorek ©   (14.12.04 23:25) [74]
Млин, нету предпросмотра, что-то с форматированием. Еще раз.

function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
 I: Integer;
begin
 Result := False;
 for I := Low(M) to High(M) do
   if (M[I] mod 2) <> 0  then
   begin
     Result := True;
     FirstOdd := M[I];
     break;
   end;
end;


 
Igorek ©   (2004-12-14 23:29) [76]

Сорри.

function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
 I: Integer;
begin
 Result := False;
 for I := Low(M) to High(M) do
   if (M[I] mod 2) <> 0  then
   begin
     Result := True;
     FirstOdd := M[I];
     break;
   end;
end;


---
Хорошо бы предпросмотр.


 
Игорь Шевченко ©   (2004-12-14 23:35) [77]

Igorek ©   (14.12.04 22:58) [73]


> Это призыв к ясности кода. А на пионерах хорошо проверяется.


Ясный код обычно находится в Source\VCL, не так ли ? :) Проверен на бесчисленном множестве пионеров.

С уважением,


 
Кудесник ©   (2004-12-15 00:56) [78]


> [77] Игорь Шевченко ©   (14.12.04 23:35)
> Ясный код обычно находится в Source\VCL, не так ли ? :)
> Проверен на бесчисленном множестве пионеров.


Но не смотря на проверку бесчисленным множеством "пионэров", в указанном коде, тоже не всё так гладко, и подпорок в нём с затычками хватает и других странностей... потому, наверно, и глючат (иногда) на ровном месте...


 
euru ©   (2004-12-15 01:35) [79]


function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
 i: Integer;
begin
 Result := True;
 for i := low(M) to high(M) do begin
   FirstOdd := M[i];
   if FirstOdd mod 2 = 1 then exit;
 end;
 Result := False;
end;


 
KSergey ©   (2004-12-15 08:11) [80]

Если уж голосовать, то я за
> [70] DiamondShark ©   (14.12.04 20:43)

Только с поправочкой: обязательно перед вставить {B-}. Для однозначности, чтобы не было кривотолков.
Хотя, если честно, есть у меня подозрение, что код (rjvgbkbhjdfyysq b jgnbvbpbhjdfyysq) выйдет практически одинаковым: что с while, что с for


 
Sandman25 ©   (2004-12-15 09:09) [81]

[76] Igorek ©   (14.12.04 23:29)

Кстати, а почему не вот так:

function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
I: Integer;
begin
for I := Low(M) to High(M) do
  if Boolean(M[I] and 1) then
  begin
    Result := True;
    FirstOdd := M[I];
    exit;
  end;
Result := False;
end;

Или чтобы break остался?


 
КаПиБаРа ©   (2004-12-15 09:45) [82]

Exit использую часто
Break, Abort очень-очень редко
Continue, Goto не использую


 
euru ©   (2004-12-15 09:56) [83]

Ещё вариант:

function FindFirstOdd(const M: array of Integer; var FirstOdd: Integer): boolean;
var
  i: Integer;
begin
  Result := False;
  for i := low(M) to high(M) do begin
    Result := M[i] mod 2 = 1;
    if not Result then continue;
    FirstOdd := M[i];
    break;
  end;
end;

:)


 
BiN ©   (2004-12-15 09:59) [84]

Имхо, судя по исходникам (TList.IndexOf, например), код поисковой функции в исполнении борланда, вполне вероятно, мог бы быть таким:


function IndexOfOdd(const M: array of Integer; var FirstOdd: Integer):Integer;
begin
 for Result:=Low(M) to High(M) do
   if Odd(M[Result]) then Exit;
 Result:=Low(M)-1;
end;


 
BiN ©   (2004-12-15 10:00) [85]

исправление BiN ©   (15.12.04 09:59) [84]

вместо
function IndexOfOdd(const M: array of Integer; var FirstOdd: Integer):Integer;

конечно должно быть

function IndexOfOdd(const M: array of Integer):Integer;


 
Суслик ©   (2004-12-15 10:17) [86]

Вчера разбирал код, который написал постановщик учета в нашей системе. Язык - мой скриптовый язык. Писан давно, поэтому:
1. Процедур нет
2. Блоков нет
3. Переходы по номеру строк
Т.е. что-то вроде бейсика.

Когда смотришь такой код и видишь:
1. Ясность мысли автора
2. Надеждное решение поставленной задачи
то задумываешься - какая разница как писать. Ясность кода не в эстетической красоте, а во внутренней логике.


 
Sandman25 ©   (2004-12-15 10:38) [87]

[86] Суслик ©   (15.12.04 10:17)

Не уверен, что "Ясность мысли автора" возможна при "Переходы по номеру строк".
По мере усложнения алгоритма и увеличения кода программы ясность от переходов по номерам строк будет постоянно уменьшаться. Зачем дожидаться момента, когда придется заменять все переходы на вызовы процедур, если можно сделать это сразу?
Хотя, конечно, возможны ограничения языков, когда процедур нет в принципе. На скриптовых языках обычно не пишутся длинные сложные программы.


 
Суслик ©   (2004-12-15 10:42) [88]


>  [87] Sandman25 ©   (15.12.04 10:38)


> Не уверен, что "Ясность мысли автора" возможна при "Переходы
> по номеру строк".

Ты знаешь, я сам был поражен, но это так.

Я не кассаюсь настройки системы. Так получилось, что я написал этот язык без особой цели. Но сейчас именно на нем реализована большАя часть бизнес-логики. Я знал, что на нем достаточно активно пишут. Но всегда считал, что это лабуда - типа ламеры одни. Но все не так просто оказалось. Код по аккуратности и строгости просто поражает.

На соснове просмотора более 3000 строк я нашел всего 2 ошибки и то несмертельные, скорее оформительские.


 
kai ©   (2004-12-15 10:43) [89]

вот еще вариант ;)

function FirstOddIdx(M: PInteger; Size: Integer): Integer;
begin
 Result := Integer(M) + Size * SizeOf(Integer);
 while (Integer(M) < Result) and Boolean(M^ and 1) do
   Inc(M);
 Result := Size - (Result - Integer(M)) div SizeOf(Integer);
end;

если не найдено, то Result = Size


 
Dmitriy O. ©   (2004-12-15 10:45) [90]

На счет Exit Break GOTO
воще все эти операторы очень нужны.
GOTO это вообще нужнейший оператор. Позволяет не выделять отдельные блоки кода в отдельные фукции а использовать их как подпрограммы в одной процедуре передавая ход выполнения цикла туда. И от туда


 
KSergey ©   (2004-12-15 10:46) [91]

>  [89] kai ©   (15.12.04 10:43)
> вот еще вариант ;)

А чем он отличается? Ну кроме прототипа самой функции? (что не соответствует условиям)


 
Суслик ©   (2004-12-15 10:47) [92]


>  [90] Dmitriy O. ©   (15.12.04 10:45)

Эттта, надоел уже провокации устраивать :)))))


 
Плохиш ©   (2004-12-15 10:49) [93]


>Суслик ©   (15.12.04 10:47) [92]
>>  [90] Dmitriy O. ©   (15.12.04 10:45)
>Эттта, надоел уже провокации устраивать :)))))

Да вся ветка одна сплошная провокация и флуд


 
Sandman25 ©   (2004-12-15 10:50) [94]

[88] Суслик ©   (15.12.04 10:42)

На соснове просмотора более 3000 строк я нашел всего 2 ошибки и то несмертельные, скорее оформительские.

Тут я вижу всего два варианта. Либо ты гений "ассемблероподобных" языков (без иронии), либо переходов по номеру строки там было довольно мало, не больше нескольких десятков.


 
kai ©   (2004-12-15 10:50) [95]

KSergey ©   (15.12.04 10:46) [91]
каким-таким условиям?
на входе - адрес массива (@M), длина
на выходе - индекс, либо число равное Size, сигнализирующее о том, что элемент не найден.
отличается?... да особо ничем... можно по участкам памяти пошарить...


 
Суслик ©   (2004-12-15 10:53) [96]


>  [94] Sandman25 ©   (15.12.04 10:50)


> Либо ты гений "ассемблероподобных" языков (без иронии),

Нет. Я его плохо знаю. Думаю просто - общепрограммистский опыт.


> либо переходов по номеру строки там было довольно мало,
> не больше нескольких десятков.

до хрена.

Я не говорю, что так надо писать. Моя мысль в том, что: ясность мысли ясна в любой нотации.
Я нисколько не спорю, что поддерживать такой код очень сложно. Но от этого он не теряет своего смысла, который может быть в итоге быть переведен в delphi.


 
KSergey ©   (2004-12-15 11:06) [97]

> [95] kai ©   (15.12.04 10:50)
> каким-таким условиям?

[65] Igorek ©   (14.12.04 20:03)


 
Sandman25 ©   (2004-12-15 11:08) [98]

[96] Суслик ©   (15.12.04 10:53)

Я нисколько не спорю, что поддерживать такой код очень сложно

Вот именно это меня и смущало, теперь все ясно и спорить не о чем :)
Для меня ясность кода заключается не только в том, что его легко понять, но и в том, что его легко поддерживать. Простейший пример - код, полученный методом copy-paste. Он может быть легкочитаемым, но ясным я бы его не назвал.


 
kai ©   (2004-12-15 11:09) [99]

KSergey ©   (15.12.04 11:06) [97]
извиняюсь, я это пропустил. ну, пусть будет нестандартный вариант -)


 
Суслик ©   (2004-12-15 11:19) [100]


>  [98] Sandman25 ©   (15.12.04 11:08)


> методом copy-paste


Как и в любой системе, так и в системе создания программных средств есть уровни. Будь то уровни абстракции, или осязаемые уровни, но они есть. Мой опыт говорит, что в создании относительно больших программных комплексов таких уровней минимум 2:
1 - реализация ядра
2 - настройка.

Совершенно не обязательно на уровне 2 заниматься настройкой системы на отельном языке или еще как-то . Это может быть тот же дельфи, но только пользоваться нужно интерфейсом, предоставляемым ядром.

На указанных уровнях могут сидеть специалисты, обладающие разными уровнями в программировании.

Как мне кажется на уровне ядра подход с копи-паст неприемлем. При доработках и модификациях нужно серьезно задумываться об повторном использовании коду. И это не дань красоте и крутости. Это есть жизненная необходимость - ядро огромный набор разных пакетов, состоящих из большого числа классов. Если начать копи-пастить, то можно привести это все в неуправляемый полет (вниз).

Другой вопрос - уровень настройки. Скажу честно, что я не вижу проблем в использовании в нем копи-паст. Поясню. Я думаю, что настройка подразумевает доработку поведения сущностей, при том, что базовое их поведение все-таки прописано в системе. Т.е. я не говорю, про случаи, когда на уровне настройки можно перестроить всю ситсему в корне. У нас другой случай. При этом такие доработки относительно небольшие: не более 1000 тыс строк. (иногда, но относительно редко больше). В этом случае такие настроечные блоки обладают особенностью быть однажды написанными и более немодифицированными. Поддержка такого кода требуется чрезвычайно редко. И если требуется, то по причине серьезных изменений в бизнес-логике. В этом случае такие блоки легче, быстрее, надежней переписать с нуля.


 
Думкин ©   (2004-12-15 11:33) [101]

> [100] Суслик ©   (15.12.04 11:19)
> При этом такие доработки относительно небольшие: не более 1000 тыс строк

Неслабо. :(

А система уровня - 1000000 млн. строк? :)


 
Суслик ©   (2004-12-15 11:34) [102]


>  [101] Думкин ©   (15.12.04 11:33)

на дельфи млн, но это ядро. Пока настройки в скриптовом языке. Сколько там, я достоверно не знаю, но много.


 
Думкин ©   (2004-12-15 11:36) [103]

>  [102] Суслик ©   (15.12.04 11:34)

Триллион строк? :) Респект.


 
Суслик ©   (2004-12-15 11:36) [104]


> [101] Думкин ©   (15.12.04 11:33)

а блин, я понял - описАлся я: конечно 1000 строк.
:)


 
Суслик ©   (2004-12-15 11:37) [105]


>  [103] Думкин ©   (15.12.04 11:36)

Хватит извеваться.
Все написано в [102] + [104]


 
kai ©   (2004-12-15 11:40) [106]

- поверь мне, карлсон, не строках счастье -(
- ты что - опух? а в чем же еще?
(с)


 
Суслик ©   (2004-12-15 11:41) [107]


> - поверь мне, карлсон, не строках счастье -(

полностью поддерживаю.
Хорошо, чтобы их было не более 10000. Их тогда наизусть можно помнить.
Серьезно.


 
Sandman25 ©   (2004-12-15 12:01) [108]

[100] Суслик ©   (15.12.04 11:19)

Ну, если поддержка требуется чрезвычайно редко, то можно с натяжкой согласиться :)


 
megabyte-ceercop ©   (2004-12-15 12:23) [109]

Я использую goto как заменитель break.
Сейчас делаю процедуру компиляции скрипта, так там четыре метки и около 27 goto операторов.
А используя другие методы - только запутаешься.


 
КаПиБаРа ©   (2004-12-15 12:33) [110]

megabyte-ceercop ©   (15.12.04 12:23) [109]
А используя другие методы - только запутаешься.


Приведи код этой процедуры. Посмотрим.


 
DiamondShark ©   (2004-12-15 12:43) [111]

Сейчас посмотрел одну свою простенькую утилиту, строк так примерно на 5000. Я в ужасе! Целых 4 break.
Я сгораю со стыда.


 
DiamondShark ©   (2004-12-15 12:44) [112]


> так там четыре метки и около 27 goto операторов

Поделись кодом.
Посмотрим, чем ему можно помочь...


 
Суслик ©   (2004-12-15 12:46) [113]


>  [111] DiamondShark ©   (15.12.04 12:43)

Может удавиться?
:)


 
Piter ©   (2004-12-15 17:49) [114]

Dmitriy O. ©   (15.12.04 10:45) [90]
GOTO это вообще нужнейший оператор. Позволяет не выделять отдельные блоки кода в отдельные фукции а использовать их как подпрограммы в одной процедуре передавая ход выполнения цикла туда. И от туда


да, авторитет нашего форума по ООП таки объяснил всем что собственно к чему

Суслик ©   (15.12.04 12:46) [113]

точно. Надо же когда-нибудь попробовать на себе то, что предлагаешь другим людям...


 
Igorek ©   (2004-12-15 22:05) [115]

Sandman25 ©   (15.12.04 9:09) [81]

> Кстати, а почему не вот так:

Предустановка результата функции в начале дает потом возможность использовать и break и exit. Потому кстати мой вариант и exit защищает. Да и просто привык так.


 
panov ©   (2004-12-17 10:36) [116]

>DiamondShark ©   (14.12.04 19:30) [64]
Прошу прощения за необоснованное предупреждение.


 
ПЛОВ ©   (2004-12-17 10:52) [117]

Мдя... Я и Exit и Break и goto использую... И ничего, компьютер не взрываеться, и не дымит :)))

Насчет ГОТО, так это, на мой взгляд, вообще замечательная весчь! Например, есть у меня некий цикл. Сколько раз его следует выполнить и когда выйти заранее неизвестно. Все выясняется по ходу... Без Эксита и Гото я б свихнулся код придумывать :))


 
Суслик ©   (2004-12-17 10:55) [118]


> Без Эксита и Гото я б свихнулся код придумывать :))

дело отпыта :))


 
GrayFace ©   (2004-12-19 08:56) [119]

Cobalt ©   (13.12.04 15:08) [1]
А я тут слышал от кого-то, что Goto - дурной тон.

В этом-то есть логика. Это так, если goto использовать для выхода за пределы цикла, а потом для возврата обратно.
Однако Exit и Break дурным тоном могут называть только ламеры.

марсианин ©   (13.12.04 15:24) [5]
exit в блоке try-finally. работать, конечно, будет, но лучше избегать.. благо это не сложно

Ага, заменив это на goto, который - тоже, типа, дурной тон. try..finally + exit (точнее, return) очень полезны в C, чтобы одновременно и возвратить значение, и исполнить какой-то финальный код.

Кудесник ©   (14.12.04 11:08) [22]
кроме goto, употребления которого в Паскале действительно следует избегать... конечно, имхо :)

А почему?

ламер ©   (14.12.04 13:41) [28]
вот от exit пытаюсь отказаться, но пока не очень получается.

Зачем? Ник хочешь оправдать? :)

Суслик ©   (14.12.04 15:30) [36]
goto не пользуюсь по тем же причинам - НЕ кажется эргономичным.

насколько я понимю слово "эргономичность", такой код ему вполне удволитворяет:
function ...
label done;
begin
 if ... then goto done;
 ...
 if ... then goto done;
 ...
done:
 какие-то финальные действия
end;

Все абсолютно прозрачно - почти exit, но с какими-то действиями напоследок.

KSergey ©   (14.12.04 15:42) [42]
И хотя на самом деле все работает (D5, либо я что-то проглядел, мож крыж какой есть?), т.е. если после цикла используешь - даже не ругается и оптимизацию "назад" не включает (хотя когда-то точно помню натыкался на предупреждение). Вот эсти бя не было такой приписки - все было бы здорово, а так...

В данном случае, например, цикл просто нельзя перевернуть - работать будет по-другому. Однако, можно наткнуться и на случай, когда оптимизация "назад" будет сделана.

Piter ©   (14.12.04 22:06) [72]
Спасибо, что привел кратое содержание всех удаленных постингов DimondShark"а. Мне понравилось.

Кудесник ©   (15.12.04 0:56) [78]
Но не смотря на проверку бесчисленным множеством "пионэров", в указанном коде, тоже не всё так гладко, и подпорок в нём с затычками хватает и других странностей... потому, наверно, и глючат (иногда) на ровном месте...

Потому, что самые ровные места в нем написаны пионерами. Вот пример:
procedure TCustomUpDown.UndoAutoResizing(Value: TWinControl);
var
 OrigWidth, NewWidth, DeltaWidth: Integer;
 OrigLeft, NewLeft, DeltaLeft: Integer;
begin
 { undo Window"s auto-resizing }
 OrigWidth := Value.Width;
 OrigLeft := Value.Left;
 SendMessage(Handle, UDM_SETBUDDY, Value.Handle, 0);
 NewWidth := Value.Width;
 NewLeft := Value.Left;
 DeltaWidth := OrigWidth - NewWidth;
 DeltaLeft := NewLeft - OrigLeft;
 Value.Width := OrigWidth + DeltaWidth;
 Value.Left := OrigLeft - DeltaLeft;
end;


Dmitriy O. ©   (15.12.04 10:45) [90]
GOTO это вообще нужнейший оператор. Позволяет не выделять отдельные блоки кода в отдельные фукции а использовать их как подпрограммы в одной процедуре передавая ход выполнения цикла туда. И от туда

Ты просто не понимаешь, зачем он нужен.


 
марсианин ©   (2004-12-19 20:49) [120]


> 2GrayFace ©   (19.12.04 08:56)
> Ага, заменив это на goto, который - тоже, типа, дурной тон.

нет. я имел ввиду принудительный выход из try..finally вообще
а избежать можно, например, возбудив исключение.. и перехватив его за блоком. но это сложнее.
я все больше прихожу к выводу, что это нормально (принудительный выход).

по поводу виртуальных функций в конструкторе. я попробовал, все работает на ура (VS 7). функция вызывается, причем та, которая и должна.. т.е. вызов полиморфный
надо тогда еще dynamic_cast испытать

а почему Страуструп не рекомендует, причина стандартная:
"результат зависит от реализации".
к тому же, как сам говорит Страуструп его рекомендации (а равно как и нерекомендации) никогда не являются категорическими.

по поводу других случаев goto/return/break/continue я думаю так: если хочется и знаешь, что делаешь - пиши!
return/break/continue - в циклах хочется писать часто, а вот про goto вспоминаю довольно редко...


 
Anatoly Podgoretsky ©   (2004-12-19 20:52) [121]

Если жизнь на Марсе?
Жизни может и нет, но программисты есть.


 
begin...end ©   (2004-12-19 21:29) [122]

> [120] марсианин ©   (19.12.04 20:49)

> по поводу других случаев goto/return/break/continue я думаю
> так: если хочется и знаешь, что делаешь - пиши!

И я. Того же мнения.

Кому интересно - вот две старые ветки с обсуждениями сабжа (нашёл в архиве клиента):

http://forever_young.russian.ru/goto1.htm

http://forever_young.russian.ru/goto2.htm


 
КаПиБаРа ©   (2004-12-20 07:08) [123]

GrayFace ©   (19.12.04 8:56) [119]
function ...
label done;
begin
if ... then goto done;
...
if ... then goto done;
...
done:
какие-то финальные действия
end;
Все абсолютно прозрачно - почти exit, но с какими-то действиями напоследок.


Никогда не было необходимости писать использовать в таких конструкциях оператор GOTO. Всегда обходился оператором Case of или if ... then ...Exit


 
GrayFace ©   (2004-12-20 14:01) [124]

марсианин ©   (19.12.04 20:49) [120]
нет. я имел ввиду принудительный выход из try..finally вообще
а избежать можно, например, возбудив исключение.. и перехватив его за блоком. но это сложнее.
я все больше прихожу к выводу, что это нормально (принудительный выход).

Не понял. Можешь код примерный показать?

КаПиБаРа ©   (20.12.04 7:08) [123]
А я встретился дважды в двух похожих случаях: строчный калькулятор и парсер вырожения по любой спецификации (сейчас пишу). Я имею ввиду не то, что делается через case, а необходимость в нескольких местах делать определенные действия и тут же выходить. Несколько проверок в абсолютно разных местах. Самое удобное и оптимальное в таких случаях - писать goto.


 
КаПиБаРа ©   (2004-12-21 07:18) [125]

Только что написал функцию с оператором goto
 // Заполнение массива положительными не повторяющимися номерами из списка
 procedure FillArrDatRec(ar: TArrDatRec; sl: TStrings);
 var
   i, k, n, lgh: Integer;
   label Next_Num;
 begin
   lgh := 0;
   for i := 0 to sl.Count-1 do
   begin
     n := StrToIntDef(sl[i], -1);
     if n > 0 then
     for k := 0 to lgh-1 do
     begin
       if ar[k].NSign = n then goto Next_Num
     end;
     Inc(lgh);
     SetLength(ar, lgh);
     ar[lgh].NSign := n;
   Next_Num:
   end;
 end;


и не умер :)))


 
KSergey ©   (2004-12-21 07:47) [126]

> [125] КаПиБаРа ©   (21.12.04 07:18)

Я, конечно, прошу прощения, но разве Continue уже не в моде? Или я не оценил шутку?


 
begin...end ©   (2004-12-21 07:56) [127]

> [125] КаПиБаРа ©   (21.12.04 07:18)

Ну это уже перебор, ИМХО. К тому же у Вас там есть выход за границы массива.

Я бы сделал так:

procedure FillArrDatRec(ar: TArrDatRec; sl: TStrings);
var
 I, K, N: Integer;
begin
  for I := 0 to sl.Count - 1 do
  begin
    N := StrToIntDef(sl[I], -1);
    if N > 0 then
      for K := 0 to High(ar) do
        if ar[K].NSign = N then Continue;
    SetLength(ar, Length(ar) + 1);
    ar[High(ar)].NSign := N
  end
end.


 
КаПиБаРа ©   (2004-12-21 08:24) [128]

begin...end ©   (21.12.04 7:56) [127]
Точно там еще куча ошибок. Я свои исправил, а Вы?
 // Заполнение массива положительными не повторяющимися номерами из списка
 procedure FillArrDatRec(var ar: TArrDatRec; sl: TStrings);
 var
   i, k, n, lgh: Integer;
   label Next_Num;
 begin
   lgh := 0;
   for i := 0 to sl.Count-1 do
   begin
     n := StrToIntDef(sl[i], -1);
     if n > 0 then
     begin
     for k := 0 to lgh-1 do
       if ar[k].NSign = n then continue;
     Inc(lgh);
     SetLength(ar, lgh);
     ar[lgh-1].NSign := n;
     end;
   Next_Num:
   end;
 end;


 
КаПиБаРа ©   (2004-12-21 08:25) [129]

Блин :))
     for k := 0 to lgh-1 do
       if ar[k].NSign = n then goto Next_Num;


 
КаПиБаРа ©   (2004-12-21 08:52) [130]

Заразная эта вещь - Goto. Чуть опять его не использовал. Хорошо хватило воли удержаться от этого.
:)))


 
Sandman25 ©   (2004-12-21 09:11) [131]

for k := 0 to lgh-1 do
      if ar[k].NSign = n then continue;
следует оформить в виде function IsInArray: Boolean и никаких goto не понадобится.


 
КаПиБаРа ©   (2004-12-21 09:26) [132]

Sandman25 ©   (21.12.04 9:11) [131]
Да понятно что есть много способов избежать goto. Если бы не было этой ветки я бы так и сделал.


 
begin...end ©   (2004-12-21 11:47) [133]

> [128] КаПиБаРа ©   (21.12.04 08:24)

Да, я ошибся в [127] насчёт Continue (спешил в институт :-) ).

Тогда можно так:

procedure FillArrDatRec(ar: TArrDatRec; sl: TStrings);
var
I, K, N: Integer;
begin
 for I := 0 to sl.Count - 1 do
 begin
   N := StrToIntDef(sl[I], -1);
   if N > 0 then
     for K := 0 to High(ar) do
       if ar[K].NSign = N then
         Break
       else if K = High(ar) then
       begin
         SetLength(ar, Length(ar) + 1);
         ar[High(ar)].NSign := N
       end
 end
end.


Правда, это не самый лучший вариант в смысле оптимальности.

В общем, я бы скорее предпочёл [131] Sandman25 ©   (21.12.04 09:11), или вместо вложенного for"а использовал while, но в последнем случае для повышения производительности потребовалось бы определять длину массива перед выполнением цикла, т.е. нужна была бы дополнительная переменная.



Страницы: 1 2 3 4 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.86 MB
Время: 0.059 c
3-1102494574
Fedor
2004-12-08 11:29
2005.01.09
Как лучше записи копировать?


11-1085054241
Ann
2004-05-20 15:57
2005.01.09
исходники mirror, mckObjs, mckCtrls, mcKACMIn, mckSoundctl


1-1103547659
Progh
2004-12-20 16:00
2005.01.09
TShellListView


14-1103690989
Slider007
2004-12-22 07:49
2005.01.09
Принтер HP Laser Jet 2300n


14-1103544368
Чеширский_Кот
2004-12-20 15:06
2005.01.09
Никого еще не достала?..





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