0

質問:

長さ x のテキストを取り、容量 n の変数に格納する MOVEL 関数を使用して、RPG のテキストから部分文字列 n 文字を取得するのは保存されますか?

または、最初の n 文字を取得するための唯一の保存方法は、SUBST を使用することですか?

質問の背景は、長さが 30 文字のデータベースから最初の 3 文字を取得している同僚の 1 人で、MOVEL を使用して長さが 3 文字しかない変数 (残りの部分を切り捨てるなど) です。奇妙なことに、受信変数がマイナス文字 ('-') を表示する場合と表示しない場合があります。したがって、MOVEL の使用は安全な方法ではないと思います。私は常に「\ 0」で終わるCの文字列のように考えています。=演算子を使用して割り当てるのではなく、strcpy関数を使用してコピーを保存する必要があります。

この問題に精通しているRPGを知っている人はいますか?

4

2 に答える 2

3

MOVEL が動作するはずです。RPG では、いくつかの文字データ型を使用できます。MOVEL は古い手法であり、NULL で終了する文字列は新しいデータ型であるため、MOVEL を使用する人は、NULL で終了する文字列を扱うことはありません。MOVEx操作文字列操作については、RPG マニュアルを参照してください。より良い回答を得るには、関連する変数の定義を含めてコードを投稿してください。

EDIT : MOVEL が標識を処理する方法の例。

   dcl-s long char(20) inz('CORPORATION');
   dcl-s short char(3) inz('COR');
   dcl-s numb packed(3: 0);

   // 369
 c                   movel     long          numb
   dsply numb;

   // -369
 c                   movel     short         numb
   dsply numb;


   *inlr = *on;
于 2012-08-07T13:33:16.167 に答える
1

RPG の符号付き数値フィールドでは、符号はフィールドの最後のバイトのゾーンに保持されます。したがって、123 は X'F1F2F3' ですが、-123 は X'F1F2D3' です。これらのフィールドを文字列として見ると、123 と 12L が含まれています。

あなたのプログラムでは、「123 AAAAAL」のようなものを 3 桁の数値フィールドに転送しているため、X'F1F2F3' が得られますが、最後の文字が X'D3' であるため、結果が D ie X'F1F2D3' のゾーンを持つように変更されます。あなたの異常は、30 番目の文字の内容に依存します。} または大文字の J から R の場合は、否定的な結果が得られます。[最初の 3 文字が数字であるか文字であるかは関係ありません。この例で重要なのは、バイトの後半部分である数字だけだからです。]

IBM のマニュアルによると、演算項目 2 が文字で、結果フィールドが数値の場合、演算項目 2 の右端からのゾーンが 16 進数の D (マイナス ゾーン) である場合、マイナス ゾーンは結果フィールドの右端に移動します。ただし、演​​算項目 2 の右端からのゾーンが 16 進数の D でない場合は、正のゾーンが結果フィールドの右端に移動されます。その他の結果フィールドの位置には、数字のみが含まれます。

ドン

于 2015-02-06T02:00:13.420 に答える