Подраздел FAQ (ЧАВО, ЧАстые ВОпросы) предназначен для размещения готовых рабочих программ, реализаций алгоритмов. Это нечто вроде справочника, он наполнялся в течение 2000х годов. Ваши вопросы, особенно просьбы решить задачу, не пройдут предмодерацию. Те, кто наполнял раздел, уже не заходят на форум, а с теми, кто на форуме сейчас, лучше начинать общение в других разделах. В частности, решение задач — здесь.
Улучшение кода, Уменьшение времени работы программ
Проведение теста: сортировка массива (array[1..20] of integer) методом пузырька. Всего было проведено 30 тестов : 10 c n= 10^4; 10 c n= 10^5; 10 c n= 10^6; и один тест с n=10^7 (один, т.к. с увеличением степени n на 1, время проведения теста увеличивается соответственно в 10 раз)
Результат: Во всех случаях (каждый тест - новый массив) самой быстрой конструкцией оказалась "While ... do...", следом за ней "If ... then Goto..."
Oleg_Z, вот чего у меня в книге есть: Функции Overlay'а: OvrClearBuf - очищает буфер OvrGetBuf - возвр. размер буфера OvrGetRetry - возвр. размер области испытаний (что за она не въехал, но по-умолчанию тут 0). OvrInit - инициализирует систему Overla'ев и открывает оверлейный файл. OvrInitEMS - загружает оверлейный файл в память EMS, если это возможно. OvrSetBuf - устанавливает размер буфера OvrSetRetry - догадайся сам, хотя не стоит Так же тут описана переменная OvrResult:Integer, которая может быть OvrOK(0) - всё пучком OvrError(-1) - что-то не пучком OvrNotFound(-2) - файл не нашёл OvrNoMemory(-3) - досадно как... OvrIOError(-4) - файл есть, атолку нет ObrNoEMSDriver(-5) - и такое бывает OvrNoEMSMemory(-6) - а драйвер тогда зачем? Ещё в модуле есть возможность переопределить такую фигню:
Type OvrReadFunc=Function(OvrSeg:Word):Integeer; Var OvrReadBuf:OvrReadFunc; { *** } OvrFileMode:Byte;
Но зачем и что тут к чему я тоже что-то не того... А ещё в System есть стадо переменных предназначенных для Overlay'а: OvrCodeList:Word=0 - список сегментов кода OvrDebugPtr:Pointer=Nil - для отладчика OvrDOSHandle:Word=0 - для админа (скорее всего Handle файла) OvrEMSHandle:Word=0 - Handle EMS-куска OvrHeapEnd,OvrHeadOrg,OvrHeadPtr,OvrHeapSize:Word=0 - это если без EMS OvrLoadList:Word=0 - "используется администратором оверлеев". И без коментариев. Потешное замечание сделано в этой книге: не надо размещать в Overla'ях обработчики прерываний и данные для RegisterBGIDriver и RegisterBGIFont
Далее идёт пример:
{$M 16384,65536,655360} {$D-,F+} {D- для того, чтобы Deug-Data не скидывались в Exe-шник. Тогда можно .Ovr приаттачить к самому .Exe}
Uses Crt,Overlay,Ovr_Init,Ovr1,Ovr2;
Var ch:Char;
Procedure UseOverlay; Begin OutPut1 {Из Ovr1} End;
Begin Repeat clrScr; Write('Press any key to start ovrlays or ESC to quit'); ch:=ReadKey; WriteLn; If ch<>#27 Then UseOverlay Until ch=#27 End.
Unit OvrInit; Interface Implementation Uses Overlay,Crt; CONST OvrBufSize=100000; Begin ClrScr; OvrInit(ParamStr(0)); {!!! Предполагается, что .Ovr прилеплен к .Exe} If OvrResult<>OvrOk Then Begin WriteLn('ERROR!!!); Halt End; OvrInitEMS; If OvrResult<>OvrOk Then Begin WriteLn('ERROR!!!); Halt End; OvrSetBuf(OvrBufSize); If OvrResult<>OvrOk Then Begin WriteLn('ERROR!!!); Halt End; OvrSetRetry(OvrBufSize Div 3) {Div 3 - оптимальный вариант, но всё ещё не понятно, что за область такая} End.
Далее берём и Build'им саму прогу. А потом выходим из BP и пишем в cmd Copy /B Proga.Exe+Overlay.Ovr (или что-то типа того). Всё теперь можно запускать. Хотя рекомендуется не использовать Overlay во время Debug'а (какой геморрой надо преодолеть, чтобы запустить прогу). Вот так вот. Если ещё чего - спрашивай, может найду...