2016-09-07 8 views
0

У меня есть файл для отображения меню. Я успешно сделал рабочую программу CL, которая отображает меню и ждет ввода. Просто, все, что он делает, отображает файл и ждет, пока пользователь нажмет F1, чтобы выйти.as400: что такое C-эквивалент SNDRCVF

Показать файл (приближение): команда

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)

Что является эквивалентом SNDRCVF в C?

Вот что я пришел с этого момента. Он компилируется отлично, но когда я его называю, он ничего не делает.

#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; 
}   

Команда Compile: crtbndc pgm(test) srcfile(test) srcmbr(main) output(*print)

Тогда звоните: call test

Что я делаю неправильно?

+0

Можете ли вы изменить свой вопрос, чтобы включить (1) DDS для файла DISPLAY и (2) команды создания файла и программы? Нам нужно знать атрибуты DSPF, а также параметры создания для всех объектов. Кроме того, появляется ли в вашем журнале задание сообщений об ошибках при вызове программы? – user2338816

+0

@ user2338816 Я добавил то, что вы просили. По заданию, вы имеете в виду файлы спула? –

ответ

2

Я внес несколько незначительных изменений. Во-первых, для определения типов, я использовал это:

// Shortcuts to the generated structs. 
typedef MYLIB_CDSPMNU_DISPLAY_both_t input_t; 
typedef MYLIB_CDSPMNU_DISPLAY_both_t output_t; 

Поскольку вы указали «как», имя ссылки идентификатор должен «как», а не «я» или «о». Непонятно, как вы могли успешно скомпилировать, как вы это делали. Возможно, у вас была более ранняя успешная компиляция, так что ваша команда CALL работала, но скомпилированная программа не была текущей версией.

Затем я открыл файл с этим режимом:

// The file opens fine. 
    dspf = _Ropen("mylib/cdspmnu", "rr+"); 

Вы были "" WR, так что он был открыт только для выхода ("сог" iting). Это необходимо для ввода и вывода. В вашем рабочем журнале должно быть указано C2M3005 «Файл не открыт для операций чтения». после того, как вы НАЗЫВАете свою программу (в зависимости от того, какая скомпилированная версия вы на самом деле вызываете).

И я изменил вашу функцию _Rformat():

// I tell which record format to use. 
    _Rformat(dspf, "DISPLAY"); 

С ИЛЬ C/C++ Runtime Library Функции руководства, определение _Rformat() говорит:

Параметр FMT является строкой C с нулевым концом. Параметр fmt должен содержать в верхнем регистре.

Имя формата не складывается в верхний регистр, так как имена файлов и библиотек находятся в других местах. Не знаю, почему нет; это так, как есть. Лично я использовал бы верхний регистр везде, где он на самом деле означает имя в верхнем регистре, не полагаясь на компилятор; поэтому я также изменил бы пару других мест в коде.

Технически я также сменил источник DSPF на ссылку F3, а не клавишу F1, которую вы показываете в своем DDS. Клавиша F1 обычно будет для функций «помощи», а F3 - стандартом для «Выход». Это не имеет большого значения, но это одна из привычек начинать. И имя или два были изменены, чтобы соответствовать моей среде.

Не требуется буферизованных файлов. Самый простой способ просмотра «joblog» вашей работы после команды CALL - запустить команду DSPJOBLOG. Возможно, лучше, однако, использовать базовый дисплей ввода команд, предоставляемый CALL QCMD. Базовые сообщения о заданиях могут быть включены или отключены на этом дисплее с помощью клавиши F10 для «Включить подробные сообщения» или «Исключить подробные сообщения».

В целом, вы были довольно близки. Неплохо, если это была ваша первая попытка работать с DSPF.

Смежные вопросы