![]() |
![]() |
![]() |
|
OFF: goto - ваше отношение к этому оператору | ☑ | ||
---|---|---|---|---|
0
skunk
06.04.06
✎
06:03
|
ваше отношение к этому оператору... что это рудимент... или мощное средство борьбы с рекрусивными вызовами...
|
|||
1
Vint Kras
06.04.06
✎
06:04
|
goto...
в 1С бы его... |
|||
2
колодина
06.04.06
✎
06:05
|
goto - как декоративная косметика для женщины... в небольших количествах - очень украшает!
|
|||
3
Vint Kras
06.04.06
✎
06:06
|
+ тьфу, пля, я про CASE
|
|||
4
skunk
06.04.06
✎
06:07
|
(1) ;)))
(2)как тут недавно сказал композитор... код в студию... хотелось бы видеть хде он что-то украшает |
|||
5
колодина
06.04.06
✎
06:09
|
(3) согласна... люблю этот оператор....
|
|||
6
skunk
06.04.06
✎
06:11
|
(5)в нашем шопе женщинам 50% скидки ...
|
|||
7
Vint Kras
06.04.06
✎
06:13
|
(6) goto использовал один раз, без него было бы не удобно
|
|||
8
колодина
06.04.06
✎
06:13
|
(7) всего один раз? за сколько лет???????? ужасссссссссс..........
|
|||
9
Vint Kras
06.04.06
✎
06:14
|
(8) в 1С, а зачем ? чего ужасного ?
|
|||
10
skunk
06.04.06
✎
06:15
|
(7)код в студию...
|
|||
11
колодина
06.04.06
✎
06:15
|
(9) а... в 1С... хотя я его за 2 года работы в 1С использовала гораздо чаще... при работе с файлами...
|
|||
12
skunk
06.04.06
✎
06:18
|
(11)может покажешь... уж больно интересно
|
|||
13
колодина
06.04.06
✎
06:20
|
(12) не хочется лазать по конфигурациям... сейчас в 8-ке только работаю.... а там пока без goto обхожусь...
|
|||
14
skunk
06.04.06
✎
06:24
|
кто нить все таки покажет мне код в котором без этого апендика нельзя обойтись
|
|||
15
колодина
06.04.06
✎
06:27
|
(14) обойтись - можно всегда... но иногда именно этот оператор помогает сделать текст более компактным и удобным для анализа.
|
|||
16
AndrewHV
06.04.06
✎
06:31
|
(0)РУДИМЕНТ основной источник неприятностей у программистов с незапамятных времен.
|
|||
17
Obed
06.04.06
✎
06:32
|
Поледний раз использовал, когда на с++ писал, еще в школе :)
(16) угу, но (15) иногда случается |
|||
18
Vint Kras
06.04.06
✎
06:33
|
(14) вот тут видимо можно, но я посчитал что с ним удобнее:
Предупреждение("Несколько клиентов с одним ИНН ("+СокрЛП(ДБФ.PAYERINN)+"). Для получателя следует выбрать нужный."); ~Метка2: Послать.Установить("ТекЭлемент", ПлатежныеПоручения.Клиент); ОткрытьФормуМодально("Справочник.Клиенты.ФормаСписка",Послать); Если Послать.Получить("СтатусВозврата") = 1 тогда Если Послать.Получить("ВыбЗначение").ФлагНеИспользовать=1 тогда Предупреждение("Не, не, не, у этого стоит флаг не использовать..."); Перейти ~Метка2; Иначе Клиент.НайтиЭлемент(Послать.Получить("ВыбЗначение")); КонецЕсли; .... Иначе Предупреждение("Не, не, не, всё же надо выбрать..."); Перейти ~Метка1; КонецЕсли; |
|||
19
smaharbA
06.04.06
✎
06:37
|
Вот так без готу не сделать, скажете обычный цыкл, но внимательно позырьте...
~М1: //Тут код Перейти ~М2 //Тут тоже ~М2: //И тута... Перейти ~М1 |
|||
20
AndrewHV
06.04.06
✎
06:38
|
(18) Классический пример спагетти-кода в зародыше
|
|||
21
skunk
06.04.06
✎
06:38
|
(15)чисто женская логика ... линейная... как скачки туда сюда можно повышают читабельность текста?
(18)а в карточке написано вроде мужик |
|||
22
у лю 427
06.04.06
✎
06:39
|
(0) goto нах...
|
|||
23
Vint Kras
06.04.06
✎
06:39
|
+18 есть несколько карточек с одним ИНН (и не надо умничать по этому поводу), есть флаг, отбор по значению, в Метка1 если флаг у одного, то автомат, если ни у кого или нескольких вот етот кусок работает...
|
|||
24
skunk
06.04.06
✎
06:39
|
(19)самй обычный цикл... с условием
|
|||
25
skunk
06.04.06
✎
06:40
|
(22)не верят
|
|||
26
AndrewHV
06.04.06
✎
06:41
|
Использование меток и операторов безусловного перехода ухудшают читабельность кода и его сопровождение. Что и было продемонстрировано в (18), который без дополнительных комментариев (23) понять невозможно.
|
|||
27
колодина
06.04.06
✎
06:41
|
(21) чисто женская логика - это типа оскорбление? или простая констатация факта? кстати, женская логика - как раз нелинейная...
|
|||
28
skunk
06.04.06
✎
06:44
|
(27)как раз она линейная... если сравнивать с программированием... и оператор гоуту там появшись это потверждает... скачем туда сюда... а зачем и почему не ясно...
зы нет не оскробление... я когда начинаю хамить спрашиваю: "Вы Лева Баранов?" |
|||
29
smaharbA
06.04.06
✎
06:46
|
Началось, а бедные процессоры то не знают что гото это нехорошо...
|
|||
30
Vint Kras
06.04.06
✎
06:47
|
(21) ето ты про чё ?
|
|||
31
skunk
06.04.06
✎
06:47
|
(29)у них логика женская... линейная... мы же мыслим абстрактно... так сказать объектно-процедурно... есть объект... думаем как его иметь
|
|||
32
skunk
06.04.06
✎
06:48
|
(30)читай 26
|
|||
33
AndrewHV
06.04.06
✎
06:50
|
(29) вопрос не в том, что хорошо для процессоров, а в том, что хорошо для программистов. Для процессоров к примеру вообще не существует понятия "Культура программирования".
|
|||
34
skunk
06.04.06
✎
06:50
|
+33 да и на читабельность текста ему покакать
|
|||
35
Vint Kras
06.04.06
✎
06:51
|
(31) в моём случае - внешняя обработка, конфу менять низя, жесткое условие - должен обязательно выбрать карточку !!! ну и 23, у меня это заняло вот столько строк, поимей по другому...
|
|||
36
skunk
06.04.06
✎
06:52
|
(35)швырни в мыло обработкой...
|
|||
37
Obed
06.04.06
✎
06:55
|
(35)
|
|||
38
skunk
06.04.06
✎
06:56
|
(37)конкретная редиска ... (((
|
|||
39
Obed
06.04.06
✎
06:57
|
(38) Стараемся :)
|
|||
40
skunk
06.04.06
✎
06:59
|
на обед сегодня будет бризоль из баранины
|
|||
41
Obed
06.04.06
✎
07:01
|
(40) а у меня обед уже закончился :)
|
|||
42
skunk
06.04.06
✎
07:02
|
вам Денис очень повезло... а у нас еще и завтрак не начинался
|
|||
43
Obed
06.04.06
✎
07:03
|
а нах в такую рань-то вставать? :)
|
|||
44
Vint Kras
06.04.06
✎
07:04
|
(37) а если находясь в списке чел поубирал флаги у одного или нескольких...
|
|||
45
skunk
06.04.06
✎
07:04
|
(43)привычка... сплю три-четыре часа в сутки... если трезвым спать ложусь... вчера было выпито всего четыре бутылки пива... можно сказать, что спать лег трезвым
|
|||
46
Vint Kras
06.04.06
✎
07:07
|
+44 мне суть понятна, флаги, флаги, тогда я выбрал метки, по моему было удобнее, код имеет вполне читабельный вид..
|
|||
47
Obed
06.04.06
✎
07:08
|
(44) чего поубирал?
(46) на вкус и цвет, как говорится... |
|||
48
skunk
06.04.06
✎
07:09
|
(47)ты тоже не понял кто и что убирает
|
|||
49
Obed
06.04.06
✎
07:09
|
(45) Во блин сумасшедший.... Я тож раньше мог и по трое суток не спать, а что выспаться потом хватало 4-5 часов... а щас.....
|
|||
50
Obed
06.04.06
✎
07:10
|
(48) а ты понял? я чет нет.
|
|||
51
skunk
06.04.06
✎
07:10
|
(49)у меня режим работы такой... 23 года уже старый... блин тогда не зря я на пенсию ушел
|
|||
52
Vint Kras
06.04.06
✎
07:12
|
находясь в списке можно редактировать ? я думаю да. отредактировал, нажал закрыть не выбрав
|
|||
53
Obed
06.04.06
✎
07:13
|
(52) Тогда у тебя СтатусВозврата не 1 будет я так понимаю
|
|||
54
Obed
06.04.06
✎
07:14
|
(51) Да жизнь нелегкая сложилась )))
|
|||
55
Vint Kras
06.04.06
✎
07:15
|
(53) а это в коде не отрабатывает ?
|
|||
56
skunk
06.04.06
✎
07:15
|
(54)а кому в этой жизни легко было...
|
|||
57
skunk
06.04.06
✎
07:16
|
(55)что там не отработает... хотя без всего судить трудно....
|
|||
58
Obed
06.04.06
✎
07:16
|
(55) Здрасте:
фл=1; Пока фл=1 Цикл фл=0; Послать.Установить("ТекЭлемент", ПлатежныеПоручения.Клиент); ОткрытьФормуМодально("Справочник.Клиенты.ФормаСписка",Послать); Если Послать.Получить("СтатусВозврата") = 1 тогда ... Иначе Предупреждение("Не, не, не, всё же надо выбрать..."); фл=1; КонецЕсли; КонецЦикла; |
|||
59
Vint Kras
06.04.06
✎
07:17
|
прочтите 23
|
|||
60
Волшебник
модератор
06.04.06
✎
07:18
|
Год назад была похожая ветка: OFF: 1C и GoTo
Тогда флейма было гораздо больше. Прогресс! |
|||
61
Vint Kras
06.04.06
✎
07:18
|
(60) ты всё испортил... ща начнеться
|
|||
62
Obed
06.04.06
✎
07:20
|
(59) Не очень понятно... была бы обработка целиком (я так понимая, что с конфой даже), тогда можно было бы понять, а так сложно
|
|||
63
Obed
06.04.06
✎
07:20
|
(60) :)
|
|||
64
skunk
06.04.06
✎
07:20
|
(60)стараемся...
|
|||
65
Vint Kras
06.04.06
✎
07:25
|
отбор по ИНН
несколько карточек с одним ИНН. есть флаг использовать, не использовать может стоять у одного, у всех, у нескольких, ни у кого, подстановка только того у кого разрешено. форма возвращает список "СтатусВозврата" - 0,1 и выбранное значение код должен работать так, что выбор должен быть произведен в любом случае. задача ясна ? ставим отбор по ИНН ~Метка1 смотрим флаги, если у одного то проставляем его автоматом, если у нескольких то код в 18 |
|||
66
skunk
06.04.06
✎
07:29
|
(65)я же просил скинуть обработку ... skunk_ dog mail dot ru
|
|||
67
Vint Kras
06.04.06
✎
07:32
|
(66) там несколько клиент банков, платежки, выписки, функции достаточно будет ща пришлю...
|
|||
68
Obed
06.04.06
✎
07:32
|
(65) Тогда в ОткрвтьФормуМодально посчитаем сколько флагов стоит, и если один, сразу вернем нужное значение
|
|||
69
Vint Kras
06.04.06
✎
07:39
|
(68) это понятно, но модуль формы менять низя
|
|||
70
Obed
06.04.06
✎
07:40
|
(69) Тогда перед вызовом формы, если авто - тогда и не открываем ее
|
|||
71
Vint Kras
06.04.06
✎
07:40
|
как теги поставить ? я ща код сюда запостю, там строк 30-40....
|
|||
72
Vint Kras
06.04.06
✎
07:41
|
(70) она и не открывается, если один с флагом...
|
|||
73
Obed
06.04.06
✎
07:42
|
(72) ну тогда о чем базар - долнжо и так работать
|
|||
74
Vint Kras
06.04.06
✎
07:44
|
какие теги для кода ?
|
|||
75
Obed
06.04.06
✎
07:45
|
|
|||
76
Obed
06.04.06
✎
07:46
|
блин 1С
/1С в квдратных скобках |
|||
77
Vint Kras
06.04.06
✎
08:00
|
~Метка1: Если Клиент.ВыбратьЭлементыПоРеквизиту("ИНН",ИНН,0,0) = 1 тогда Пока Клиент.ПолучитьЭлемент() = 1 Цикл Если Клиент.ФлагНеИспользовать=0 тогда ФлагИНН=ФлагИНН+1; ВыбКлиент = Клиент.ТекущийЭлемент(); Продолжить; Иначе Если ФлагИНН=0 тогда ВыбКлиент = Клиент.ТекущийЭлемент(); КонецЕсли; КонецЕсли; КонецЦикла; Если ФлагИНН > 1 тогда Предупреждение("Несколько клиентов с одним ИНН ("+ИНН+"). Для получателя следует выбрать нужный."); ~Метка2: Послать.Установить("ТекЭлемент", ВыбКлиент); ОткрытьФормуМодально("Справочник.Клиенты.ФормаСписка",Послать); Если Послать.Получить("СтатусВозврата") = 1 тогда Клиент.НайтиЭлемент(Послать.Получить("ВыбЗначение")); Если Клиент.ФлагНеИспользовать=1 тогда Предупреждение("Не, не, не, у этого стоит флаг не использовать..."); Перейти ~Метка2; КонецЕсли; ВыбКлиент = Клиент.ТекущийЭлемент(); Иначе Предупреждение("Не, не, не, всё же надо выбрать..."); Перейти ~Метка1; КонецЕсли; ИначеЕсли ФлагИНН = 0 тогда Предупреждение("Список клиентов с данным ИНН есть, но у них у всех стоит флаг не использовать. Уберите флаг и попробуйте снова."); ~Метка3: Послать.Установить("ТекЭлемент", ВыбКлиент); ОткрытьФормуМодально("Справочник.Клиенты.ФормаСписка",Послать); Если Послать.Получить("СтатусВозврата") = 1 тогда Клиент.НайтиЭлемент(Послать.Получить("ВыбЗначение")); Если Клиент.ФлагНеИспользовать=1 тогда Предупреждение("Не, не, не, у этого стоит флаг не использовать..."); Перейти ~Метка3; КонецЕсли; ВыбКлиент = Клиент.ТекущийЭлемент(); Иначе Предупреждение("Не, не, не, всё же надо выбрать..."); Перейти ~Метка1; КонецЕсли; КонецЕсли; Иначе тут тожа код... КонецЕсли; По моему код вполне читаем, отработаны все ситуации (на которые у меня ума хватило), выбран будет в любом случае... это единственный раз когда я использовал goto, и по моему без него было бы менее читабельно. теперь судите, что у меня там женское мышление... |
|||
78
Vint Kras
06.04.06
✎
08:01
|
а, пля не отработало...
а 1С в русской раскладке ? |
|||
79
Vint Kras
06.04.06
✎
08:01
|
я |
|||
80
Obed
06.04.06
✎
08:01
|
(78) в англицкой
|
|||
81
Vint Kras
06.04.06
✎
08:03
|
(80) ну я так и сделал
|
|||
82
Vint Kras
06.04.06
✎
08:03
|
a |
|||
83
skunk
06.04.06
✎
08:07
|
эй заканчиваете флудить в тематической фетке ))
(77)не суди и не судимым будешь... но код поему можно упростить |
|||
84
Obed
06.04.06
✎
08:08
|
|
|||
85
Obed
06.04.06
✎
08:09
|
Например так
|
|||
86
Obed
06.04.06
✎
08:09
|
Тест |
|||
87
Obed
06.04.06
✎
08:10
|
|
|||
88
Obed
06.04.06
✎
08:10
|
(87) что я делаю не так?
|
|||
89
Vint Kras
06.04.06
✎
08:11
|
вот и у меня ни как..
g |
|||
90
Vint Kras
06.04.06
✎
08:13
|
хорошо, но по моему код в 77 лучше читается чем в 84 (если не считать что тег не встал)
|
|||
91
Obed
06.04.06
✎
08:14
|
(89) первый 1С без слеша
|
|||
92
skunk
06.04.06
✎
08:14
|
в начале надо ставить тэг
... затем
вот так
|
|||
93
Obed
06.04.06
✎
08:14
|
(90) Я ж говорил - на вкус и цвет )))
|
|||
94
skunk
06.04.06
✎
08:16
|
хм... тэг срабатывает даже в середине текста
|
|||
95
Vint Kras
06.04.06
✎
08:16
|
(92) а упростить что хотел ?
|
|||
96
skunk
06.04.06
✎
08:20
|
в (92) я хотел просто показать что сначала надо ставить тэг без слэша... только и всего
|
|||
97
Vint Kras
06.04.06
✎
08:21
|
|
|||
99
Vint Kras
06.04.06
✎
08:23
|
(96) я про 83
|
|||
100
Мулька
06.04.06
✎
08:31
|
100
|
|||
101
skunk
06.04.06
✎
08:33
|
(99)ты бы код выслал... а то меня сейчас думать ломает... вечером посмотрю... если папа опять чего-нить не придумает
|
|||
102
Иде я
06.04.06
✎
08:39
|
Я всегда использую оператор GOTO. По правилам программирования в каждой программе должен быть оператор GOTO. Обычно я начинаю программу оператором GOTO. И всегда заканчиваю программу этим оператором. Оператор GOTO позволяет писать легкие, кросплатформенные и масштабируемые программы. В среде профессианальных програмистов считается хорошим тоном использовать на каждой странице кода не менее 3-х операторов GOTO. Гуру, которых даже среди профессианалов насчитывается единицы, используют до 15(!) операторов GOTO на страницу кода. Это делает их программы быстрыми и легкими - как прокисший Данон, не успевает влететь, как уже пора на вылет.
: ) |
|||
103
skunk
06.04.06
✎
08:43
|
эт верно
|
|||
104
Simod
06.04.06
✎
08:45
|
(0) Ни разу не использовал. Согласен с (22).
|
|||
105
Регистр
06.04.06
✎
08:47
|
|
|||
106
skunk
06.04.06
✎
08:50
|
(105)что попробуешь?
|
|||
107
Obed
06.04.06
✎
08:50
|
(106) видать тег :)
|
|||
108
skunk
06.04.06
✎
08:55
|
аха
|
|||
109
Vint Kras
06.04.06
✎
09:00
|
(108) нафиг эту тему завёл ?
|
|||
110
skunk
06.04.06
✎
09:02
|
(109)скучно... зашел в ит отдел ... глянул на код... увидал его... стало интересно кто его еще использует
|
|||
111
GrayT
06.04.06
✎
09:08
|
(0)Стараюсь не использовать. Нет не так. Ни в одной моей программе его нет.
|
|||
112
skunk
06.04.06
✎
09:10
|
(111)из принципа?
|
|||
113
Колумбарий
06.04.06
✎
09:10
|
Мое отношение:
"Не человек ради догмы, а догма ради человека". Если догма мешает - значит ее можно преступить. |
|||
114
skunk
06.04.06
✎
09:14
|
то есть если без гоуту у тебя не айда... имеешь гоуту
|
|||
115
Vint Kras
06.04.06
✎
09:18
|
может лучше Case of как нить замострячить попробуем ?
|
|||
116
skunk
06.04.06
✎
09:24
|
else ... then
elsif ... then endif |
|||
117
Колумбарий
06.04.06
✎
09:26
|
2(114) Вы мне? Это всего лишь продолжение принципа "не человек для субботы, а суббота для человека". Автора помните?
|
|||
118
igork1966
06.04.06
✎
09:26
|
(0)
А как вы относитесь к гомосексуалистам? А никак, я к ним не отношусь. ;-) |
|||
119
skunk
06.04.06
✎
09:28
|
(117)трудно вспомнить то ... чего не знал...
(118)аналогично |
|||
120
Рупор абсурда
06.04.06
✎
09:29
|
(0) Я использовал его 1 раз ..., лишь потому, что там без него обойтись было вовсе невозможно ...
|
|||
121
skunk
06.04.06
✎
09:31
|
(120)а это становится интересным... покажи
|
|||
122
Vint Kras
06.04.06
✎
09:31
|
(116)
а так :
|
|||
123
Ангел- Хоронитель
06.04.06
✎
09:31
|
(0)всегда когда казалось, что без него не обойтись, немного подумав, понимал, что обойтись можно :)
(120)можно код посмотреть? |
|||
124
GrayT
06.04.06
✎
09:34
|
(112)Шаблонное мышление, как то вбили в голову что наличие меток = плохо структуированный модуль
А Рупор опять народ разводит :))) |
|||
125
Колумбарий
06.04.06
✎
09:36
|
2(124) Почему разводит? Например для прерывания или продолжения одного цикла есть операторы, а для прерывания или продолжения цикла в цикле - нету.
|
|||
126
skunk
06.04.06
✎
09:36
|
(122)а так... пропадает код ...который можно воткнуть сюда
else ... then elsif ... then else code of magic endif |
|||
127
skunk
06.04.06
✎
09:37
|
(125)ты и циклы рвешь?
|
|||
128
Kraft
06.04.06
✎
09:37
|
(0) зависит от ситуации. Когда юзаешь чужой код, то не нравитца
|
|||
129
Колумбарий
06.04.06
✎
09:38
|
2(127) вы 117 точно внимательно прочитали?
|
|||
130
GrayT
06.04.06
✎
09:38
|
(125)Этот пример не подходит к определению "без него обойтись было вовсе невозможно"
|
|||
131
GrayT
06.04.06
✎
09:39
|
+130 Кстати выйти из вложенного цикла на верхний уровень (за первый цикл) можно и без метки.....
|
|||
132
Колумбарий
06.04.06
✎
09:39
|
2(130) Я готов послушать как ты внутри вложенного цикла скажешь, что нужно выполнить следующую итерацию внешнего цикла.
|
|||
133
skunk
06.04.06
✎
09:40
|
(129)я же вроде как сказал...
|
|||
134
Колумбарий
06.04.06
✎
09:41
|
2(133) что вы сказали? Что внимательно его прочитали? Или что не знали автора?
|
|||
135
skunk
06.04.06
✎
09:41
|
(132)а какие с этим проблемы...
|
|||
136
GrayT
06.04.06
✎
09:42
|
(134)Не ну это совсем просто - Продолжить :)))
|
|||
137
Колумбарий
06.04.06
✎
09:44
|
2(136) Вы перейдете к следующей итерации вложенного цикла. Во внешнем цикле останется текущая итерация.
2(135) Ну - это вы мне задали вопрос. После того, как я дал ответ, который является ответом и на него тоже. |
|||
138
skunk
06.04.06
✎
09:48
|
intConditionOne = 1;
while intCondition = 1 do intConditionTwo = 1 while intConditionTwo = 1 do if intConditionTwo = 1 then intConditionOne = 0; intConditionTwo = 0; endif; enddo; if intConditionOne = 0 then intConditionOne = 1; continue; endif; ... ... intConditionOne = 0; enddo; |
|||
139
GrayT
06.04.06
✎
09:48
|
Блин... Прервать.
|
|||
140
Колумбарий
06.04.06
✎
09:51
|
2(139) Ок. Теперь три вложенных цикла.
Или два, но прервать нужно внешний. 2(138) Для вас - четыре вложенных цикла. |
|||
141
skunk
06.04.06
✎
09:55
|
(140)у вас не хвататет фантазии... вам код показать
|
|||
142
GrayT
06.04.06
✎
09:55
|
(140) Испугал :)))
Пока сч1 = 1 по 10 Цикл Попытка Пока сч1 = 1 по 10 Цикл Пока сч1 = 1 по 10 Цикл а = 1/0; //:)))) КонецЦикла КонецЦикла Исключение КонецПопытки КонецЦикла |
|||
143
GrayT
06.04.06
✎
09:55
|
Счетчики сами подпраите.
|
|||
144
igork1966
06.04.06
✎
09:57
|
(140) Типа такого:
УсловиеВыхода1 = Ложь; Пока УсловиеВыхода1 Цикл Пока УсловиеВыхода2 Цикл ..... УсловиеВыхода1 = ......... ..... УсловиеВыхода2 = УсловиеВыхода2 Или ВычислениеУсловияВыхода2(); КонецЦикла УсловиеВыхода1 = УсловиеВыхода1 Или ВычислениеУсловияВыхода1(); КонецЦикла |
|||
145
Колумбарий
06.04.06
✎
09:57
|
2(141) Нет, просто в этом коде - что разбираться с intConditionOne, intConditionTwo, intConditionTree, intConditionFour, что использовать Перейти - код не будет отличаться качеством ни в том ни в другом случае.
Следовательно всегда существует граница, когда дешевле и удобнее использовать Перейти, чем неиспользовать. |
|||
146
skunk
06.04.06
✎
09:59
|
зачем тебе два условия... если из четвертого надо будет попать в первый...
|
|||
147
skunk
06.04.06
✎
09:59
|
очепятка в 146 вместо два читать четыре
|
|||
148
igork1966
06.04.06
✎
09:59
|
(145) Вместо УсловиеВыходаХ можно использовать номер уровня на который нужно уйти.
|
|||
149
Колумбарий
06.04.06
✎
09:59
|
Рупор просил передать:
http://avb1c.narod.ru/?=a13 Примерчики: с тэгом <FONT>, с таблицами стилей 2(146) Из любого нужно попасть в первый. |
|||
150
Колумбарий
06.04.06
✎
10:00
|
2(148) Э... У меня опять не хвататет фантазии. Можно код?
|
|||
151
GrayT
06.04.06
✎
10:00
|
(149(Именно это я имел ввиду о разводе Рупора :)
|
|||
152
GrayT
06.04.06
✎
10:01
|
(150) 142 прокомментировать не желаете?
|
|||
153
Колумбарий
06.04.06
✎
10:03
|
2(152) годится, вариант... Правда в каком-то смысле Попытка - это тоже Перейти, но все-таки оформленная как операторные скобки, поэтому с точки зрения структурного программирования более легитимная конструкция, чем Перейти
|
|||
154
Vozhd
06.04.06
✎
10:07
|
(153) Предлагаю рассмотреть вопрос нескольких точек выхода из вложенных циклов. Будете использовать вложенные попытки? И все вернется к (138), только еще и завернутое в обработки исключений? - Жуть...
|
|||
155
skunk
06.04.06
✎
10:08
|
(152)мое мнение тоже не правильно... как и прервать...
|
|||
156
GrayT
06.04.06
✎
10:08
|
(154)Реальную бы задачку, где может такое потребоваться....
|
|||
157
GrayT
06.04.06
✎
10:10
|
(155)Не спорю. Кстати, обычно я твоим способом обычно и пользуюсь
|
|||
158
skunk
06.04.06
✎
10:11
|
(154)да ну брось... хотя Gray прав... покажи реальную задачу
|
|||
159
skunk
06.04.06
✎
10:12
|
(157)я этим способом редко пользуюсь... это так... что бы сильно мозги не напрягать
|
|||
160
Вильям
06.04.06
✎
10:14
|
||||
161
Erlinn
06.04.06
✎
10:15
|
Полтораста постов с хвостиком - и никто не читал чудо-книгу Майерса. Эх, молодежь... Кхе-кхе... чему вас только в гимназиях учат...
|
|||
162
skunk
06.04.06
✎
10:16
|
в школе младших командиров учат командовать личным составом подразделения...
|
|||
163
skunk
06.04.06
✎
10:16
|
в гимназиях не обучались
|
|||
164
GrayT
06.04.06
✎
10:18
|
(161)Спасибо за комплимент....
|
|||
165
Erlinn
06.04.06
✎
10:19
|
(160) Mr.William, респект! Один читатель среди писателей.
|
|||
166
omega_juice
06.04.06
✎
10:21
|
видел я такой код, который и без оператора goto был совершенно нечитаем.
а приличиям следовать надо, но без фанатизма. имхо. |
|||
167
NS
06.04.06
✎
10:22
|
Очень редко, но вроде несколько лет назад разок использовал...
(156) В поиск - куча реальных задач. |
|||
168
Ёпрст2
06.04.06
✎
10:22
|
(0)За goto в коде еще в школе 2 бала без объяснения ставили, низкая квалификация программирования ...
|
|||
169
skunk
06.04.06
✎
10:23
|
(169)я видал как человека на работу не взяли... открыли его экзапл... а там метка... адью... линейщики нам не нужны
|
|||
170
NS
06.04.06
✎
10:25
|
(168) Всё зависит от ситуации. Я бы поставил 2 балла преподу, которые не разбираясь ставит банан за Goto...
|
|||
171
Гений 1С
гуру
06.04.06
✎
10:25
|
Да че вы спорите, идеологи программирования давно уже доказали, что можно работать без GOTO. Т.е. этот оператор ВСЕГДА можно заменить и это повышает читабельность програмы.
Хотя я юзал пару раз. |
|||
172
Vint Kras
06.04.06
✎
10:26
|
(171) про читабельность я привёл пример
|
|||
173
Каанкереде
06.04.06
✎
10:27
|
Никогда не понимал, зачем нужен этот оператор и никогда его не использовал...
А читать код с готу и метками, это еще тот экстрим. А если еще и карандаша нет, то вообще пипец... |
|||
174
SynchroFaza Tron
06.04.06
✎
10:28
|
Без этого оператора написание Вэб приложений 1С 7.7 стало бы просто невозможным. (173) но про полную нечитабельность кода я согласен.
|
|||
175
NS
06.04.06
✎
10:29
|
(171) Всегда повышает читабельность программы?
:метка2; Цикл Если условие тогда goto метка1 Иначеесли тогда goto метка2 иначе ........ КонецЕсли; конеццикла; Цикл Если условие тогда goto метка1 Иначеесли тогда goto метка2 иначе ........ КонецЕсли; конеццикла; Цикл Если условие тогда goto метка1 Иначеесли тогда goto метка2 иначе ........ КонецЕсли; конеццикла; :метка1; // Даже без вложенных циклов - ну ка, повысь читабельность.... |
|||
176
Ёпрст2
06.04.06
✎
10:34
|
(175) В таком коде, раньше (когда еще двк были), если создавать динамические переменные, у тебя память бы давно кончилась, когды ты прыгаешь по меточкам ... поубивал бы ..
|
|||
177
GrayT
06.04.06
✎
10:36
|
(179)А при чем тут динамические переменные????
|
|||
178
Колумбарий
06.04.06
✎
10:36
|
2(161) Почему не читали? Читали. Просто Товарищ Христос для нас больший авторитет
|
|||
179
NS
06.04.06
✎
10:37
|
(176) Какие динамические переменные? Ты о чем?
Такой код во всем мире считается идеальным, и так пишут доктора наук... Доктора - за заслуги в программированиии. И Такой код включен в тесты компиляторов... Как ОЧЕНЬ ХОРОШЫЙ КОД!!! Насколько я понял - ты даже не понимаешь, что такое динамические переменные... |
|||
180
SynchroFaza Tron
06.04.06
✎
10:38
|
(175) Ну что типа:
Функция Сравнить(ляляля) Если Возврат условие1; иначе Возврат Условие2; Конецесли; Конецфункции Функция обработать() Пока Истина цикл Цикл рез = Сравнить(Параметр); Если рез = условие1 тогда возврат "То что нужно вернуть или просто выход из функции"; иначеесли рез = условие2 тогда продолжить; Конецесли конеццикла; Цикл рез = Сравнить(Параметр); Если рез = условие1 тогда возврат "То что нужно вернуть или просто выход из функции"; иначеесли рез = условие2 тогда продолжить; Конецесли конеццикла; Цикл рез = Сравнить(Параметр); Если рез = условие1 тогда возврат "То что нужно вернуть или просто выход из функции"; иначеесли рез = условие2 тогда продолжить; Конецесли конеццикла; Конеццикла // главный цикл. КонецФункции |
|||
181
Ёпрст2
06.04.06
✎
10:38
|
(177) При том , что можно сравнить с вложенной ркурсией, из которой нет выхода...
Если создавать динамические переменные, например int i; то под них выделяемая память не очищалась и после 10 минут работы такой программы комп затихал :)) а народ долго не мог понять , в чем дело ... |
|||
182
SynchroFaza Tron
06.04.06
✎
10:39
|
(180) + условия "иначе" сюда можно добавить без проблем.
|
|||
183
SynchroFaza Tron
06.04.06
✎
10:40
|
(180)+ в начале описался: читать "что-то типа:"
|
|||
184
GrayT
06.04.06
✎
10:40
|
(181)int i - Динамическая переменная??? Я в С не силен....
|
|||
185
Каанкереде
06.04.06
✎
10:40
|
(175) ты дал отличный пример неситабельности..... ты что сделать то хотел? скажи, тебе напишут нормальный код..
|
|||
186
Ёпрст2
06.04.06
✎
10:41
|
(179) Для процедурных языков, например Паскаля, статические - это объявленны е глоб переменные в начале модуля, динамические - внутри процедур, в си динам. переменные можно объявлять было где угодно ... В жабе встроенный механизм очистки мусора .. Чего еще рассказать ?
|
|||
187
NS
06.04.06
✎
10:42
|
(181) Я так понимаю, что это был твой код...
(180) И ты поймешь по продолжить, в каком месте программы искать мето на которое программа перейдет???? Ты сделал вложенный цикл на ровном месте... У тебя может регистров в процессоре не хватить - и Переменная образуется в стеке/памяти - сможешь с трех раз угадать, насколько это замедлит быстродействие программы, у которой все вычисления (все данные для вычислений) хранятся в внутренних регистрах проца???? |
|||
188
NS
06.04.06
✎
10:42
|
(186) С тобой всё ясно - в такой ситуации лучше промолчать...
|
|||
189
GrayT
06.04.06
✎
10:43
|
(186)Да не не надо.......
Динамическая переменная, это когда память динамически выделяется New() |
|||
190
Каанкереде
06.04.06
✎
10:44
|
+(185) о понял... прервать, продолжить - там лучший вариант.
|
|||
191
SynchroFaza Tron
06.04.06
✎
10:45
|
(187) Да, пойму. Если код программы хорошо оформлен - то в этом разобраться непроблема. А что ты за глупость про регистры процессора написал, при чем здесь обычный цикл?
|
|||
192
Mort
06.04.06
✎
10:46
|
(186) Жесть.
|
|||
193
skunk
06.04.06
✎
10:47
|
мдя начинается новая война ... goto против .... чего пока не ясно
|
|||
194
Vint Kras
06.04.06
✎
10:47
|
ширинки застегните !
|
|||
195
GrayT
06.04.06
✎
10:48
|
(191)А он сам как компилятор - оптимизирует циклы за счет использования регистров. И это правильно...
|
|||
196
Колумбарий
06.04.06
✎
10:49
|
Это как война тупоконечников с остроконечниками. Никто не может мне запретить разбивать яйцов с той стороны, с какой мне удобно. Кто не согласен - пусть подает на меня в суд.
|
|||
197
NS
06.04.06
✎
10:49
|
(185) И что в этом коде нестабильного?
|
|||
198
skunk
06.04.06
✎
10:50
|
ни кто и ни чего не запрещает... а вот использовать / не использовать... и насколько оно кошерно
|
|||
199
Vint Kras
06.04.06
✎
10:50
|
он ввиду нечитабельность
|
|||
200
Каанкереде
06.04.06
✎
10:50
|
(197) "неситабельности" надо читать как "нечитабельности"
|
|||
201
SynchroFaza Tron
06.04.06
✎
10:50
|
(195) наверное я чего не понимаю. При чем здесь регистры процессора? Они что по разному используются при выполнении цикла и оператора GOTO? Неужели нашлись люди которые Дисассемблер 1С делали, что бы посмотреть как там ресурсы машины используются?
|
|||
202
SynchroFaza Tron
06.04.06
✎
10:51
|
(194) НЕСИ ЛИНЕЙКУ!!!
|
|||
203
Колумбарий
06.04.06
✎
10:51
|
2(201) Он имел в виду, что при использовании функции юзается стэк, и регистр для стэка может закончится, если уровней очень много
|
|||
204
SynchroFaza Tron
06.04.06
✎
10:52
|
(201) Я понимаю - но процедура не рекурсивная! О каком стеке идет речь?
|
|||
205
GrayT
06.04.06
✎
10:52
|
(201)Ни какой дизассемблер не нужен, если помнить, что компилятор имеет функции оптимизации кода, как то не вычислять логическое выражение до конца, использовать регистры в циклах, а не переменные и т.д. (старею - склероз)
|
|||
206
SynchroFaza Tron
06.04.06
✎
10:53
|
(204) -> (203)
|
|||
207
Колумбарий
06.04.06
✎
10:53
|
2(204) Но ведь ты рассмотрел частный пример. А если вложенность циклов - 100?
|
|||
208
GrayT
06.04.06
✎
10:53
|
(203)Не совсем
|
|||
209
Парижская фанера
06.04.06
✎
10:54
|
(0) Не пользуюсь ибо не зачем при правильном проектировании и написании кода...
|
|||
210
SynchroFaza Tron
06.04.06
✎
10:54
|
(204) Приведи пример практической необходимости такой конструкции?
|
|||
211
Guk
06.04.06
✎
10:55
|
(197) Странно. Совсем недавно, ты утверждал, что использование меток в 1С - моветон...
|
|||
212
NS
06.04.06
✎
10:55
|
(201) При чем тут 1С? Речь идет о программировании.
(200) Поздравляю, ты пишешь лучше Американской Элиты программирования и Докторов наук, например Хиатта. И лучше их разбираешься в читабельности кода. |
|||
213
SynchroFaza Tron
06.04.06
✎
10:55
|
(210)->(207) Просто еще не проснулся:)
|
|||
214
Фокусник
06.04.06
✎
10:55
|
go to, не go to… Ной взгляд, конструкция Пока 1=1 Цикл ни чем не лучше метки. Разве что только если форматирование цикла лучше помогает увидеть структуру. А вот например, если есть 3 вложенных цикла и из внутреннего нужно сразу попасть в первый, то, ИМХО метка – лучшее и наиболее прозрачное решение...
|
|||
215
Фокусник
06.04.06
✎
10:57
|
+214 "Ной" = "На мой" (-:
|
|||
216
Mort
06.04.06
✎
10:57
|
Какие нафиг быстродействия в регистрах в 1С, господа вы о чем? Множество операций в 1с завязаны на БД - остальные над действиями с немалыми объектами, тут операции GOTO и организация цикла дают мелкие проценты всего времени.
А вообще GOTO заставляет рассматривать прогу как набор строк, и вносит разлад в четкое понимание кооперации объектов. GOTO - оцтой. |
|||
217
Каанкереде
06.04.06
✎
10:57
|
(212) а они на каком языке писали? может у них прервать продолжить не было?
|
|||
218
SynchroFaza Tron
06.04.06
✎
10:58
|
(214) Переход в начало внешнего цикла можно легко организовать при помощи Прервать-продолжить.
|
|||
219
GrayT
06.04.06
✎
10:59
|
(211)Он просто нигилист :)
(216)С-шному компилятору это неизвестно :) |
|||
220
Колумбарий
06.04.06
✎
10:59
|
2(218) Опять же - не в начало первого, в начало любого уровня.
|
|||
221
Фокусник
06.04.06
✎
10:59
|
218 вот именно, что "организовать", т.е. это будет не на 100% прозрачно...
|
|||
222
Mort
06.04.06
✎
10:59
|
(219) Кто нибудь сейчас пишет на си (без плюсов)?
|
|||
223
Каанкереде
06.04.06
✎
11:00
|
(222) пишут
|
|||
224
GrayT
06.04.06
✎
11:00
|
(222)Не передергивай.
|
|||
225
Парижская фанера
06.04.06
✎
11:00
|
(216)>>Какие нафиг быстродействия в регистрах в 1С
Вот уж действительно... Я уже приводил пример простейший - замена определенного символа в текст. файле в реализации на 1С и C#... Пока 1С это сделает можно пойти и покурить... П.э. все фразы про регистры в проекции на 1С - одно писькомеринье. |
|||
226
Делать вам больше не
06.04.06
✎
11:01
|
А я вот мучаюсь с удаленной DCOM-отладкой....
И никаких GoTo... |
|||
227
NS
06.04.06
✎
11:02
|
(216) Мы говорим о культуре программирования, а не о быстродействии. Быстродействие - частный случай для некоторых задач.
Программа Хиатта - не стремится к большему быстродействию, а используется как образец теста для оценки быстродействия кода выдаваемого разными компиляторами, и как учебный пример КАК НАДО ПИСАТЬ ПРОГРАММЫ, для студентов, да и для всех остальных... И код написан ОДНИМ ИЗ ЛУЧШИХ АМЕРИКАНСКИХ ПРОГРАММИСТОВ, ПРОФЕССОРОМ ПРЕСТИЖНОГО УНИВЕРСИТЕТА, и писался и выверялся больше десяти лет... http://www.cis.uab.edu/info/faculty/hyatt/hyatt.html Это сам Хиатт... http://www.ixbt.com/cpu.shtml SPEC CPU - это тесты, в которых используется его код... |
|||
228
skunk
06.04.06
✎
11:04
|
аж страшно становится...
|
|||
229
GrayT
06.04.06
✎
11:05
|
(228)И кто тебя за язык тянул......
|
|||
230
NS
06.04.06
✎
11:06
|
(+227) После совещания могу кинуть образец кода.
вообще он есть тут. ftp://ftp.cis.uab.edu/pub/hyatt/src/ Смотреть можно, например, юнит Search.c |
|||
231
Mort
06.04.06
✎
11:07
|
Выложи код, не могу скачать.
КАК НАДО ПИСАТЬ ПРОГРАММЫ я больше доверяю Питеру Страуструбу, Гради Бучу и Джефу Элджеру. Они про goto говорят вскольз и в шутку. |
|||
232
Фокусник
06.04.06
✎
11:08
|
(218) +221 а в случае необходимости "эксренного выхода по особому условию", имхо _проще_быстрее_и_надежнее выставить метку и выскочить в нужное место... особенно если это только отладка (-:
|
|||
233
Парижская фанера
06.04.06
✎
11:09
|
(214) Хреновый код для поддержки, потенциально опасный.
|
|||
234
MMF
06.04.06
✎
11:09
|
(233+) убивать нах за такой код.
|
|||
235
NS
06.04.06
✎
11:14
|
(211) Я всегда давал оговорку, что кроме особых случаев.
Поищи в архивах. (217) Было, было... Не сомневайся. (231) Сказал же - после совещания. Либо скачай, и открой ВордПэдом.. |
|||
236
Фокусник
06.04.06
✎
11:14
|
(223) в чем потенциальность опастности?
(234) утверждение без доказательства - лишь пустой звук (похожий на пук), извини... |
|||
237
Mort
06.04.06
✎
11:18
|
(235) Я подожду. Чем открыть есть)
|
|||
238
skunk
06.04.06
✎
11:25
|
вот из-за чего спор... впринципе и начался...
код чела...
и мой
|
|||
239
Mort
06.04.06
✎
11:29
|
Я так понял это формирование 4-х цифр числа где ВыбЧисло1 - разрядность?
|
|||
240
Парижская фанера
06.04.06
✎
11:29
|
(238) Ужос.
|
|||
241
Mort
06.04.06
✎
11:30
|
(240) Согласен
|
|||
242
skunk
06.04.06
✎
11:31
|
(239)это попытка доказать мне что без гоуту не айда...
(240)что ты хочешь краисвого от кода написанного за пять минут на коленках ноутбука |
|||
243
Mort
06.04.06
✎
11:32
|
(242) В (239) я прав?
В этом случае надо не Goto применять а Йад. |
|||
244
Mort
06.04.06
✎
11:42
|
//Эта же задача:
void InsertBit(int* Arr,int Pos,int Razryad) { if Arr[Pos]+1 = Razryad then insertBit(Arr,Pos+1,Razryad); Arr[Pos]=0; else Arr[Pos]++; } main() { Arr[4]={0,0,0,0}; int Razr = 8; //- восьмиричное NeedNumber = 512; // - нужное число lj rj for(int k=0;k<NeedNumber;k++) { InsertBit(Arr,0,Razr); cout<<Arr[3]<<Arr[2]<<Arr[1]<<Arr[0]; } } |
|||
245
MMF
06.04.06
✎
11:50
|
(236) 1) Теорема Бема и Якопини : "Для всякой программы, выраженной произвольной блок-схемой, существует эквивалентная ей программа (т.е. выполняющая те же преобразования данные -> результат с помощью тех же вычислений), так что: операции над переменными те же, что и в исходной программе; сохраняются все переменные исходной программы с возможным добавлением некоторого числа логических переменных (имеющих два возможных значения); единственными используемыми структурами являются цепочка и цикл".
2) Применение структур: цепочка, цикл, альтернатива и вызов подрограммы отвечают задачам структурного программирования и дают возможность решить три основные задачи: улучшить читаемость, облегчают общение между программистами и дают возможность доказать правильность программы. 3) Война с сторонниками goto началась с Дейкстры в 1968г. И опубликовано с тех пор множество работ на эту тему (Хоар, Кнут, Ледгард и др.) 4) Оценка сложности программы выполняется по множеству метрик (Холстеда, Джилба и т.д.) и является предметом теории сложности программ. Однозначным выводом ее является крайне ограниченное применение гоуту (циклы на n+1/2 итераций). |
|||
246
NS
06.04.06
✎
11:53
|
#include <stdio.h>
#include <stdlib.h> #include <string.h> #include "chess.h" #include "data.h" /* last modified 01/22/04 */ /* ******************************************************************************* * * * Quiesce() is the recursive routine used to implement the alpha/beta * * negamax search (similar to minimax but simpler to code.) Quiesce() is * * called whenever there is no "depth" remaining so that only capture moves * * are searched deeper. * * * ******************************************************************************* */ int Quiesce(TREE * RESTRICT tree, int alpha, int beta, int wtm, int ply) { register int o_alpha, value, delta; register int *next_move; register int *goodmv, *movep, moves = 0, *sortv, temp; /* ************************************************************ * * * initialize. * * * ************************************************************ */ if (ply >= MAXPLY - 1) return (beta); tree->nodes_searched++; tree->next_time_check--; tree->last[ply] = tree->last[ply - 1]; o_alpha = alpha; /* ************************************************************ * * * now call Evaluate() to produce the "stand-pat" score * * that will be returned if no capture is acceptable. * * if this score is > alpha, then we also have to save * * the "path" to this node as it is the PV that leads * * to this score. * * * ************************************************************ */ value = Evaluate(tree, ply, wtm, alpha, beta); if (value > alpha) { if (value >= beta) return (value); alpha = value; tree->pv[ply].pathl = ply - 1; tree->pv[ply].pathh = 0; tree->pv[ply].pathd = iteration_depth; } /* ************************************************************ * * * generate captures and sort them based on (a) the value * * of the captured piece - the value of the capturing * * piece if this is > 0; or, (b) the value returned by * * Swap(). if the value of the captured piece won't * * bring the material score back up to near alpha, that * * capture is discarded as "futile." * * * ************************************************************ */ tree->last[ply] = GenerateCaptures(tree, ply, wtm, tree->last[ply - 1]); delta = alpha - largest_positional_score - (wtm ? Material : -Material); goodmv = tree->last[ply - 1]; sortv = tree->sort_value; for (movep = tree->last[ply - 1]; movep < tree->last[ply]; movep++) { if (((wtm) ? TotalBlackPieces : TotalWhitePieces) > 12) { if (p_values[Captured(*movep) + 7] + p_values[Promote(*movep) + 7] >= delta) { if (Captured(*movep) == king) return (beta); if (p_values[Piece(*movep) + 7] < p_values[Captured(*movep) + 7] || (p_values[Piece(*movep) + 7] <= p_values[Captured(*movep) + 7] && delta <= 0)) { *goodmv++ = *movep; *sortv++ = p_values[Captured(*movep) + 7]; moves++; } else { temp = Swap(tree, From(*movep), To(*movep), wtm); if (temp >= 0) { *sortv++ = temp; *goodmv++ = *movep; moves++; } } } } else { int val = ((wtm) ? TotalBlackPieces : TotalWhitePieces) * PAWN_VALUE; if (p_values[Captured(*movep) + 7] + p_values[Promote(*movep) + 7] >= delta || val - p_values[Captured(*movep) + 7] <= BISHOP_VALUE) { if (Captured(*movep) == king) return (beta); if (p_values[Piece(*movep) + 7] < p_values[Captured(*movep) + 7] || (p_values[Piece(*movep) + 7] <= p_values[Captured(*movep) + 7] && delta <= 0)) { *goodmv++ = *movep; *sortv++ = p_values[Captured(*movep) + 7]; moves++; } else { temp = Swap(tree, From(*movep), To(*movep), wtm); if (temp >= 0) { *sortv++ = temp; *goodmv++ = *movep; moves++; } } } } } /* ************************************************************ * * * don't disdain the lowly bubble sort here. the list of * * captures is always short, and experiments with other * * algorithms are always slightly slower. * * * ************************************************************ */ if (moves > 1) { register int done; register int *end = tree->last[ply - 1] + moves - 1; do { done = 1; sortv = tree->sort_value; for (movep = tree->last[ply - 1]; movep < end; movep++, sortv++) if (*sortv < *(sortv + 1)) { temp = *sortv; *sortv = *(sortv + 1); *(sortv + 1) = temp; temp = *movep; *movep = *(movep + 1); *(movep + 1) = temp; done = 0; } } while (!done); } next_move = tree->last[ply - 1]; /* ************************************************************ * * * now iterate through the move list and search the * * resulting positions. * * * ************************************************************ */ while (moves--) { tree->current_move[ply] = *(next_move++); #if defined(TRACE) if (ply <= trace_level) SearchTrace(tree, ply, 0, wtm, alpha, beta, "quiesce", CAPTURE_MOVES); #endif MakeMove(tree, ply, tree->current_move[ply], wtm); value = -Quiesce(tree, -beta, -alpha, Flip(wtm), ply + 1); UnmakeMove(tree, ply, tree->current_move[ply], wtm); if (value > alpha) { if (value >= beta) return (value); alpha = value; } if (tree->stop) return (0); } /* ************************************************************ * * * all moves have been searched. return the search * * result that was found. if the result is not the * * original alpha score, then we need to return the PV * * that is associated with this score. * * * ************************************************************ */ if (alpha != o_alpha) { memcpy(&tree->pv[ply - 1].path[ply], &tree->pv[ply].path[ply], (tree->pv[ply].pathl - ply + 1) * sizeof(int)); memcpy(&tree->pv[ply - 1].pathh, &tree->pv[ply].pathh, 3); tree->pv[ply - 1].path[ply - 1] = tree->current_move[ply - 1]; } return (alpha); } Это пример кода Хиатта - Quence.c |
|||
247
КонецЦикла
06.04.06
✎
11:55
|
оператор как оператор... ужо и не помню когда его использовал
|
|||
248
NS
06.04.06
✎
11:57
|
#include <stdio.h>
#include <stdlib.h> #include "chess.h" #include "data.h" /* last modified 03/11/98 */ /* ******************************************************************************* * * * UnmakeMove() is responsible for updating the position database whenever a * * move is retracted. it is the exact inverse of MakeMove(). * * * ******************************************************************************* */ void UnmakeMove(TREE * RESTRICT tree, int ply, int move, int wtm) { register int piece, from, to, captured, promote; BITBOARD bit_move, bit_move_rl45, bit_move_rr45, bit_move_rl90; /* ************************************************************ * * * first, take care of the hash key if there's a possible * * enpassant pawn capture. * * * ************************************************************ */ HashKey = tree->save_hash_key[ply]; PawnHashKey = tree->save_pawn_hash_key[ply]; /* ************************************************************ * * * now do the piece-specific things by calling the * * appropriate routine. * * * ************************************************************ */ piece = Piece(move); from = From(move); to = To(move); captured = Captured(move); promote = Promote(move); UnmakePieceMove: bit_move = SetMask(from) | SetMask(to); bit_move_rl45 = SetMaskRL45(from) | SetMaskRL45(to); bit_move_rr45 = SetMaskRR45(from) | SetMaskRR45(to); bit_move_rl90 = SetMaskRL90(from) | SetMaskRL90(to); ClearSet(bit_move_rl45, OccupiedRL45); ClearSet(bit_move_rr45, OccupiedRR45); ClearSet(bit_move_rl90, OccupiedRL90); PcOnSq(to) = 0; switch (piece) { /* ******************************************************************************* * * * unmake pawn moves. * * * ******************************************************************************* */ case pawn: if (wtm) { ClearSet(bit_move, WhitePawns); ClearSet(bit_move, WhitePieces); PcOnSq(from) = pawn; if (captured == 1) { if (EnPassant(ply) == to) { TotalPieces++; SetRL90(to - 8, OccupiedRL90); SetRL45(to - 8, OccupiedRL45); SetRR45(to - 8, OccupiedRR45); Set(to - 8, BlackPawns); Set(to - 8, BlackPieces); PcOnSq(to - 8) = -pawn; Material -= PAWN_VALUE; TotalBlackPawns++; captured = 0; } } /* ********************************************************************** * * * if this is a pawn promotion, remove the pawn from the counts * * then update the correct piece board to reflect the piece just * * created. * * * ********************************************************************** */ if (promote) { TotalWhitePawns++; Material += PAWN_VALUE; Clear(to, WhitePawns); Clear(to, WhitePieces); switch (promote) { case knight: Clear(to, WhiteKnights); TotalWhitePieces -= knight_v; WhiteMinors--; Material -= KNIGHT_VALUE; break; case bishop: Clear(to, WhiteBishops); Clear(to, BishopsQueens); TotalWhitePieces -= bishop_v; WhiteMinors--; Material -= BISHOP_VALUE; break; case rook: Clear(to, WhiteRooks); Clear(to, RooksQueens); TotalWhitePieces -= rook_v; WhiteMajors--; Material -= ROOK_VALUE; break; case queen: Clear(to, WhiteQueens); Clear(to, BishopsQueens); Clear(to, RooksQueens); TotalWhitePieces -= queen_v; WhiteMajors -= 2; Material -= QUEEN_VALUE; break; } } } else { ClearSet(bit_move, BlackPawns); ClearSet(bit_move, BlackPieces); PcOnSq(from) = -pawn; if (captured == 1) { if (EnPassant(ply) == to) { TotalPieces++; SetRL90(to + 8, OccupiedRL90); SetRL45(to + 8, OccupiedRL45); SetRR45(to + 8, OccupiedRR45); Set(to + 8, WhitePawns); Set(to + 8, WhitePieces); PcOnSq(to + 8) = pawn; Material += PAWN_VALUE; TotalWhitePawns++; captured = 0; } } /* ********************************************************************** * * * if this is a pawn promotion, remove the pawn from the counts * * then update the correct piece board to reflect the piece just * * created. * * * ********************************************************************** */ if (promote) { TotalBlackPawns++; Material -= PAWN_VALUE; Clear(to, BlackPawns); Clear(to, BlackPieces); switch (promote) { case knight: Clear(to, BlackKnights); TotalBlackPieces -= knight_v; BlackMinors--; Material += KNIGHT_VALUE; break; case bishop: Clear(to, BlackBishops); Clear(to, BishopsQueens); TotalBlackPieces -= bishop_v; BlackMinors--; Material += BISHOP_VALUE; break; case rook: Clear(to, BlackRooks); Clear(to, RooksQueens); TotalBlackPieces -= rook_v; BlackMajors--; Material += ROOK_VALUE; break; case queen: Clear(to, BlackQueens); Clear(to, BishopsQueens); Clear(to, RooksQueens); TotalBlackPieces -= queen_v; BlackMajors -= 2; Material += QUEEN_VALUE; break; } } } break; /* ******************************************************************************* * * * unmake knight moves. * * * ******************************************************************************* */ case knight: if (wtm) { ClearSet(bit_move, WhiteKnights); ClearSet(bit_move, WhitePieces); PcOnSq(from) = knight; } else { ClearSet(bit_move, BlackKnights); ClearSet(bit_move, BlackPieces); PcOnSq(from) = -knight; } break; /* ******************************************************************************* * * * unmake bishop moves. * * * ******************************************************************************* */ case bishop: ClearSet(bit_move, BishopsQueens); if (wtm) { ClearSet(bit_move, WhiteBishops); ClearSet(bit_move, WhitePieces); PcOnSq(from) = bishop; } else { ClearSet(bit_move, BlackBishops); ClearSet(bit_move, BlackPieces); PcOnSq(from) = -bishop; } break; /* ******************************************************************************* * * * unmake rook moves. * * * ******************************************************************************* */ case rook: ClearSet(bit_move, RooksQueens); if (wtm) { ClearSet(bit_move, WhiteRooks); ClearSet(bit_move, WhitePieces); PcOnSq(from) = rook; } else { ClearSet(bit_move, BlackRooks); ClearSet(bit_move, BlackPieces); PcOnSq(from) = -rook; } break; /* ******************************************************************************* * * * unmake queen moves. * * * ******************************************************************************* */ case queen: ClearSet(bit_move, BishopsQueens); ClearSet(bit_move, RooksQueens); if (wtm) { ClearSet(bit_move, WhiteQueens); ClearSet(bit_move, WhitePieces); PcOnSq(from) = queen; } else { ClearSet(bit_move, BlackQueens); ClearSet(bit_move, BlackPieces); PcOnSq(from) = -queen; } break; /* ******************************************************************************* * * * unmake king moves. * * * ******************************************************************************* */ case king: if (wtm) { ClearSet(bit_move, WhitePieces); PcOnSq(from) = king; WhiteKingSQ = from; if (abs(to - from) == 2) { if (to == G1) { from = H1; to = F1; piece = rook; goto UnmakePieceMove; } else { from = A1; to = D1; piece = rook; goto UnmakePieceMove; } } } else { ClearSet(bit_move, BlackPieces); PcOnSq(from) = -king; BlackKingSQ = from; if (abs(to - from) == 2) { if (to == G8) { from = H8; to = F8; piece = rook; goto UnmakePieceMove; } else { from = A8; to = D8; piece = rook; goto UnmakePieceMove; } } } break; } /* ******************************************************************************* * * * now it is time to restore a piece that was captured. * * * ******************************************************************************* */ if (captured) { TotalPieces++; SetRL90(to, OccupiedRL90); SetRL45(to, OccupiedRL45); SetRR45(to, OccupiedRR45); switch (captured) { /* ************************************************************ * * * restore a captured pawn. * * * ************************************************************ */ case pawn: if (wtm) { Set(to, BlackPawns); Set(to, BlackPieces); PcOnSq(to) = -pawn; Material -= PAWN_VALUE; TotalBlackPawns++; } else { Set(to, WhitePawns); Set(to, WhitePieces); PcOnSq(to) = pawn; Material += PAWN_VALUE; TotalWhitePawns++; } break; /* ************************************************************ * * * restore a captured knight. * * * ************************************************************ */ case knight: if (wtm) { Set(to, BlackKnights); Set(to, BlackPieces); PcOnSq(to) = -knight; TotalBlackPieces += knight_v; BlackMinors++; Material -= KNIGHT_VALUE; } else { Set(to, WhiteKnights); Set(to, WhitePieces); PcOnSq(to) = knight; TotalWhitePieces += knight_v; WhiteMinors++; Material += KNIGHT_VALUE; } break; /* ************************************************************ * * * restore a captured bishop. * * * ************************************************************ */ case bishop: Set(to, BishopsQueens); if (wtm) { Set(to, BlackBishops); Set(to, BlackPieces); PcOnSq(to) = -bishop; TotalBlackPieces += bishop_v; BlackMinors++; Material -= BISHOP_VALUE; } else { Set(to, WhiteBishops); Set(to, WhitePieces); PcOnSq(to) = bishop; TotalWhitePieces += bishop_v; WhiteMinors++; Material += BISHOP_VALUE; } break; /* ************************************************************ * * * restore a captured rook. * * * ************************************************************ */ case rook: Set(to, RooksQueens); if (wtm) { Set(to, BlackRooks); Set(to, BlackPieces); PcOnSq(to) = -rook; TotalBlackPieces += rook_v; BlackMajors++; Material -= ROOK_VALUE; } else { Set(to, WhiteRooks); Set(to, WhitePieces); PcOnSq(to) = rook; TotalWhitePieces += rook_v; WhiteMajors++; Material += ROOK_VALUE; } break; /* ************************************************************ * * * restore a captured queen. * * * ************************************************************ */ case queen: Set(to, BishopsQueens); Set(to, RooksQueens); if (wtm) { Set(to, BlackQueens); Set(to, BlackPieces); PcOnSq(to) = -queen; TotalBlackPieces += queen_v; BlackMajors += 2; Material -= QUEEN_VALUE; } else { Set(to, WhiteQueens); Set(to, WhitePieces); PcOnSq(to) = queen; TotalWhitePieces += queen_v; WhiteMajors += 2; Material += QUEEN_VALUE; } break; /* ************************************************************ * * * restore a captured king. [this is an error condition] * * * ************************************************************ */ case king: Print(128, "captured a king\n"); Print(128, "piece=%d,from=%d,to=%d,captured=%d\n", piece, from, to, captured); Print(128, "ply=%d\n", ply); if (log_file) DisplayChessBoard(log_file, tree->pos); } } #if defined(DEBUG) ValidatePosition(tree, ply, move, "UnmakeMove(1)"); #endif return; } А это unmake.c Пример c goto... |
|||
249
NS
06.04.06
✎
11:59
|
Чтоб было покороче -
/* ******************************************************************************* * * * unmake king moves. * * * ******************************************************************************* */ case king: if (wtm) { ClearSet(bit_move, WhitePieces); PcOnSq(from) = king; WhiteKingSQ = from; if (abs(to - from) == 2) { if (to == G1) { from = H1; to = F1; piece = rook; goto UnmakePieceMove; } else { from = A1; to = D1; piece = rook; goto UnmakePieceMove; } } } else { ClearSet(bit_move, BlackPieces); PcOnSq(from) = -king; BlackKingSQ = from; if (abs(to - from) == 2) { if (to == G8) { from = H8; to = F8; piece = rook; goto UnmakePieceMove; } else { from = A8; to = D8; piece = rook; goto UnmakePieceMove; } } } break; } |
|||
250
dimoff
06.04.06
✎
12:08
|
Хороший оператор GoTo, полезный
|
|||
251
GrayT
06.04.06
✎
12:12
|
(250)IAm???
|
|||
252
Mort
06.04.06
✎
12:16
|
(249) Такое количество операторов case и переходов goto, что хрен проймешь где что начинается и заканчивается. Количество переменных ужос. Автор про автоматы интересно слышал когда - нибудь... Быть может он и занимается программированием много лет и начинал с карт программить, но брать за пример ЭТО...
(251) Absolute |
|||
253
SynchroFaza Tron
06.04.06
✎
12:19
|
(NS) А чего ты постоянно так упорно свою точку зрения остальным пытаешься навязать со здоровыми (в смысле большими) примерами? У тебя что, писькомер гипертрофированный?
|
|||
254
NS
06.04.06
✎
12:45
|
(252) Каков ваш опыт в программировании, чтоб судить об этом тексте? Этот текст считается один из лучших в мире...
(253) Ежели нет меньше примеров - почему бы не дать этот? Причем тут писькомер? Это не мой пример, а пример мирового столпа программирования, Профессора, доктора наук. Признанный образец кода, включенный во все крупнейшие тесты компиляторов. (На этом коде эффективность компиляторов проверяют - неужели интел будет проверять эффективность своего компилятора на плохом коде?????) |
|||
255
NS
06.04.06
✎
12:54
|
а насчет неприменения goto вообще - извините, но это просто юношеский максимализм, и отсутствие должного опыта.
|
|||
256
skunk
06.04.06
✎
13:00
|
(252)кому надо применять яд
|
|||
257
MMF
06.04.06
✎
13:01
|
(255) только что сделал поиск по крупнейшему опен-сорсному проекту Jedi. в 1 140 000 строк кода нашлось аж 18 гоуту.
|
|||
258
Mort
06.04.06
✎
13:01
|
(254)
1. Назови компилятор от интел. 2. Кем считается. 3. Насчет профессора - старую собаку не научишь новым фокусам. 4. Это тест компилятора? Здесь операции школьного уровня, где модификаторы const, операции выделения памяти и её освобождения, области видимости переменных и математика указателей, где? |
|||
259
NS
06.04.06
✎
13:02
|
(257) В крафти примерно столько-же кода - goto встречается примерно столько же раз.
|
|||
260
Mort
06.04.06
✎
13:03
|
(257) (259) Опенсорсные проекты ещё не говорят что там сплошь профи участвуют.
|
|||
261
skunk
06.04.06
✎
13:04
|
и скорее всего те куски кода были написаны когда люди не знали что есть процедурное программирование
|
|||
262
NS
06.04.06
✎
13:06
|
(260) Crafty - говорит. Я выше привел аргументы.
|
|||
263
Беглый Чебурашка
06.04.06
✎
13:08
|
Использовал только один раз, что бы сразу выйти из нескольких циклов.
|
|||
264
MMF
06.04.06
✎
13:09
|
(259) че то твой проффффесор не поддерживает процент 1/100 000 строк, с которым ты согласился.
|
|||
265
Mort
06.04.06
✎
13:11
|
(264) Это такой жесткий тест для компиляторов (от интел) поперхнется комп гоутами али нет.
|
|||
266
NS
06.04.06
✎
13:12
|
(264) Я могу еще раз повториться. Goto нужен достаточно редко, но он иногда нужен, и повышает как быстродействие, так и читаемость кода.
То что самолеты падают достаточно редко - не значит, что они не падают. |
|||
267
skunk
06.04.06
✎
13:12
|
а я думал для чего нужен гоуту... оказывается компиляторы тестить
|
|||
268
NS
06.04.06
✎
13:13
|
(265) Не поперхнется... Если ты немного подучишься, то узнаешь, что все циклы, условия и т.д. компилируются в goto (jmp и т.д.) Так что с компом всё будет ОК.
|
|||
269
skunk
06.04.06
✎
13:15
|
не знал что проц понимает процедуры... хотя вру... call... (((
|
|||
270
MMF
06.04.06
✎
13:16
|
(267) вообще-то это проблема для компилятора: что делать с переменными -итераторами циклов, если выход из цикла осуществляется по гоуту. Нормальный стиль программирования предполагает, что переменная цикла используется только для управления циклом и в его теле, при выходе из цикла она должна уничтожаться.
|
|||
271
Mort
06.04.06
✎
13:16
|
(268) LOL. Ты серьёзно воспринял?
|
|||
272
skunk
06.04.06
✎
13:18
|
(270)не все компляторы ... думаю что большинство... отработают правильно выход из цикла по гоуто...
|
|||
273
NS
06.04.06
✎
13:20
|
(269) Чтоб избежать call, и хранения параметров процедуры и адреса точки вызова в стеке и памяти - используются оптимизирующие компиляторы и, например, директива inline в делфях после определения процедуры...
Из под нормального компилятора текст выходит почти без call, а с кучей переходов... |
|||
274
NS
06.04.06
✎
13:21
|
(272) Конечно правильно отработают, а переменная опеределенная в цикле - скорей всего вообще попадет в регистр... С очень большой вероятностью.
|
|||
275
skunk
06.04.06
✎
13:26
|
цикл для работы имеет стэк... в него push заносятся данные необходимые для работы цикла... break and goto перепрыгивая конец цикла... не закрывают этот стэк pop... хотя может быть сейчас в мире компилятор чего-то изменилось
|
|||
276
Neco
06.04.06
✎
13:28
|
Но все таки интересен вопрос: "В каких случая необходимо использовать оператор Перейти (Goto)"
Если не касатся 1С, то для написания циклов и переходов в bat файДОС (Windows) |
|||
277
GrayT
06.04.06
✎
13:28
|
(275)Цикл имеет стэк???
|
|||
278
SynchroFaza Tron
06.04.06
✎
13:28
|
(NS) (255) - смотри (174), если я молод это не дает тебе права делать подобные высказывания.
|
|||
279
skunk
06.04.06
✎
13:30
|
(277)напиши простой код... компильни и посмотри...
|
|||
280
MMF
06.04.06
✎
13:32
|
(276) Гоуту используется для замены Альфовского КЗК - как увидит потенциальный вор интеллектуальной собственности мешанину из Перейти-Метка - сразу оставит эту затею.
|
|||
281
skunk
06.04.06
✎
13:33
|
(280)думаю вору пофих
|
|||
282
GrayT
06.04.06
✎
13:34
|
(279)Для меня это будет слишком долго :)
Тут NS писал что типа цикл это те-же джампы и проверка условий. И со студенческих времен Паскаль 1 под ОСРВ это так и выглядело. Зачем там стэк? |
|||
283
skunk
06.04.06
✎
13:37
|
на том уровне есть всего 16 регистров ... и не все они доступны для модификации... поэтому для организации цикла регистры пушат и попят
|
|||
284
skunk
06.04.06
✎
13:37
|
а без регистров на том уровне... нету условных переходов... а без них циклов
|
|||
285
GrayT
06.04.06
✎
13:38
|
(283)А-а-а-а. Скорее всего ты прав.
|
|||
286
Mort
06.04.06
✎
13:39
|
И вообще причем тут джампы и регистры, речь идет о GOTO, которого Струструб скрипя зубами оставил в с++ чтобы оставить совместимость прог и привычки старых пердунов типа профессора с его шахматным тестом для компилеров интел.
|
|||
287
GrayT
06.04.06
✎
13:41
|
(286)Все же можно предположить что Вам не больше 25.....
|
|||
288
skunk
06.04.06
✎
13:41
|
(285) ну все таки не зря же я в школу ходил... хотя бы и три класса...
(286)ЛОЛ ... ремембер |
|||
289
Neco
06.04.06
✎
13:42
|
Интересно чем объяснить такой код из УПП:
// Если группировка не выводится, переходим к выбору следующей (кроме иерархии) Если СтруктураПараметров.СтруктураПропускаемыеГруппировки.Свойство(Выборка.Группировка()) И Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда Перейти ~M1; КонецЕсли; //... // что-то делаем (всего 20 строчек) //... ~M1:Если Индекс < ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Тогда можно ведь написать и так: Если Не(СтруктураПараметров.СтруктураПропускаемыеГруппировки.Свойство(Выборка.Группировка()) И Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке) Тогда //... // что-то делаем (всего 20 строчек) //... КонецЕсли; Если Индекс < ПостроительОтчета.ИзмеренияСтроки.Количество()-1 Тогда |
|||
290
GrayT
06.04.06
✎
13:44
|
(289)Автора консультировал NS? ;))
|
|||
291
Neco
06.04.06
✎
13:45
|
(290) Просто интересен ход мысли, даже и логики не вижу в таком коде. И в УПП таких выкрутасов полно
|
|||
292
skunk
06.04.06
✎
13:45
|
+290 либо старый профессор
|
|||
293
Mort
06.04.06
✎
13:47
|
Писал этот код товарисч который простенькую блок схему не могет в уме накидать. Отсюда можно вынести вердикт: оператор GOTO компенсирует недостаток серой массы. Ну не хватило автору несколько мегабайт ОЗУ ход течения проги представить...
|
|||
294
MMF
06.04.06
✎
13:48
|
(290+) в первую очередь это значит, что такой монстр, как УПП, разрабатывается как попало пианэрами.
|
|||
295
dimoff
06.04.06
✎
13:48
|
(251) Yes, why so amazing?
|
|||
296
NS
06.04.06
✎
13:49
|
(282) Сделав переход по флагу (а только так заменяется goto циклом) - ты заводишь еще одну переменную - а на неё может не хватить регистров - и соответственно используется память (обращение к памяти), разрулив goto использованием функции/процедуры - ты можешь получить стек - то же обращение к памяти...
И плюс - просто на переход тратиться одна процессорная операция перехода, при эмуляции флагом - несколько, и не один компилятор это не разрулит. (286) Старый пердун не настолько и стар. А всем ведущим разработчикам ПО, в том числе и шахматным - по 50 лет... Опыт очень важная штука в программировании. И если ты не заметил - то его текст очень читабелен, и очень хорош. А текст иго используется при тестирование ЛЮБЫХ компиляторов с/с++, и его программа кроме образца - участвует в чемпионатах мира и является образцом для всех шахматных программистов... А его КрейБлиц - просто легенда американского программирования для суперкомпов, и многократная чемпионка мира. |
|||
297
GrayT
06.04.06
✎
13:50
|
(295)Очень редкий гость.
|
|||
298
Mort
06.04.06
✎
13:51
|
Текст оцтой. Щас разберем.
|
|||
299
NS
06.04.06
✎
13:53
|
(298) Я просто уверен, что ты пишешь намного лучше, и заработал уже не один миллиард на своих творениях.
|
|||
300
dk
06.04.06
✎
13:55
|
Тут придумал как использовать для отладки:
Перейти МояМетка1; Оператор1; Оператор2; Оператор3; Оператор4; ~МояМетка1: ОператорКоторыйХочуИзменить; Возврат; Оператор6; Оператор7; --------- Т.е. если модуль довольно большой и отключать Операторы1, .. Операторы4 проблематично, то можно воспользоваться переходом, но это только для отладки ЗЫ Всю ветку не читал |
|||
301
NS
06.04.06
✎
13:56
|
(+296) Плюс он является явным мировым лидером в алгоритмизации и реализации параллельных вычислений.
|
|||
302
Neco
06.04.06
✎
13:58
|
(301) Это как параллельные вычисление? На примере пожалуйста
|
|||
303
Mort
06.04.06
✎
13:59
|
(299) Ещё я знаю больше по физике чем Ньютон и по геометрии чем Евклид. Каждому своё время. Может быть приведенный код выжал максимум из скорости выполнения но для теста компилеров и как стиль программирования в сегодняшних реалиях никуда не годен.
|
|||
304
Mort
06.04.06
✎
14:00
|
(301) Алгоритмизации? Интересно в каких ИТ-сферах сейчас доминирует алгоритмизация..
|
|||
305
NS
06.04.06
✎
14:00
|
(302) Пример? Про многоядерные и многопроцессорные системы слышал? Софт, который для них разрабатывается есно не линейный, а использует все ядра/процессоры (параллельные процессы).
|
|||
306
MMF
06.04.06
✎
14:01
|
(299) быстродействие программы - противоположность ее простоты и понятности, экономия миллисекунд машинного времени оборачивается растратой часов рабочего времени программиста. В шахматах или расчетах погоды - оправданы всякие трюки, в 1С их наличие - это признак отсутствия контроля кода и плаката "вазелин еще нужно заслужить" у начальника отдела разработки
|
|||
307
GrayT
06.04.06
✎
14:04
|
(305)ОФФ: Прапорщик Задов как то ссылочку давал на 96 процессорный комп. Класная штука наверное если на всю мощь, да под 1С :))))
|
|||
308
NS
06.04.06
✎
14:05
|
(303) Ты наверно не понял - SPEC CPU это не старый продукт ;-)))))
CRAFTY - то что я привел куски текста... Вроде там дата стоит в комментариях. Параллельные алгоритмы - Это вроде сейчас, и ими он занимается СЕЙЧАС!!!! Крейблиц... Это было не так давно. И намного позже появления си, и разработки методов и постулатов ООП и процедурного программирования... Более того - могу тебя уверть, что Хиатт - это всё та-же школа, которой тыкают ярые противники goto, причем её современный вариант. (304) Это наверно тема отдельной ветки, не имеющая вообще никакого отношения к данной? Без Алгоритмизации вообще не может быть ни одного алгоритма, и ни одной программы. Используется она во всех ИТ-сферах. |
|||
309
NS
06.04.06
✎
14:06
|
(306) Еще раз - в данном случае гото используется не для повышения быстродействия, а для улучшения читабельности кода.
|
|||
310
Колумбарий
06.04.06
✎
14:09
|
2(309) С кем ты споришь? С мерином, который гордится качеством своих шор?
|
|||
311
GrayT
06.04.06
✎
14:10
|
(310)В мемориз!
|
|||
312
skunk
06.04.06
✎
14:10
|
что такое шор?
|
|||
313
NS
06.04.06
✎
14:11
|
(312) Шоры - заслонки.
|
|||
314
NS
06.04.06
✎
14:12
|
Хм...
Шоры Шоры Брокгауз и Ефрон Шоры, наглазники для упряжных лошадей, мешающие им смотреть по сторонам и уменьшающие их пугливость… ШОРЫ Даль ШОРЫ ШОРЫ ж. мн. упряжь конская без хомута или оголовка, немецкая упряжь, со шлеей, с лямкой. Шорная или немецкая упряжь. Шорник, кто вообще работает ременную упряжь, конскую упряжную сбрую. || Шоры… |
|||
315
skunk
06.04.06
✎
14:12
|
(313)это по каковский?
|
|||
316
NS
06.04.06
✎
14:13
|
(315) Вроде по русски.
|
|||
317
skunk
06.04.06
✎
14:14
|
(316)я не русский... по эту не знал
|
|||
318
GrayT
06.04.06
✎
14:14
|
(315)Не так сильно устаревшее. Ни когда на лошадках не видел - глазки им прикрывали, чтоб не ушли куда или не боялись чего.
|
|||
319
Mort
06.04.06
✎
14:15
|
Она разработана с использованием уникальной методологии вращения растровых изображений, и применение технологии AMD64 позволило существенно повысить производительность шахматного движка, — говорит Роберт Хайатт (Robert Hyatt), адъюнкт-профессор Университета штата Алабама (г. Бирмингем), автор Crafty. — Система с процессором AMD Athlon 64 FX — самая быстрая из всех, которые мне довелось видеть. Уверен, что ничего другого покупать не следует».
Последнее предложение РУЛЕЗ. |
|||
320
skunk
06.04.06
✎
14:18
|
(318)я то лошадей на картинках только видал
|
|||
321
NS
06.04.06
✎
14:18
|
(319) Ты знаешь Одноядерную систему, которая быстрее?
|
|||
322
GrayT
06.04.06
✎
14:19
|
(320)Дикий.... или наоборот :) (сорри за ОФФ)
|
|||
323
skunk
06.04.06
✎
14:20
|
(322) я тебя честно обманываю... видал из далека... правда Ренатка как то кон на лошади каталась... но ни каких шор я не на лошади не наблюдал... возможно просто не обратил внимание
|
|||
324
Колумбарий
06.04.06
✎
14:21
|
2(317) я тоже.
|
|||
325
Mort
06.04.06
✎
14:22
|
А про алгоритмизацию - принципы ООП и RUP системы превратили алгоритмирование (в буквальном смысле) как таковое в удел конечных программистов - и применяется в описании конечных методов - там единственное место куда можно впихнуть оператор GOTO и то если если алгоритм кривой.
|
|||
326
skunk
06.04.06
✎
14:22
|
(324)тебе везет... такие слова знаешь
|
|||
327
Mort
06.04.06
✎
14:24
|
Интересно Rational Rose генерит операторы GOTO... )))
|
|||
328
NS
06.04.06
✎
14:25
|
(325) Блок-схемы слышал? Там одни goto - условные и безусловные ПЕРЕХОДЫ.
|
|||
329
Mort
06.04.06
✎
14:26
|
Слышал?.. Да я уже про них забыл. А ты слышал про UML ?
|
|||
330
GrayT
06.04.06
✎
14:27
|
"Да я уже про них забыл" - фи.
|
|||
331
skunk
06.04.06
✎
14:28
|
(330)почему
|
|||
332
GrayT
06.04.06
✎
14:30
|
Имхо, если разрабатываешь хороший алгоритм без блок-схем не обойтись.
|
|||
333
skunk
06.04.06
✎
14:32
|
(332)значит у меня всегда плохие алгоритмы... правильно, что ушел на пенсию
|
|||
334
Mort
06.04.06
✎
14:34
|
Иногда метод довольно сложный и приходится порисовать, но при грамотном построении модели проекта такие случаи очень редки.
|
|||
335
GrayT
06.04.06
✎
14:34
|
Не растраивайся... Под хорошим я понимал, ну как бы сказать по русски - хитровывернутый. Опять же повторюсь - это имхо. Возможно просто старая школа. Как говаривал мой учитель - программы пишуться за столом, а не за компьютером.
|
|||
336
GrayT
06.04.06
✎
14:35
|
(334)во-во "при грамотном построении модели" а ее часто именно блок-схемами и отображают. Ну падумаешь законы немного другие...... EDF
|
|||
337
omega_juice
06.04.06
✎
14:37
|
хороший алгоритм - не меньше 22 см.
|
|||
338
skunk
06.04.06
✎
14:37
|
(335)я их долго обдумываю... иногда стреляю... на пробу... так сказать прицеливаюсь... как попаду... начинаю искать место где можно изебнутся... в итоге получается судя по всему гуано
|
|||
339
skunk
06.04.06
✎
14:38
|
(337)у меня хвост 44
|
|||
340
Mort
06.04.06
✎
14:47
|
(336) Гм, ну тетрис блок-схемами можно изобразить... Модель имелась ввиду ООП. Даже не ООП а объектная. Такие применяются даже к построению реляционных БД.
|
|||
341
GrayT
06.04.06
✎
14:49
|
(340)Ну и модель БД так же удобнее в графическом виде представлять. Опять же, я не настаиваю.
|
|||
342
Колумбарий
06.04.06
✎
14:49
|
2(340) Например модуль списания по ФИФО - он больше алгоритмический или объектный?
|
|||
343
skunk
06.04.06
✎
14:51
|
как события отображать на схемах... блок схемы это от линейности
|
|||
344
GrayT
06.04.06
✎
14:54
|
(343)С событиями сложнее. Надо было как то сильно изменить чужую программу на дельфе, а в ней активно использовались пользовательские события. Пока не прорисовал на бумаге понять не смог. Но ведь как то изобразил :)
|
|||
345
skunk
06.04.06
✎
14:55
|
(344)рисунок в студию
|
|||
346
Колумбарий
06.04.06
✎
14:57
|
2(343) События - тот же кейс. Все равно в коде присутсвует атомарность, пока один атом не выполнится, другой не сможет перехватить контроль.
Выполнился атом - выполняется кейс, который анализирует, случилось событие или нет. Не случилось - управление следующему атому. |
|||
347
skunk
06.04.06
✎
14:58
|
(346)а вот как изобразить то что один объект не фиха не делает пока у другого что-то
|
|||
348
Mort
06.04.06
✎
14:58
|
(342) Метод списания. Объект документ обращается к объекту РегистрМенеджер с запросом на добавление записей. А реализация метода естественно может быть отражена алгоритмом. Не содержащим GOTO.
|
|||
349
Mort
06.04.06
✎
14:59
|
(347) Когда у другого что-то заканчивается, он сообщает об этом 1-му объекту.
|
|||
350
Колумбарий
06.04.06
✎
15:01
|
2(348) Да, а может быть отображена алгоритмом, содержащим ГОУТУ. И быть более читабельным, чем такой же, несодержащий. Примеры выше НС привел.
|
|||
351
GrayT
06.04.06
✎
15:01
|
(345)Во-первых, давно утерян, во-вторух это был не один лист, в 3- согласен с 346
(347, 349) Ну да описать блок-схемой механизм взаимодействия тригеров будет достаточно проблематично. |
|||
352
Колумбарий
06.04.06
✎
15:01
|
2(347) Блок схемы изображают не объекты, а алгоритмы, то есть действия, атомы кода.
|
|||
353
skunk
06.04.06
✎
15:03
|
(349)это все понятно... как отобразить это на блок схеме
|
|||
354
NS
06.04.06
✎
15:03
|
На блок схеме можно отобразить и обект, точнее событие, и точку входа по этому событию.
|
|||
355
Mort
06.04.06
✎
15:04
|
Например не помню когда мне приходилось вылезать ни с того ни с сего из двойного цикла в тот же модуль. Обычно нужно останавливать вложенный цикл когда производится поиск. Но у меня всегда нечто это ищет и это возвращает, а потому из центра цикла спокойно return.
(353) На диаграмме последовательностей, или диаграмме видов деятельности. А блок схемы здесь не катят. |
|||
356
Колумбарий
06.04.06
✎
15:06
|
2(355) То что ты сейчас - абсолютизировал свой опыт. Это не значит, что множество других люжей не сталкиваются с задачами, в которых это может быть применено.
|
|||
357
Колумбарий
06.04.06
✎
15:09
|
И потом, про читабельность нечитабельность - это во многом оценочный, то есть качественный показатель. Например то, что показал сканк, приведя код, набранный латиницей для большинства 1Сников более нечитабельный, чем написанный по-русски, но с оператором Перейти.
|
|||
358
Mort
06.04.06
✎
15:12
|
(356) Это не способ решения выхода из циклов, это само выходит когда каждый объект имеет свою реальную роль.
Например нарисовать на схеме узлы соответствующие параметру: Можно Scheme->Draw(Parametr); - криво в понятийном смысле а можно Scheme->find(Parameter)->Draw(); - всё четко И так у меня всегда получается, а если проект вынуждает меня писать огромный модуль (>5 скринов) или goto(), то надо сразу искать ошибку в проектировании/ |
|||
359
Колумбарий
06.04.06
✎
15:16
|
2(358) У меня тоже, но еще не значит, что я побывал во всех ситуациях. Например, если бы у меня был выбор - применить Гоуту или поставить руководству проекта ультиматум - или вы исправляете ошибку в проектировании или я увольняюсь, я бы наверное применил Гоуту...
|
|||
360
Mort
06.04.06
✎
15:21
|
Предложение конечного программиста по аспектам проектирования (а оно длится до 80% всего времени разработки) всегда верно и важно пока не опровергнуто. Где то слышал или читал такую хорошую фразу. Но если проект кривой то здесь ничего не поделаешь - остаётся ожидать новых сюрпирозов.
|
|||
361
LarsVVS
06.04.06
✎
15:33
|
Самим goto не пользуюсь - просто не возникает ситуаций (видимо стиль программирования такой). А вот break и continue - регулярно.
|
|||
362
NS
06.04.06
✎
15:55
|
361 Продолжить - гото неудобно заменять, а прервать - абсолютно равносилен гото.
Ежели есть комментарий - то читается одинаково. Если нет - то goto информативней... Всё-таки у метки есть название... |
|||
363
Mort
06.04.06
✎
16:07
|
Зачем нужен коммент к break ???? Итак ясно что выход из цикла. А вот goto неясно куда ведет, особенно если тело цикла большое.
|
|||
364
NS
06.04.06
✎
16:16
|
(363)
goto Опровергли; // обработка превышения по Бетте, выходим из цикла. Вроде всё понятно... |
|||
365
NS
06.04.06
✎
16:24
|
И еще никто не переписал в ветке (175)
Тот же пример с переходом и в 248/249. |
|||
366
Каанкереде
06.04.06
✎
16:24
|
(362) несогласен. прервать и продолжить более читаемы и понятны. А метка, хоть и есть у нее название, но сразу не понятно где ее искать, то ли она выше, то ли ниже, насколько она дальше от текущего места...
|
|||
367
NS
06.04.06
✎
16:28
|
(366) Ты хоть раз писал на нормальном языке? Метка ищется моментально.
Продолжить??? Можешь переписать (175) через продолжить? |
|||
368
Mort
06.04.06
✎
16:38
|
В ветке 175 ты не написал операторов а задал жесткую структуру и делайте как хотите.
Дай определенную задачу с goto и я сделаю это лучше. |
|||
369
Mort
06.04.06
✎
16:39
|
Ты странно рассматриваешь программу как набор строчек (с)
|
|||
370
Mort
06.04.06
✎
16:41
|
OFF: при определенной ширине окна браузера совет "Обсуждение правил форума и действий модераторов допускается только приватно (ICQ, e-mail). (правило 8)"
разбивается и во второй остаётся смайл "8)" |
|||
371
syktyk
06.04.06
✎
16:43
|
А есть еще структурнуй goto-специально для структурного программирования был сделан. Есть вычисляемый goto...
|
|||
372
Vozhd
06.04.06
✎
16:44
|
(368) Я писал на нормальных языках. Там вообще нет goto, да и порядок выполнения операторов не всегда можно предсказать.
Вообще, читаю эту ветку, не покидает меня ощущение, что люди обсуждают какие-то "серебренные пули" для решения исскуственно надуманных проблем. Зачем это надо? |
|||
373
NS
06.04.06
✎
16:46
|
(371) Case, причем имеет намного более широкий спектр применения.
И в случае целочисленного аргумента - на нормальных компиляторах очень здорово повышает быстродействие... (Адрес вызова вычисляется) |
|||
374
Mort
06.04.06
✎
16:47
|
(372) Prolog ?
|
|||
375
Каанкереде
06.04.06
✎
16:51
|
(368) это я ему еще в (185) посту говорил.......
|
|||
376
syktyk
06.04.06
✎
16:52
|
Гото широко используется в языках предназначенных для массовых вычислений, в Фортране и пр.
|
|||
377
Mort
06.04.06
✎
16:58
|
С таким калечным синтаксисом как у фортрана я удивляюсь что он там не основной оператор.
|
|||
378
NS
06.04.06
✎
16:59
|
Я такого оголтелого дагматизма еще не видел...
Даже в случаях, когда можно обойтись без goto - if Not(условие) then оператор Endif Есно на порядок читабельней if (условие) goto Endif; оператор; :EndIf ;-))) Или Для условие цикл ... прервать; ... Конеццикла; Конечно читабельней Для условие цикл .... goto прервать; КонецЦикла; :Прервать .... |
|||
379
NS
06.04.06
✎
17:00
|
догматизма.
|
|||
380
Mort
06.04.06
✎
17:00
|
Блин ты задачу дай, там мож и без циклов обойдется.
|
|||
381
Участнег
06.04.06
✎
17:01
|
За использование ГоуТу руки отрывали ещё в школе.
|
|||
382
NS
06.04.06
✎
17:02
|
(380) А зачем обходится БЕЗ???
Ты мне можешь объяснить???? Чем тебе Готу помешало, ежели не портит читабельности? |
|||
383
Vozhd
06.04.06
✎
17:03
|
(374) Ну что Вы... Я говорю об языках общего назначений, а не о специализированных...
|
|||
384
Каанкереде
06.04.06
✎
17:03
|
(378) вот у кого догматизм, так это у тебя....
ВЕЛИКИЙ ДОКА писал с готу, значит готу форева! |
|||
385
NS
06.04.06
✎
17:05
|
(384) Я вроде не так сказал..
Я сказал, что Goto можно иногда употреблять, причем не просто можно, но даже иногда и целесообразно - ежели это не портит читабельность кода. Кстати, ежели интересно - последние несколько лет необходимости в Готу у меня не было, поэтому сам я не использовал. |
|||
386
syktyk
06.04.06
✎
17:06
|
(377)С чего это он калечный? Нормальный язык для расчетов... Хвостовой рекурсии там конечно нет, но как ФормулаТранслятор - он вполне. Кстати для некоторых реализации можно было забацать и рекурсию :)
|
|||
387
Каанкереде
06.04.06
✎
17:09
|
(385) да ты просто его так отстаиваешь, что кажешься фанатиком.. или просто поспорить с народом охота.
Про то что готу вообще нельзя пользоваться никто по моему и не говорил... К готу всегда относился как к чему то, что происходит от безысходности. Ну вот не получается никак "гладкий" алгоритм сделать, быц и прыгнул через два скрина. |
|||
388
Vozhd
06.04.06
✎
17:13
|
(387) Чего только не придумают, лишь бы не исправлять ошибки в проекте... :-)
|
|||
389
NS
06.04.06
✎
17:13
|
(387) Посмори мои первые посты - (167,170,175)
Речь шла о том - что глупо считать признаком плохого стиля, когда в коде хоть иногда, но встречается goto... А речь до меня шла о том, что даже один goto в проекте - это ЧП. |
|||
390
NS
06.04.06
✎
17:16
|
А из того, что я видел в этой ветки до моих постов выходит - что Хиатт получил бы банан по программированию в школе... ;-)
|
|||
391
Каанкереде
06.04.06
✎
17:20
|
(390) в школе однозначно получил бы. Ибо препод заведомо дает алгоритмы, в которых goto будет явным мусором....
|
|||
392
NS
06.04.06
✎
17:21
|
(391) Ничего подобного. Это может у вас в школе...
|
|||
393
Каанкереде
06.04.06
✎
17:25
|
(392) нет ты сам подумай. На уроке препод говорит, что goto используется только в самых крайних случаях и применять его следует как можно реже... Дает задание, которое он сам делал 15 лет назад, и каждый год выполняют сотни учеников...А на следующий день, ученик приносит домашнее задание с 5 goto в коде.... Что должен сделат ьпрепод?
|
|||
394
NS
06.04.06
✎
17:28
|
(393) Ты хоть читал ветку?
Из ветки следует - что препод говорит что в язык goto добавлен по ошибке - его использовать никогда нельзя, и когда на олимпиаде ты решаешь задачу с использованием goto - тебе говорят "до свидания", тебе же говорили, что метод в язык был добавлен только для "старых пердунов" привыкших к линейному программированию... |
|||
395
zzzzz
06.04.06
✎
17:29
|
(393) Препод асембелр преподает?
|
|||
396
zzzzz
06.04.06
✎
17:33
|
Прежде чем говорить о чем-то, советую оговориться в терминах.
И в языках. Ну не верю я, что драйвера без джампа внутри сидят. (Это противникам гото) Ну не верю я, что прога с гото будет быстрее, чем без гото (по поводу восмерки) |
|||
397
syktyk
06.04.06
✎
17:37
|
(396)Согласен... На 50% :) В драйвере можно скипы ставить, гламурнее выглядит.
|
|||
398
Каанкереде
06.04.06
✎
17:41
|
(394) именно так... а что они должны сказать если вдолбливали человеку в голову, вдалбливали. Дали ему задачу, которую они отлично знают, что ее можно решить именно так как они вдалбливали. А ученик приходит и делает именно так, как его учили НЕДЕЛАТЬ. Нобелевскую премию ему давать?
|
|||
399
kazam
06.04.06
✎
17:42
|
код написаный с goto проще переписать с нуля чем модифицировать
З.Ы, Даёшь 400 сообщений!!... |
|||
400
zzzzz
06.04.06
✎
17:42
|
400
|
|||
401
NS
06.04.06
✎
17:47
|
(396) Будет. Если у тебя многочисленные выходы из циклов вниз, и все в одно место. И не работаешь с БД, а данные уже собраны.
(398) Это не было оговорено. Можно так-же сказать, что у нас, в ЛГУ кое-кто ставил пару за вот такой код обмена двух переменных значениями: Темп:=a; a:=б; б:=Темп; И ставил двойку, ежели программу расположение цифр от 1 до п^2 по спирали в массиве п х п писали не одним оператором... ничего при этом не оговаривая... А уровень преподования программирования в школах я знаю... Сталкивался. |
|||
402
kazam
06.04.06
✎
17:54
|
(401) а как можно сделать обмен без временной пер-ной??
в чём тут прикол? |
|||
403
NS
06.04.06
✎
17:58
|
(402) Как? Ты в своей программе будешь использовать лишнюю память для дополнительной переменной? Ты хоть в курсе, что память компьтера ограничена?
Мне плевать на то, что ты олимпиадник, и знаешь как это сделать без помощи вспомогательной переменной. Зачет будешь сдавать в сессию!!! Вместо подготовки к экзаменам!!! А вот там - получишь вторую задачу, и сам будешь догадываться, что я имелла в виду, что "нормальные прогрпаммисты" пытаются как можно больше всего впихнуть в один оператор без использования операторных скобок. А саму задачу будешь получать устно. И при этом поймешь, как тяжело живется человеку, который из всего алфавита в состоянии выговорить внятно только две буквы, одна из них некий аналог согласной, а другая - гласной. |
|||
404
Каанкереде
06.04.06
✎
18:00
|
(403)...это называется психологическая травма полученая в детско-юношеском возрасте....
|
|||
405
kazam
06.04.06
✎
18:04
|
да, буду! Программа ж моя, что хочу то и делаю.
Использую - освобождаю, опять использую. я долго читал, думая как не лень писать столько охинеи,- но здесь стало ясно: "имелла" |
|||
406
Колумбарий
06.04.06
✎
18:18
|
2(404, 405) Это прием, которым он довел до абсурда вашу позицию.
На самом деле он хотел сказать, что a:=a+b; b:=a-b; Но если требовать писать только так, то вы сразу пошлете требующего в пешее эротическое путешествие, что в 405 и доказано. |
|||
407
Колумбарий
06.04.06
✎
18:21
|
+(406) Можно сказать метод Рупора применил. Если доказать вам что использовать Гоуту можно не получается, значит нужно доказать, что нельзя менять значения переменных путем введения дополнительной переменной. Как только вы осознаете абсурдность этого запрета, то поймете, что запрет использования Гоуту не менее абсурден
|
|||
408
Vozhd
06.04.06
✎
19:49
|
(401) Пишите на нормальных языках и никаких проблем не будет
a,b = b,a |
|||
409
kazam
07.04.06
✎
09:54
|
(406) действительно хороший способ. Нужно отключить overflow control
|
|||
410
Vozhd
07.04.06
✎
09:59
|
(409) Угу. Безумно хороший, особенно, если в переменных находятся строки...
|
|||
411
kazam
07.04.06
✎
10:01
|
(410) строки обмениваются с помощью указателей.
а это уже: (406)a:=a+b; b:=a-b; Так что точно - "безумно хороший" |
|||
412
Vozhd
07.04.06
✎
10:03
|
(411) Указателей? А если адресация памяти не плоская?
|
|||
413
kazam
07.04.06
✎
10:08
|
(412) адрессация мещает сделать обмен переменных адреса (указателей)?
Зачем делать memcpy(), strcpy() ? |
|||
414
Vozhd
07.04.06
✎
10:14
|
(413) При не плоской архитектуре памяти, указатель будет не обязательно одним числом. memcpy() реализуется на уровне операционной системы, которая знает, как устроена память и как ее адресовать. А вот операторы "+" или "-" могут ничего не знать, об архитектуре памяти конкретной системы.
Хотя если Вы считаете, что вместо программирования бизнес логики необходимо заниматься борьбой с указателями, то никак мешать Вам в этом не буду... |
|||
415
Слоняра
07.04.06
✎
10:14
|
(411)а это как раз херовый способ.. для пацанов
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |