as400:什么是SNDRCVF的C等价物

时间:2016-09-07 19:57:30

标签: c ibm-midrange

我有一个菜单的显示文件。我成功地制作了一个有效的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

我做错了什么?

1 个答案:

答案 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,那一点都不错。