将参数传递给自由格式 RPG 线性主程序时出现问题
Problems passing parameters to free format RPG Linear-Main program
我正在尝试测试模块化自由格式 RPG 方法,这样我们就可以开始实际维护我们的代码,而不是沉浸其中。当我决定尝试使用所有新的 Dcl 和 Ctl 语句来真正删除格式时,我在创建服务程序和模块以及分离代码方面做得很好。
我只是简单地从书中复制了以下代码"programming in ILE RPG"但是当我调用它并传递一个参数时,该值在程序中始终为0。就像它没有看到输入参数一样。这是由于 PTF 和 RDi 的版本控制,还是我遗漏了一些愚蠢的东西?作为记录,我使用的是 V7R1M0,RDi 是版本 9.5.1.0
ctl-opt Main(Driver);
dcl-pr Driver Extpgm('THISPGM');
*n int(5);
end-pr;
Dcl-pr Celsius int(5);
*n int(5);
END-PR;
dcl-proc Driver;
Dcl-pi *n;
Englishtemp int(5);
END-PI;
dcl-s Message char(50);
dcl-S Metrictemp int(5);
dcl-s State varchar(8);
Metrictemp=Celsius(Englishtemp);
Select;
When Metrictemp<0;
State='solid';
When Metrictemp=0;
State='Freezing';
When Metrictemp=100;
State='boiling';
When Metrictemp>100;
State='gaseous';
other;
State='liquid';
ENDSL;
Message='At '+%char(Englishtemp)+' degrees (' + %Char(Metrictemp)+
' Celsius), water is ' + State+'.';
DSPLY Message;
Return;
END-PROC Driver;
dcl-proc Celsius;
dcl-pi *n int(5);
Fahrenheit int(5);
END-PI;
dcl-s Temperature int(5);
eval(h) Temperature = (5/9) * (Fahrenheit - 32 );
Return Temperature;
END-PROC Celsius;
程序代码没问题。我认为您搞砸了从命令行传递参数。您将所有内容定义为 int(5),这是一个 2 个字节的整数。
向 RPG 程序(尤其是非字符类型的程序)传递参数的最安全方法是使用命令。
CMD PROMPT('Temperature')
PARM KWD(TEMP) TYPE(*INT2) PROMPT('Temperature in °F')
注意:很遗憾 IBM 没有在所有语言中保持一致。 *CMD 中的 INT2 = RPG 中的 INT(5)
我正在尝试测试模块化自由格式 RPG 方法,这样我们就可以开始实际维护我们的代码,而不是沉浸其中。当我决定尝试使用所有新的 Dcl 和 Ctl 语句来真正删除格式时,我在创建服务程序和模块以及分离代码方面做得很好。
我只是简单地从书中复制了以下代码"programming in ILE RPG"但是当我调用它并传递一个参数时,该值在程序中始终为0。就像它没有看到输入参数一样。这是由于 PTF 和 RDi 的版本控制,还是我遗漏了一些愚蠢的东西?作为记录,我使用的是 V7R1M0,RDi 是版本 9.5.1.0
ctl-opt Main(Driver);
dcl-pr Driver Extpgm('THISPGM');
*n int(5);
end-pr;
Dcl-pr Celsius int(5);
*n int(5);
END-PR;
dcl-proc Driver;
Dcl-pi *n;
Englishtemp int(5);
END-PI;
dcl-s Message char(50);
dcl-S Metrictemp int(5);
dcl-s State varchar(8);
Metrictemp=Celsius(Englishtemp);
Select;
When Metrictemp<0;
State='solid';
When Metrictemp=0;
State='Freezing';
When Metrictemp=100;
State='boiling';
When Metrictemp>100;
State='gaseous';
other;
State='liquid';
ENDSL;
Message='At '+%char(Englishtemp)+' degrees (' + %Char(Metrictemp)+
' Celsius), water is ' + State+'.';
DSPLY Message;
Return;
END-PROC Driver;
dcl-proc Celsius;
dcl-pi *n int(5);
Fahrenheit int(5);
END-PI;
dcl-s Temperature int(5);
eval(h) Temperature = (5/9) * (Fahrenheit - 32 );
Return Temperature;
END-PROC Celsius;
程序代码没问题。我认为您搞砸了从命令行传递参数。您将所有内容定义为 int(5),这是一个 2 个字节的整数。
向 RPG 程序(尤其是非字符类型的程序)传递参数的最安全方法是使用命令。
CMD PROMPT('Temperature')
PARM KWD(TEMP) TYPE(*INT2) PROMPT('Temperature in °F')
注意:很遗憾 IBM 没有在所有语言中保持一致。 *CMD 中的 INT2 = RPG 中的 INT(5)