|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/32863bf38880.html, оценка из 5, голосов 10
|