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

Вниз

всё -- досисадминился   Найти похожие ветки 

 
Ketmar ©   (2006-07-18 23:49) [0]

забыл, что в until кроме false ьщжно писать условие выхода. автоматически написал нечто вроде
repeat
 ...
 if condition then break;
 until false;


пайду, убьюсь ап стену...


 
Ketmar ©   (2006-07-18 23:49) [1]

тьфу. ещё и печатать напрочь разучился...


 
Rouse_ ©   (2006-07-18 23:53) [2]

можно и не писать :)


 
grisme ©   (2006-07-18 23:55) [3]

ТЕРЯЕМ!..:) СРОЧНО ПРОВОДИТЬ ВОССТАНОВИТЕЛЬНО-ПРОФИЛАКТИЧЕСКИЕ РАБОТЫ..


 
Ketmar ©   (2006-07-19 00:02) [4]

>Rouse_ ©   (18.07.06 23:53) [2]
можно. просто, увидев у кого-то такой код, я бы не преминул кинуть увесистый булыжник. %-))

>grisme ©   (18.07.06 23:55) [3]
да. увольняться надо... но тогда я без денег останусь -- работать дома мне жутко лениво. а так хоть какой-то стимул. %-)

зыж стену стало жалко. "эльфы юные, головы чугунные"...


 
grisme ©   (2006-07-19 00:06) [5]

> "эльфы юные, головы чугунные"...

Ж:D


 
Marser ©   (2006-07-19 00:39) [6]

Пить надо меньше (Ц)


 
Джо ©   (2006-07-19 00:41) [7]

> пайду, убьюсь ап стену...

Пааагоди, пааавремени —
Утро мудренее...

(c)


 
grisme ©   (2006-07-19 00:46) [8]

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


 
Ketmar ©   (2006-07-19 01:20) [9]

>Marser ©   (19.07.06 00:39) [6]
пробовал. ещё противнее.

>Джо ©   (19.07.06 00:41) [7]
тогда посплю.

>grisme ©   (19.07.06 00:46) [8]
можно, можно... я на работе трезвый. или с бодуном, но это не важно.


 
Piter ©   (2006-07-19 02:14) [10]

Ketmar ©   (18.07.06 23:49)
repeat
...
if condition then break;
until false


нда... Как такое можно забыть?...


 
Ketmar ©   (2006-07-19 09:50) [11]

ну, пусть не совсем забыл. просто там в середине цикла пара условий на выход. вот и в конце написал "на автомате" такое же.
в принципе, я часто использую "repeat .. until false" с брыками в серёдке.
а намедни обнаружил в программе ещё более чудную конструкцию: repeat ... until true. %-) удалять не стал.


 
tsa   (2006-07-19 09:52) [12]

Это черный цвет влияет ;-)


 
Шпиён   (2006-07-19 10:00) [13]


> Ketmar ©   (19.07.06 09:50) [11]

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


 
Rouse_ ©   (2006-07-19 10:17) [14]


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

А чем плох такой код?


 
Ketmar ©   (2006-07-19 10:39) [15]

>Rouse_ ©   (19.07.06 10:17) [14]
да, в принципе, ничем. просто сразу навевает мысли о незнании матчасти и тупом copy/paste. %-)


 
Rouse_ ©   (2006-07-19 10:42) [16]

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


 
umbra ©   (2006-07-19 10:45) [17]


> repeat
>  ...
>  if condition then break;
>  until false;

это же, можно сказать, заготовка для сервера :)


 
tsa   (2006-07-19 10:46) [18]

На завод! к печи - что нибудь закидывать. а то код не нравится! :)


 
Rouse_ ©   (2006-07-19 10:46) [19]

к примеру:

try
 repeat
   if Assigned(SomeEvent) then
     SomeEvent(Self);
 until False;
except
     on E: EAbort do
       WriteLog("Done");
     on E: Exception do
       raise;
end;


 
Rouse_ ©   (2006-07-19 10:48) [20]


> это же, можно сказать, заготовка для сервера :)

Собственно это рабочий цикл по крайней мере сервиса :)


 
Piter ©   (2006-07-19 10:54) [21]

Rouse_ ©   (19.07.06 10:46) [19]
к примеру:

try
repeat
  if Assigned(SomeEvent) then
    SomeEvent(Self);
until False;


неправильная логика программы. Бесконечные циклы это вообще плохо.

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


 
Плохиш ©   (2006-07-19 11:15) [22]


> Rouse_ ©   (19.07.06 10:46) [19]

Не надо делать офтопиков, в оригинале было

>  if condition then break;
>  until false;

и ни каких команд между if и until.


 
Rouse_ ©   (2006-07-19 11:15) [23]


