Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Gerasimov Gerasim                    2:5006/18.11   15 Nov 2001  10:05:14
 To : Egor Alexeev
 Subject : Case
 -------------------------------------------------------------------------------- 
 
 
 
  EA> Спасибо. Видимо этим способом и придется воспользоваться.
  EA> Единственное, что смущает - это слижком уж большая ассемблерная
  EA> вставка получится(Пишу на TMT pascal'е). Hеужели у высокоуровневых
  EA> языков нет методов для создания аналогичного приведенному выше кода.
 
 Почему же....например на борланд пасе
 === Cut ===
 unit hg;
 interface
 {есть четыре процедуры с одинаковыми параметрами}
 procedure InstallCom1(Speed:longint;Data,Parity,Stop:word);
 procedure InstallCom2(Speed:longint;Data,Parity,Stop:word);
 procedure InstallCom3(Speed:longint;Data,Parity,Stop:word);
 procedure InstallCom4(Speed:longint;Data,Parity,Stop:word);
 {есть процедура вызывающая их посредством case
  параметр com определяет какая из них будет вазвана}
 procedure InstallCom (Com:byte;Speed:longint;Data,Parity,Stop:word);
 
 implementation
 {определяем процедурный тип}
 type
   TInstallFunc = procedure(Speed:longint;Data,Parity,Stop:word);
 
 {пишем наши процедуры}
 procedure InstallCom1(Speed:longint;Data,Parity,Stop:word);
   begin
   end;
 procedure InstallCom2(Speed:longint;Data,Parity,Stop:word);
   begin
   end;
 procedure InstallCom3(Speed:longint;Data,Parity,Stop:word);
   begin
   end;
 procedure InstallCom4(Speed:longint;Data,Parity,Stop:word);
   begin
   end;
 
 {если у вас 16битный турбо паскаль версии 6 и выше можно воспользоваться асмом
 и применить ближний вазов}
 procedure InstallCom(Com:byte;Speed:longint;Data,Parity,Stop:word);assembler;
 asm
                 xor     bx,bx
                 mov     bl,com
                 dec     bl
                 and     bl,$3
                 sal     bx,1
                 push    Speed.word[2]
                 push    Speed.word[0]
                 push    Data
                 push    Parity
                 push    Stop
                 push    cs
                 call    word ptr @Vector.[bx]
                 jmp     @exit
 @Vector:        dw      InstallCOM1
                 dw      InstallCOM2
                 dw      InstallCOM3
                 dw      InstallCOM4
 @exit:
 end;
 {если у вас 32-битнный паскаль например FPC достаточно dw заменить на dd,
  sal bx,1 заменить на sal ebx,2  и убрать push cs}
 
 {Hу а если вы не хотите заморачиваться с асмом то используйте этот код...
 procedure InstallCom(Com:byte;Speed:longint;Data,Parity,Stop:word);
 const funcTable:array[0..3] of TInstallFunc =
  (InstallCom1,InstallCom2,InstallCom3,InstallCom4);
 begin
  funcTable[(com-1) and 3](speed,data,parity,stop);
 end;}
 
 end. === Cut ===
 
 Hадеюсь помог Ж:)
 Gerasimov_Gerasim
 
 --- GoldED/W32 3.0.1
  * Origin: в процессе разработки (2:5006/18.11)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Case   Egor Alexeev   12 Nov 2001 22:03:49 
 Case   Sashka Yackubtchick   13 Nov 2001 23:00:03 
 Case   Egor Alexeev   14 Nov 2001 21:10:00 
 Case   Gerasimov Gerasim   15 Nov 2001 10:05:14 
 Re: Case   Michael Ryazanov   14 Nov 2001 18:06:00 
 Case   Egor Alexeev   17 Nov 2001 22:53:01 
 Re: Case   Michael Ryazanov   19 Nov 2001 21:20:00 
Архивное /ru.algorithms/32863bf38880.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional