如何在PASCAL中以正确的方式从过程中获取变量?

如何在PASCAL中以正确的方式从过程中获取变量?,pascal,procedure,Pascal,Procedure,我正在学习一门关于编程基础的网络课程。在做了一个图表之后,我把它转换成代码,现在这是PASCAL语言。 我在程序上遇到了问题,找不到答案,在课程中也找不到,在谷歌上也找不到答案。 我想从一个过程中得到一个变量。现在我有一个工作代码,但我认为这不是一个好的工作方式。下面是代码的摘录: program WELKEWAGEN; // declare your variables here var T, N, KM, vari, prijsDW, prijsBW, jrenGEBR,

我正在学习一门关于编程基础的网络课程。在做了一个图表之后,我把它转换成代码,现在这是PASCAL语言。 我在程序上遇到了问题,找不到答案,在课程中也找不到,在谷歌上也找不到答案。 我想从一个过程中得到一个变量。现在我有一个工作代码,但我认为这不是一个好的工作方式。下面是代码的摘录:

   program WELKEWAGEN;

   // declare your variables here
   var T, N, KM, vari, prijsDW, prijsBW, jrenGEBR, taksDW, taksBW, prijsB, verbrBW,         prijsD, verbrDW : real;

 procedure OPHALEN(para : string);
 begin
 repeat
 writeln('geef de ', para , ' op');
 readln(vari);
 until (vari > 0);
 end;

 begin   
 //this is the main program but there is more code ofcourse  
 OPHALEN('prijs benzinewagen');
 prijsBW := vari;
 //...
 end.
现在网络课程说我应该这样编程:

begin
//...
prijsBW := OPHALEN('prijs benzinewagen');
//...
end.
但这是行不通的。 我发现以下错误:

WELKEWAGEN.pas(24,14) Error: Incompatible types: got "untyped" expected "Real"
WELKEWAGEN.pas(50) Fatal: There were 1 errors compiling module, stopping

pas(24,14)
这一行:
prijsBW:=OPHALEN('prijsbenzinewagen')

过程不返回值,因此语法

prijsBW := OPHALEN('prijs benzinewagen');
这是无效的

如果要返回值,则需要定义一个
函数

function OPHALEN(para : string): Real;
var
  Res: Real;
begin
  Res := 0;
  repeat
    writeln('geef de ', para , ' op');
    readln(Res);
  until (Res > 0);
  OPHALEN := Res;
end;
请注意,您使用的(坏)全局变量意味着您根本不必返回任何内容,因为过程可以直接访问和更改该全局变量(但您无法知道过程何时完成):

现代Pascal方言(如Delphi和FreePascal)允许使用适合您的自动声明函数结果变量(名为
result
)为函数返回值提供更清晰的语法(因为这就是函数的结果):

如果需要返回多个值,可以使用
var
参数,允许在函数内部更改这些参数

procedure OPHALEN(para: string; var RetVal: Real);
begin
  RetVal := 0;
  repeat
    writeln('geef de ', para , ' op');
    readln(RetVal);
  until (RetVal > 0);
end;

您的原始代码(以及我上面提供的示例)都无法允许用户取消,顺便说一句,应该有一些方法可以让用户退出循环;否则,您的代码就会无休止地循环,将
para
写入屏幕,然后等待输入。这会让用户感到烦恼

如果要获取返回值,必须定义
函数
,而不是
过程
。若要从函数返回值,请指定函数名。看见
function OPHALEN(para : string): Real;
begin
  Result := 0;
  repeat
    writeln('geef de ', para , ' op');
    readln(Result);
  until (Result > 0);
end;
procedure OPHALEN(para: string; var RetVal: Real);
begin
  RetVal := 0;
  repeat
    writeln('geef de ', para , ' op');
    readln(RetVal);
  until (RetVal > 0);
end;