Прототип в свободном формате с уже определенными переменными?

У меня есть программа RPGLE, которую я пытаюсь преобразовать из фиксированного формата в свободный формат. В общем, я знаю, что определение переменных ввода выполняется с использованием прототипов, например:

dcl-pr myprogram;
  I#Entry1 char(5);
end-pr;
dcl-pi myprogram;
  InEntry1 char(5);
end-pi;

Но чего я не знаю, так это того, как это сделать, когда поле уже определено. У нас есть стандартный файл определений, который мы копируем в программы, такие как та, которую я пишу, в которой поле, которое я использую в качестве переменной ввода, уже определено и скопировано. В фиксированном формате это просто

C     *Entry        PList
C                   Parm                    InEntry1

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

На всякий случай я пытаюсь ввести две переменные: структуру данных и зонированное десятичное число.

Как я могу использовать переменную, которая уже определена как входная переменная в RPGLE свободного формата, будь то с использованием прототипов или каким-то другим способом, о котором я не знаю?


person TheLittlePeace    schedule 24.08.2020    source источник


Ответы (2)


Правильным способом решения этой проблемы было бы создание новой версии файла стандартных определений (StdDefs==>StdDefs2) для объявления переменных под новым именем (возможно, с суффиксом _t) и ключевым словом TEMPLATE.

Затем в вашем рефакторинге PR/PI вы используете LIKE или LIKEDS.

поэтому ваша исходная программа выглядит примерно так

 /copy StdDefs
C     *Entry        PList
C                   Parm                    InEntry1

Ваш рефакторинг с PR/PI выглядит так

 /copy StdDefs2
 /copy Mypr
  dcl-pi myprogram;
    InEntry1 like(inEntry_t);
  end-pi;

Обратите внимание, что лучше всего иметь PR в отдельном элементе, который /COPY'd и в вызывающем, и в вызываемом.

person Charles    schedule 25.08.2020
comment
Хотя это и хороший совет, на данный момент это нереально. Многие другие программы используют стандартное определение этих переменных, и изменение их всех заняло бы очень и очень много времени. Вот почему я надеялся найти способ использовать предопределенную переменную вместо использования LIKE или LIKEDS. - person TheLittlePeace; 26.08.2020
comment
@TheLittlePeace, поэтому я предложил новую версию StdDefs2 текущего включаемого файла StdDefs. Меняйте программы по мере необходимости. Изменили ответ, чтобы сделать эту идею более ясной. - person Charles; 26.08.2020
comment
А, это имеет больше смысла. Извините, я слишком быстро прочитал! Спасибо. Итак, можете ли вы подтвердить, что нет никакого способа фактически использовать предопределенную переменную в PI? - person TheLittlePeace; 26.08.2020
comment
Правильно, PI всегда определяет локальную переменную. Хотя в данном случае это на самом деле глобально. Я могу придумать один метод, который мог бы сработать... хотя, вероятно, будет намного больше работы... позвольте мне попробовать... - person Charles; 26.08.2020
comment
Я подумал, что если вы измените свою программу с цикла-основной на линейную-основную, вы сможете сделать свои переменные файла копии глобальными, а ваши параметры PI с тем же именем будут локальными. У меня не было возможности попробовать, я обновлю свой ответ, если у меня будет возможность попробовать. Но, вероятно, вызовет больше работы в реальности. - person Charles; 27.08.2020

Не удалось найти решение без объявления другой переменной с like. И присвоить новую переменную старой в начале программы, и наоборот в конце.

person Dam    schedule 24.08.2020
comment
Меня не очень беспокоит объявление одной и той же переменной дважды. Я хочу знать, как использовать предварительно объявленную переменную в качестве входных данных в DCL-PI. Или вы говорите, что я могу сделать это в DCL-PI, и это будет работать правильно? - person TheLittlePeace; 24.08.2020
comment
Я слишком быстро прочитал вопрос, извините. Я столкнулся с той же проблемой и не смог найти решение без объявления другой переменной с помощью like. И присвоить новую переменную старой в начале программы, и наоборот в конце... - person Dam; 24.08.2020
comment
Вот чего я боялся ... Не могли бы вы отредактировать свой ответ, чтобы отразить это? Затем, если не появятся другие ответы, подтверждающие это, я могу пометить его как отвеченный. - person TheLittlePeace; 24.08.2020
comment
Сделанный. Посмотрим, сможет ли кто-нибудь найти другое решение - person Dam; 26.08.2020