0

我正在用帕斯卡编写一个程序。但不知何故,我不明白其原因的错误。你能帮忙吗?

Program main;

Procedure A(n : longint);
Procedure B(n : longint);
    Procedure E(n : longint);
        Procedure D(n : longint);
        begin
        WriteLn ('In D. No Call...');
        end;

    begin
    WriteLn ('In E ');
    D(n);
    end;

begin
WriteLn ('In B ');
WriteLn ('Calling A Do -1 ',n);
if n = 1 
 then 
A(1);


end;




begin
  WriteLn ('In A ');
  B(n);
  WriteLn ('Calling B  ',n);
  if(n<1)
  then 
  begin
  C(n);
  end;
  end;

   begin
   A(1);
   end.

我正在尝试从主 proc 调用 proc A,然后 A 调用 B 等等。但是我在 C 中遇到编译错误:

Here are the errors I get:
Free Pascal Compiler version 2.2.0 [2009/11/16] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Linux for i386
Compiling prog.pas
prog.pas(32,14) Error: Identifier not found "C"
prog.pas(32,17) Error: Illegal expression
prog.pas(37,4) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
4

2 回答 2

2

只是为了补充 SteB 的答案,这里有几件事可能是错误的。

  • 没有命名的过程C
  • 即使您重命名EC,您仍然会收到编译器错误,因为A无法调用C,因为它不在范围内,因为过程的嵌套(它在范围内B)。请参阅嵌套过程中的静态范围
  • 除此之外,您可能会在运行时遇到堆栈溢出异常,因为A(1)调用...B(1)A(1)

例如,如果重命名EC缩进:

Program main;

Procedure A(n : longint);
    Procedure B(n : longint);
        Procedure C(n : longint);
            Procedure D(n : longint);
                begin
                    WriteLn ('In D. No Call...');
                end;
            begin
                WriteLn ('In C ');
                D(n);
            end;
        begin
            WriteLn ('In B ');
            WriteLn ('Calling A Do -1 ',n);
            if n = 1 
                then A(1);  (* Compiles OK, B is nested within A, but watch recursion *)
        end;
    begin
        WriteLn ('In A ');
        B(n);
        WriteLn ('Calling B  ',n);
        if(n < 1)
            then 
                begin
                    C(n); (* Doesnt compile, since C is nested within B and not in scope of A *)
                end;
    end;
begin
    (* You are in Main here *)
    A(1);
end.
于 2012-11-13T10:05:19.863 回答
1

我认为您错过了“程序C”。
我没有在任何地方看到定义的“过程 C”,错误表明程序也看不到这个例程。

一些更好的缩进可以使事情更清晰,您使用的是嵌套过程(不是真正的最佳实践),但过程 A 和 B 具有相同的缩进级别。

于 2012-11-13T08:52:06.057 回答