as400:SNDRCVF的C等价物是什么

as400:SNDRCVF的C等价物是什么,c,ibm-midrange,C,Ibm Midrange,我有一个菜单的显示文件。我成功地制作了一个工作CL程序,它显示菜单并等待输入。简单地说,它所做的只是显示文件并等待用户按F1键退出 显示文件(近似值): 创建命令:crtdspf文件(显示)srcfile(测试)srcmbr(显示) CL计划: PGM DCLF FILE(DISPLAY) RCDFMT(DISPLAY) LOOP: SNDRCVF IF COND(&IN01 *EQ '1') THEN(DO) GOTO END ENDDO

我有一个菜单的显示文件。我成功地制作了一个工作CL程序,它显示菜单并等待输入。简单地说,它所做的只是显示文件并等待用户按F1键退出

显示文件(近似值):

创建命令:
crtdspf文件(显示)srcfile(测试)srcmbr(显示)

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(测试)srcfile(测试)srcmbr(clsrc)输出(*打印)

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;
}        
#包括
#包括
//包括我的显示文件。
#pragma mapinc(“显示”、“lib/display(显示)”、“两者”和“)
#包括“显示”
//生成的结构的快捷方式。
类型定义库显示显示输入;
类型定义库显示输出;
int main(int argc,char*argv[]){
输入输入;
输出输出;
_RFILE*dspf;
//文件可以正常打开。
dspf=_Ropen(“lib/display”、“wr”);
如果(dspf==NULL){
printf(“错误:显示文件打开失败。\n”);
返回0;
}
//我告诉你使用哪种记录格式。
_格式(dspf,“显示”);
//写入要显示的文件?
_Rwrite(dspf,”,0);
//等待输入。
_Rreadn(dspf和输入,sizeof(输入),DFT);
//关闭它并退出。
_Rclose(dspf);
返回0;
}        
编译命令:
crtbndc pgm(测试)srcfile(测试)srcmbr(主)输出(*打印)

然后调用:
calltest


我做错了什么?

我做了一些小改动。首先,对于您的typedef,我使用了以下内容:

// Shortcuts to the generated structs.
typedef MYLIB_CDSPMNU_DISPLAY_both_t input_t;
typedef MYLIB_CDSPMNU_DISPLAY_both_t output_t;
因为您指定了“两者”,所以引用的标识符名称应该具有“两者”,而不是“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参数是以null结尾的C字符串。必须输入fmt参数 请用大写字母

格式名称不会像文件和库名称一样折叠为大写,而是放在其他位置。不知道为什么不;事情就是这样。就我个人而言,我会在任何实际表示大写名称的地方使用大写字母,而不依赖于编译器;所以我还要修改代码中的其他几个地方

从技术上讲,我还将DSPF源更改为引用F3键,而不是DDS中显示的F1键。F1键通常用于“帮助”功能,而F3键是“退出”的标准键。这并不重要,但这是一个开始的习惯。为了适应我的环境,我改变了一两个名字

不需要假脱机文件。调用命令后查看作业“joblog”的最简单方法是运行DSPJOBLOG命令。不过,也许更好的方法是使用callqcmd提供的基本命令条目显示。通过使用F10键“包含详细信息”或“排除详细信息”,可以在该显示屏上打开/关闭基本作业日志信息


总而言之,你很接近。如果这是您第一次尝试使用DSPF,那么这一点也不错。

我做了一些小改动。首先,对于您的typedef,我使用了以下内容:

// Shortcuts to the generated structs.
typedef MYLIB_CDSPMNU_DISPLAY_both_t input_t;
typedef MYLIB_CDSPMNU_DISPLAY_both_t output_t;
因为您指定了“两者”,所以引用的标识符名称应该具有“两者”,而不是“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参数是以null结尾的C字符串。必须输入fmt参数 请用大写字母

格式名称不会像文件和库名称一样折叠为大写,而是放在其他位置。不知道为什么不;事情就是这样。就我个人而言,我会在任何实际表示大写名称的地方使用大写字母,而不依赖于编译器;所以我还要修改代码中的其他几个地方

从技术上讲,我还将DSPF源更改为引用F3键,而不是DDS中显示的F1键。F1键通常用于“帮助”功能,而F3键是“退出”的标准键。这并不重要,但这是一个开始的习惯。为了适应我的环境,我改变了一两个名字

不需要假脱机文件。调用命令后查看作业“joblog”的最简单方法是运行DSPJOBLOG命令。不过,也许更好的方法是使用callqcmd提供的基本命令条目显示。通过使用F10键“包含详细信息”或“排除详细信息”,可以在该显示屏上打开/关闭基本作业日志信息


总而言之,你很接近。如果这是您第一次尝试使用DSPF,那还不错。

您可以编辑您的问题以包括(1)用于文件显示的DDS,以及(2)用于文件和程序的创建命令吗?我们需要知道DSPF属性以及所有对象的创建选项。另外,当您使用c时,您的作业日志是否显示任何错误消息