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

标签 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;          

加、乘、减、除都是过程。如果我将其放入主程序中,它将正常工作,但是当我将其作为过程本身时,我收到错误未声明的标识符。我在很多网站上查看过类似的示例,但我找不到任何示例。

如何让加、乘、减、除从这个程序内部转到它们的程序?

最佳答案

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

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

所以这会起作用:

procedure add;
begin
  //do something;
end;

procedure questiontype;  
begin  
  add;  
end;

但这不会编译:

procedure questiontype;  
begin  
  add;  
end;

procedure add;
begin
  //do something;
end;

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

Pascal 通过使用“前向声明”确实支持 A 调用 B 和 B 调用 A 的协同例程。例如:

procedure B; forward;

procedure A;
begin
  B;
end;

procedure B;
begin
  A;
end;

自然地,这是一个无限循环,如所写,它将因堆栈溢出而终止(多么合适!),但当然有真实的例子,这是必要的。

但是,很少需要前向声明,并且应尽可能避免,因为它们会增加复杂性。只需重新排序声明即可找到解决方案。

最后,Brian Kernighan 著名文章 Why Pascal is Not My Favorite Programming Language 中明确提到了声明在使用之前发生的排序约束。 .

关于delphi - 如何在 Pascal 中的另一个过程中调用一个过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5363287/

相关文章:

oracle - 如何将 Oracle 过程的参数默认值设置为选择结果?

arrays - Delphi 中二维数组的索引运算符属性

delphi - Delphi Chromium 嵌入式问题

pascal - 非法表达:如果,则为else语句

c++ - Pascal 的 readkey 有等价物吗?在 C 或 C++ 中?

MySQL CREATE PROCEDURE 语法

delphi - 从模式对话框中调用脚本函数会显示“对象未实例化”

delphi - 检测到 Citrix "application mode"吗?

C函数指针翻译成Delphi/Pascal?

mysql - 存储过程返回错误值