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不是我最喜欢的编程语言"中明确提到了声明在使用之前发生的排序约束.
我看到您已为问题[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变量和两个程序DoThis和DoThat.但是你只能InitFunction在这个单元中使用(例如,内部 DoThis或DoThat).此外,该常数BUFFER_SIZE在该单元之外也是不可见的.
这是一种非常优雅的方法.本interface节描述了如何在其他单元中使用此单元(例如,有哪些功能以及如何使用它们),并且实现细节在本implementation节中"隐藏" .
这种方法的一个好处是它至少可能解决了你的问题.如果在add,multiply,subtract,和divide程序应当给其他单位可见的,那么就应该在宣布interface部分.但是当它们进入你的questiontype程序时,它们确实为编译器所知,所以你可以使用它们来调用它们,即使它们是questiontype在implementation部分内部的程序下面定义(实现)的.但是,另一方面,如果让其他单位使用这些程序毫无意义,那么就不应该在该interface部分中声明它们,你需要按照大卫的建议去做.如果您的项目中根本没有正常单位,也就是说,如果您只有program文件,它没有分成interface和implementation部分,这也适用.