将过程分配给变量并在Pascal中调用它们

时间:2017-04-11 17:13:52

标签: pascal

我有一个显示菜单的小型终端程序。我希望有一个函数,它接受用户的输入和一系列过程名称,并能够调用用户选择的过程。我知道我可以在主程序中使用ifcase语句来做到这一点,但我想用上面的程序和其他一些菜单函数创建一个单元,如果这是可能的,我可以让它调用任意程序。在这里或多或少我希望它如何工作(我知道它错了,但所以你得到了一个大概的想法)。

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.

有没有办法做这样的事情?提前谢谢。

2 个答案:

答案 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

  • functionprocedure,而不是@,因此其类型与数组的元素类型不匹配

  • 您对数组的过程分配需要使用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}}
相关问题