> неправильная логика программы. Бесконечные циклы это вообще
> плохо.
>
> Это значит у тебя будет генерироваться событие бесконечно
> подряд до тех пор, пока кто-то там во внешней процедуре
> не обнулит это указатель на обработчик. Это не грамотно.
>

Да ну? Вообщето в примере показан вечный цикл с отловом Abort-а :)
А по поводу бесконечных циклов - это кто сказал что плохо? Поговорку ИШ про овощь помнишь? ;)


 
Rouse_ ©   (2006-07-19 11:16) [24]


> Плохиш ©

Тоже скажешь что это плохо? ;)


 
Плохиш ©   (2006-07-19 11:21) [25]


> Rouse_ ©   (19.07.06 11:16) [24]
>
> > Плохиш ©
>
> Тоже скажешь что это плохо?

Нафига ставить кучу goto туда где можно обойтись if-ом?


 
Rouse_ ©   (2006-07-19 11:33) [26]

Нафига - это знаетели както бездоказательно звучит. Где теоретическая база которая побводит под запрет использования таких конструкций? :)


 
Piter ©   (2006-07-19 11:43) [27]

Rouse_ ©   (19.07.06 11:15) [23]
Да ну? Вообщето в примере показан вечный цикл с отловом Abort-а :)


а какой смысл вот так подряд вызывать события?

А по поводу бесконечных циклов - это кто сказал что плохо?

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

Приведи КОНКРЕТНЫЙ практический пример использования:

until false;


 
Rouse_ ©   (2006-07-19 12:00) [28]


> Приведи КОНКРЕТНЫЙ практический пример использования:

Легко.
Утилита восстановления поврежденного файла формата POIFS
Ищем битый блок при обращении к которому возникнет Exception.

if StgIsStorageFile(StringToOleStr(AFileName)) <> S_OK then
try
 PreviosValidOffset := 0;
 repeat
   PreviosValidOffset := TPoifsPropsBlock(GetBlock(PreviosValidOffset));
   ... рассчет смещений и попытка обращению к блоку
   ... при успешном достижении конца цепочки (рассчитывается), произойдет вызов Abort
 until False;
except
 on E: EAbort do Result := S_OK;
 on E: EBatException do
   Result := FixBatEntry(PreviosValidOffset);
 on E: EXBatException do
   Result := FixExtendedBatEntry(PreviosValidOffset);
 on E: Exception do raise;  
end;


 
Piter ©   (2006-07-19 18:10) [29]

Rouse_ ©   (19.07.06 12:00) [28]

налицо неграмотное использование исключений. Это где ты видел такое вообще:

Rouse_ ©   (19.07.06 12:00) [28]
... при успешном достижении конца цепочки (рассчитывается), произойдет вызов Abort


Функция GetBlock при своем так сказать успешном завершении вызывает Abort? Чтобы во внешней процедуре этот Abort ловить? :)))

Тебе не кажется, что это как-то нелогично?

Функция при своем успешном заверщении должна не исключение генерировать, а возвращать соответствующее значение, ну например 0.

Тагды:


const
 cBLOCK_COMPLETE = 0;

...

if StgIsStorageFile(StringToOleStr(AFileName)) <> S_OK then
try
PreviosValidOffset := 0;
repeat
  PreviosValidOffset := TPoifsPropsBlock(GetBlock(PreviosValidOffset));
until PreviosValidOffset = cBLOCK_COMPLETE;
Result := S_OK;
except
on E: EBatException do
  Result := FixBatEntry(PreviosValidOffset);
on E: EXBatException do
  Result := FixExtendedBatEntry(PreviosValidOffset);
on E: Exception do raise;  
end;


 
Rouse_ ©   (2006-07-19 18:22) [30]


> Функция GetBlock при своем так сказать успешном завершении
> вызывает Abort? Чтобы во внешней процедуре этот Abort ловить?
>  :)))
>
> Тебе не кажется, что это как-то нелогично?

А тебе не кажется что ты по крайней мере немного не в теме и вот это: PreviosValidOffset = cBLOCK_COMPLETE; выгледит немного бредово :)
это раз.

Второе: аборт в этой функции никогда не вызовиться и оставлен только на всякий случай ибо определить конец не получиться. StgIsStorageFile вернул не S_OK и как минимум одно исключение типа EBatException появиться в процессе трассировки.

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

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

Ну и в пятых cBLOCK_COMPLETE = т.е. верный признак окончания цепочки прописан в конце каждой ветви до которой нужно еще дойти - напрямую не считаешь (если не ушли в рекурсию) и для каждой имеет разное значение :)


 
Rouse_ ©   (2006-07-19 18:31) [31]

Это я еще не показываю заморочки которые возникают при убитии самого начала блоков, обычно по 16 байт грохается под FAT32. Вот там прямой брутфорс этих 16 байт и попытка чтения после каждого изменения. Как только получилось что-то похожее на выход в таблицу - сохраняем в отдельный файл и брутфорсим дальше, ибо еще не факт что верно получилось.


 
Piter ©   (2006-07-19 19:33) [32]

