如何在Pascal中的另一个过程中调用过程

cap*_*tiv 6 delphi pascal procedure

procedure questiontype;  
 begin  
  writeln ('Enter the type of question you would like...');  
  writeln ('1. Add');  
  writeln ('2. Multiply');  
  writeln ('3. Subtraction');  
  writeln ('4. Division');  
  readln (typeofquestion);  
   case typeofquestion of
    1: add;
    2: multiply;
    3: subraction;
    4: division   
else writeln ('Choose again'); 
end;
end;          
Run Code Online (Sandbox Code Playgroud)

所有程序都是加法,乘法,减法和除法.如果我把它放在主程序中,它将工作正常,但当我把它作为一个程序本身,我得到错误未声明的标识符.我在许多网站上看过一个这样的例子,但我找不到任何网站.

make add,multiply,subtraction,division如何从这个内部进入程序?

Dav*_*nan 14

您必须在调用它们的例程之前声明过程.虽然您没有展示如何定义其他例程,但我推断它们是在您显示的例程之后声明的.

因此,您可以简单地重新排序代码,以便在调用它们的过程之前定义加法,乘法,减法和除法.

所以这将有效:

procedure add;
begin
  //do something;
end;

procedure questiontype;  
begin  
  add;  
end;
Run Code Online (Sandbox Code Playgroud)

但这不会编译:

procedure questiontype;  
begin  
  add;  
end;

procedure add;
begin
  //do something;
end;
Run Code Online (Sandbox Code Playgroud)

Pascal及其变体是一次性编译的,如果编译器在提到它的时候不知道例程,它就无法继续.

Pascal支持协同例程,其中A通过使用*forward声明来调用B和B调用A. 例如:

procedure B; forward;

procedure A;
begin
  B;
end;

procedure B;
begin
  A;
end;
Run Code Online (Sandbox Code Playgroud)

当然这是一个写入的无限循环,它将以堆栈溢出结束(多么合适!)但当然有必要的实例.

但是,很少需要前向声明,如果可能的话应该避免使用,因为它们会增加复杂性.通过简单地重新排序您的声明,可以找到解决方案.

最后,在Brian Kernighan的着名文章" 为什么Pascal不是我最喜欢的编程语言"中明确提到了声明在使用之前发生的排序约束.

  • 我的猜测是downvoter只读取问题的第一个标签,即`[delphi]`,并注意到你对`interface`部分一无所知.或许这位贬低者只是心情不好.尽管如此,IMO仍然不应该在不发表评论的情况下进行投票. (2认同)

And*_*and 6

我看到您已为问题[delphi],以及[pascal],所以我想你实际上是写Delphi代码.然后你还有一些选择,除了关心程序的顺序和forwardDavid讨论的指令.

大多数情况下,Delphi项目(GUI 控制台)被划分为"单位".一个典型的单位看起来像这样:

unit MyUnit;

interface

const
  RANDOM_NUMBER = 17;

var
  PrintExtraNiceMessage: boolean;

procedure DoThis;
procedure DoThat;

implementation

const
  BUFFER_SIZE = 256;

procedure InitSomething;
begin
  // TODO: do some internal work...
end;

procedure DoThis;
begin
  // TODO: do something
end;

procedure DoThat;
begin
  // TODO: do something else
end;
Run Code Online (Sandbox Code Playgroud)

您会注意到该单元分为两部分:interface零件和implementation零件.该interface部分仅包含声明(函数,过程,类型,常量和变量); 此处声明的函数和过程在本implementation节中定义(即实现).请注意,该implementation部分中定义的函数和过程可以在该部分中没有声明interface.

最大的想法是该interface部分的内容对于程序中的所有其他单元是可见的,而该implementation部分的内容仅在该单元内可见.因此,在你的程序中的任何其他单位可以利用RANDOM_NUMBER不变,PrintExtraNiceMessage变量和两个程序DoThisDoThat.但是你只能InitFunction在这个单元中使用(例如,内部 DoThisDoThat).此外,该常数BUFFER_SIZE在该单元之外也是不可见的.

这是一种非常优雅的方法.本interface节描述了如何在其他单元中使用此单元(例如,有哪些功能以及如何使用它们),并且实现细节在本implementation节中"隐藏" .

这种方法的一个好处是它至少可能解决了你的问题.如果add,multiply,subtract,和divide程序应当给其他单位可见的,那么就应该在宣布interface部分.但是当它们进入你的questiontype程序时,它们确实为编译器所知,所以你可以使用它们来调用它们,即使它们是questiontypeimplementation部分内部的程序下面定义(实现)的.但是,另一方面,如果让其他单位使用这些程序毫无意义,那么就不应该在该interface部分中声明它们,你需要按照大卫的建议去做.如果您的项目中根本没有正常单位,也就是说,如果您只有program文件,它没有分成interfaceimplementation部分,这也适用.