Переключение между несколькими форматами отображения записи при нажатии - PullRequest
0 голосов
/ 03 мая 2018

Я недавно обнаружил отсутствие таких вещей, как источник ILE C, для чтения и записи физического файла через несколько записанных файлов дисплея, поэтому я пытался создать его самостоятельно.

Источники для ввода здесь и здесь

Итак, есть возможность сделать это с 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')

Источник

Однако, когда я пытаюсь сделать то же самое с Си, компиляция не удалась.

Вот часть образца:

#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), 0xF1, 24 (* in25, как в приведенном выше источнике) - ничто не помогает заставить этот код работать.

Любые советы приветствуются.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Мне кажется, что вы путаетесь в том, что вы пытаетесь использовать значение ENTER для байта AID x'F1' для индексации в indicator_area, который вы определили с помощью

_SYSindara indicator_area;

Это не будет работать, поскольку _SYSindara определяется как char[99]. Вы можете извлечь область индикатора из файла дисплея в нее, но вы не увидите байт 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 для IBM i. И в QSYSINC/H(XXFDBK.C) на вашем IBM i.

0 голосов
/ 03 мая 2018

Удалите точку с запятой из #define, как показано ниже:

#define ENTER   0xF1

Это одна из странностей синтаксиса C: у определений компилятора не должно быть конечной точки с запятой (если только вам это не нужно для определения с несколькими утверждениями, но это не нужно для этого вопроса).

Более длинное объяснение: Определения компилятора (#define) на самом деле являются простыми текстовыми заменами в исходном коде до компиляции. Что происходит в следующей строке

indicator_area[ENTER] = IND_OFF;

в том, что он подставляется как Indicator_area [0xF1;] = IND_OFF; которая является синтаксической ошибкой. Для определений компилятора точки с запятой не являются специальным символом конца оператора, как для обычных операторов Си. Если вам нужно сделать определение многострочного компилятора (что вам, вероятно, не нужно), вы должны экранировать новую строку, чтобы сделать это. Например:

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

Я также должен отметить, что @Gerhardh верен в том смысле, что вы не должны использовать двойное равенство для назначения. Я исправил это в примере выше.

...