Rouse_ ©   (19.07.06 18:22) [30]
А тебе не кажется что ты по крайней мере немного не в теме и вот это: PreviosValidOffset = cBLOCK_COMPLETE; выгледит немного бредово :)
это раз.


я немного не в теме ТВОЕЙ программы? Розыч, да я вообще не в теме ТВОЕЙ программы. Основываюсь только на тех данных, которые ты дал.

Почему выглядит бредово? Потому что константе дали название cBLOCK_[b]COMPLETE[/b]? Ну назови ее cBLOCK_ABORT, я не знаю - тебе виднее.

В любом случае - мне эта логика кажется неправильной, хотя трудно говорить, не знаю специфики твоей программы. Но ты сначала ОПРЕДЕЛЯЕШЬ, что исключение будет, а потом вызываешь бесконечный цикл, зная что там возникнет исключение. Причем, юнитов на пару тысяч строк.

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

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

until false;

Или пример, где используется:

while true do

что одно и тоже в целом.


 
umbra ©   (2006-07-19 19:43) [33]


> приведи доступный пример, где нужно использовать:
>
> until false;

вопрос не ко мне, но вот вполне доступный (хотя и несколько абстрактный :)) пример постоянно работающего и не имеющего окон сервиса, обрабатывающего запросы клиентов

repeat
 if ClientConnected then
   ServeClient;
until false;


 
Piter ©   (2006-07-19 19:47) [34]

umbra ©   (19.07.06 19:43) [33]
repeat
if ClientConnected then
  ServeClient;
until false


плохой пример. А сервис не рассматривает варианты, что его могут остановить?

Как минимум:

repeat
if ClientConnected then
  ServeClient;
until Terminated;


 
Vendict ©   (2006-07-19 20:44) [35]

> приведи доступный пример, где нужно использовать:
>
> until false;

старый пример из паскаля, которым я всегда пользовался:

repeat
c:=ReadKey;
//реакция на нажатия и выполнение необходимых операций
until False;


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


 
Rouse_ ©   (2006-07-19 20:57) [36]


> Piter ©   (19.07.06 19:33) [32]

Мих, ты читаешь но не вчитываешся. Краткая компиляция того что я пытаюсь тебе обьяснить.
Есть бесконечный цикл, заведомо известно, что на одной из итераций цикла должно возникнуть исключение. Вопрос - нафига нам лишний IF когда выход через SEH нам полюбому обеспечен?


 
Rouse_ ©   (2006-07-19 21:03) [37]


> А сервис не рассматривает варианты, что его могут остановить?

Сервис не должен рассматривать варианты остановки в своем потоке, все общение с SCM происходит не в потоке сервиса.


 
Piter ©   (2006-07-19 21:11) [38]

Розыч, я предъявляю претензии вот к этому:

заведомо известно, что на одной из итераций цикла должно возникнуть исключение

как такое может быть известно? Может, тогда и результаты итерации известны? Зачем тогда итерировать? :)


 
Rouse_ ©   (2006-07-19 21:25) [39]


> как такое может быть известно? Может, тогда и результаты
> итерации известны?

Дело в том, что если StgIsStorageFile не вернула S_OK (см MSDN), но известно что это точно POIFS, то проход по дереву блоков неминуемо приведет к очибке чтения одного из банков данных, на которые указывает каждый блок. Какая это будет итерация - хрен его знает. Наши пользователи такие вещи умудряются присылать что волосы дыбом становяться... ммм... Обо что это я? А! Так вот, если вызов функции неуспешен - крутим цикл до упора и можно не сомневаться что будет АВ, ибо я делаю практически тоже что делает оригинальная StgIsStorageFile, просто она через SEH давит ошибку и возвращает S_FALSE, а я пытаюсь поправить блок. В данной ситуации нельзя определить когда будет конец цикла...


 
Rouse_ ©   (2006-07-19 21:29) [40]

Т.е. если ты понял я пытаюсь работать с файлом на уровне его физической структуры через read write (благо формат более менее известен), а не через АПИ. Это достаточно часная ситуация



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

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

Наверх





Память: 0.55 MB
Время: 0.036 c
15-1152874361
nikShev
2006-07-14 14:52
2006.08.13
Пиринговые сети


2-1153866220
impuls
2006-07-26 02:23
2006.08.13
Осциллограф


3-1148902254
Nein
2006-05-29 15:30
2006.08.13
рекурсия в цикле по строкам ADOQuery


15-1153081750
Kerk
2006-07-17 00:29
2006.08.13
«Судейство в Томске - происки ЦСКА»


15-1153127652
xman
2006-07-17 13:14
2006.08.13
Сайт с компонентами на Delphi





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