在输入时切换多种显示记录格式

时间:2018-05-03 14:06:21

标签: c ibm-midrange rpgle

我最近发现了像ILE C源这样的东西,用于通过多记录显示文件读取和写入物理文件,所以我自己创建了一个。

输入来源为herehere

所以,有可能用RPG和某些指标来做。

看起来像:

C                   Exfmt     Screen
C                   If        *In25 = *Off
C                     ...enter key pressed
C                   Else
C                     ...function key pressed
C                   EndIf

我们在哪里

d  Cmd_Enter      c                   Const(x'F1')

Source

然而,当我尝试使用C编译完全相同的事情时失败。

以下是样本的一部分:

#define ENTER   0xF1; 

...

_SYSindara indicator_area;
do
{ 
    if(somevar != NULL)
    {

    indicator_area[ENTER] == IND_OFF;

    //do stuff

    if (indicator_area[EXIT] == IND_ON)
    {
        break;
     }
}
while(indicator_area[ENTER] != IND_ON); 

错误我在包含ENTER的每一行:

MYLIB/PGMSRC(SRC), 113.27: CZM0275(30) Unexpected text ';' encountered.

我已尝试将ENTER定义为0xD(输入ASCII代码),0xF124(* in25,如上所述) - 没有任何帮助让这段代码起作用。

欢迎任何提示。

2 个答案:

答案 0 :(得分:3)

在我看来,您的困惑在于您尝试使用AID字节x'F1'的ENTER值来索引您使用

定义的indicator_area
_SYSindara indicator_area;

这不起作用,因为_SYSindara被定义为char[99]。您可以从显示文件中检索指示符区域,但是您不会看到位于显示文件I / O反馈区域中的AID字节。这是使用

检索的
#include <xxfdbk.h>

_XXIOFB_T *iofb;          /* Pointer to the file's feedback area */
_XXIOFB_DSP_ICF_T *dspfb; /* Pointer to display file specific feedback area */

iofb = _Riofbk ( fp );
dspfb = iofb + iofb->file_dep_fb_offset;

if (dspfb->AID_byte_indic == ENTER) {
  // do something
}

您可以在IBM Knowledge Center for IBM i中找到更多信息herehere。在QSYSINC/H(XXFDBK.C)上的IBM i

答案 1 :(得分:1)

从#define中删除分号,如下所示:

#define ENTER   0xF1

C语法的一个怪癖是编译器定义不应该有一个结束分号(除非你需要它用于多语句定义,但这超出了对这个问题的需要)。 / p>

更长的解释: 在编译之前,编译器定义(#define)实际上是源代码中的简单文本替换。在以下行中发生了什么

indicator_area[ENTER] = IND_OFF;

是它被替换为     indicator_area [0xF1;] = IND_OFF; 这是一个语法错误。对于编译器定义,分号不是常规C语句的特殊结束语句字符。如果您需要执行多行编译器定义(您可能不会这样做),则应该转义新行以执行此操作。例如:

#define MY_LONG_DEFINE This is a test \
     This is only a test.  If this had \
     been longer, more lines would be \
     escaped.

我还应该注意到@Gerhardh是正确的,因为你不应该使用双等于赋值。我已经在上面的例子中纠正了它。