我有一个菜单的显示文件。我成功地制作了一个有效的CL程序,它显示菜单并等待输入。简而言之,它只是显示文件并等待用户按F1退出。
显示文件(近似值):
A R DISPLAY
A CA01(01 'Exit')
A 2 2'some text....'
创建命令:crtdspf file(display) srcfile(test) srcmbr(display)
CL程序:
PGM
DCLF FILE(DISPLAY) RCDFMT(DISPLAY)
LOOP: SNDRCVF
IF COND(&IN01 *EQ '1') THEN(DO)
GOTO END
ENDDO
GOTO LOOP
END:
ENDPGM
编译命令:crtclpgm pgm(test) srcfile(test) srcmbr(clsrc) output(*print)
C中的SNDRCVF相当于什么?
这是我到目前为止所拥有的。编译很好,但是当我调用它时,它什么也没做。
#include <stdio.h>
#include <recio.h>
// Include my display file.
#pragma mapinc("display","lib/display(display)", "both", "")
#include "display"
// Shortcuts to the generated structs.
typedef LIB_DISPLAY_DISPLAY_i_t input_t;
typedef LIB_DISPLAY_DISPLAY_o_t output_t;
int main(int argc, char* argv[]){
input_t input;
output_t output;
_RFILE* dspf;
// The file opens fine.
dspf = _Ropen("lib/display", "wr");
if(dspf == NULL){
printf("ERROR: Display file open failed.\n");
return 0;
}
// I tell which record format to use.
_Rformat(dspf, "display");
// Write my file to display?
_Rwrite(dspf, "", 0);
// Wait for input.
_Rreadn(dspf, &input, sizeof(input), __DFT);
// Close it and quit.
_Rclose(dspf);
return 0;
}
编译命令:crtbndc pgm(test) srcfile(test) srcmbr(main) output(*print)
然后致电:call test
我做错了什么?
答案 0 :(得分:2)
我做了一些小改动。首先,对于你的TYPEDEF,我使用了这个:
// Shortcuts to the generated structs.
typedef MYLIB_CDSPMNU_DISPLAY_both_t input_t;
typedef MYLIB_CDSPMNU_DISPLAY_both_t output_t;
因为您指定了“both”,所引用的标识符名称应该是“both”而不是“i”或“o”。目前尚不清楚你是如何成功编译的。也许你有一个早期成功的编译,以便你的CALL命令工作,但编译的程序不是当前版本。
然后我用这个模式打开文件:
// The file opens fine.
dspf = _Ropen("mylib/cdspmnu", "rr+");
你有“wr”,所以它仅为输出打开(“wr”iting)。你需要输入和输出。您的作业日志应显示C2M3005“文件未打开以进行读取操作”。你打电话给你的程序后(取决于你实际调用的编译版本)。
我改变了你的_Rformat()函数:
// I tell which record format to use.
_Rformat(dspf, "DISPLAY");
从ILE C / C ++运行时库函数手册中,_Rformat()的定义说:
fmt 参数是一个空结束的C字符串。 fmt 参数必须 是大写的。
格式名称不会像文件一样折叠成大写,而库名称则在其他位置。不知道为什么不;它只是它的方式。就个人而言,我在不依赖编译器的情况下使用大写实际意味着大写名称;所以我也会改变代码中的其他几个地方。
从技术上讲,我还更改了DSPF源以引用F3键而不是您在DDS中显示的F1键。 F1键通常用于“帮助”功能,而F3是“退出”的标准。这并不重要,但这是开始的一个习惯。并且更改了一两个名称以适应我的环境。
不需要假脱机文件。在CALL命令之后查看作业的“joblog”的最简单方法是运行DSPJOBLOG命令。但是,更好的方法是使用CALL QCMD提供的基本命令输入显示。通过使用F10键“包含详细消息”或“排除详细消息”,可以在该显示上打开/关闭基本作业日志消息。
总而言之,你非常接近。如果这是您第一次尝试使用DSPF,那一点都不错。