我有一个显示菜单的小型终端程序。我希望有一个函数,它接受用户的输入和一系列过程名称,并能够调用用户选择的过程。我知道我可以在主程序中使用if
或case
语句来做到这一点,但我想用上面的程序和其他一些菜单函数创建一个单元,如果这是可能的,我可以让它调用任意程序。在这里或多或少我希望它如何工作(我知道它错了,但所以你得到了一个大概的想法)。
program menu;
uses crt;
type procs = array [0..1] of procedure;
procedure call_procs(inp: int; procsy: procs);
begin
writeln(procsy[ord(inp)]); {And call it here.}
end;
var procsx : procs;
begin
procsx[0] := readkey; {I would like to somehow store the procedure here.}
procsx[1] := clrscr;
call_procs(0, procsx);
end.
有没有办法做这样的事情?提前谢谢。
答案 0 :(得分:0)
我想出了如何做到这一点。可以使用指向过程的指针,然后创建这些指针的数组,并将它们传递给我想要使用的过程。此外,由于某种原因,它似乎不适用于Pascal附带的功能(例如readkey或clrscr)。对于这个例子,可以这样做:
Sub New()
这按预期工作,调用(在本例中)过程program menu;
type
Tprocptr = procedure; {This creates a pointer to procedures.}
Tprocarray = array of Tprocptr;
procedure writeHi;
begin
writeln('Hi!');
end;
procedure writeHello;
begin
writeln('Hello!');
end;
procedure call_proc(inp: integer; procsy: Tprocarray);
{This now calls functions like one would expect.}
begin
procsy[ord(inp)];
end;
var
proclist : Tprocarray;
begin
setlength(proclist, 2);
proclist[0] := @writeHi; {The '@' creates a pointer to those procedures.}
proclist[1] := @writeHello;
call_proc(0, proclist);
end.
,因此如果您运行此程序,它将输出writeHi
到终端。如果您将Hi!
更改为call_proc(0,proclist)
,则会改为调用call_proc(1, proclist)
。
答案 1 :(得分:0)
您的原始代码有一些问题没有在您的答案中引用。
您有一个procedure
数组,但是您使用这些过程调用作为参数调用writeln
,就好像它们是function
一样,而不是readkey
。
function
是procedure
,而不是@
,因此其类型与数组的元素类型不匹配
您对数组的过程分配需要使用int
来引用过程指针而不是实际调用过程
不确定您正在使用哪些编译器或选项,但integer
不是标准的Pascal整数类型,而是ord
。
作为一个小问题,由于您已经在使用数组的整数索引,因此您不需要使用program menu;
uses crt;
type procs = array [0..1] of procedure;
procedure call_procs(inp: integer; procsy: procs);
begin
procsy[inp]; { call the procedure here - removed 'ord' since it's superfluous }
end;
var procsx : procs;
begin
{ procsx[0] := readkey; {- 'readkey' is a function and won't work here }
procsx[1] := @clrscr;
call_procs(1, procsx);
end.
。
因此,对代码进行基本工作的最小更改将是:
char
您可以创建一个返回readkey
的函数数组,该函数与program menu;
uses crt;
type procs = array [0..1] of function: char;
procedure call_procs(inp: integer; procsy: procs);
begin
writeln(procsy[inp]); { call the function; write out the returned char }
end;
function foo: char;
begin
foo := 'X';
end;
var procsx : procs;
begin
procsx[0] := @readkey;
procsx[1] := @foo;
call_procs(0, procsx);
call_procs(1, procsx);
end.
的类型匹配:
{{1}}