備忘録:PL/I関連

implicitly declared

未定義変数だったので暗黙定義された --> 変数名定義漏れ、打ち間違いなど・・・RULES(NOLAXDCL)がデフォルトなので変数は全て定義が必要。

コンパイラーのエラー・メッセージ

PL/Iコンパイラーのメッセージは、内容についてはあまり当てにならない。ただし、LINE、FILEやSTMTの番号は正しいので、とにかくそこにエラーがあることは確実。DO△LOOP;と書くべきとこをDO△AOOP;と書いたのに、AOOPではなく「;」がおかしいと言っていたりする。

ON ERROR JOTO EOFPROCと、GOTOをJOTOと誤記したのにEOFPROCがおかしいと言ったりもする。

LINE、FILEを見ればソースの何行目でエラーが検出されたかがわかる。その行もしくはそこから数行(;迄)もしくは直前などに入力間違いがないかを見る。直前行に;が無い場合は、それを警告メッセージで示すことも多い。

BY NAME

BY NAMEを使うなら、入力側と出力側のそれぞれの変数名が本当に同じになっているかを見直す。コンピューターはうそを付かないから名前が同じならOUTPUTがおかしくなることはない。

ISPFエディターはNUMモードにしておく

そうしておけば画面サイズの横幅132桁でもエディター・パネルには1~72カラム迄しか出ないので、DELキーを押しても73桁目以降が前へずれることはない。

空ELSE

ELSEは省略できるが、不要でも空ELSEを書く方がベター。空ELSEが無いと、書き忘れたのか必要ないのかがわからない(他人のデバッグ)が、空ELSEが明示されているとはっきりできる(いずれは他の人がデバッグするのだから、他人がデバッグし易いコードを書く)。THENでそれなりの量の処理をやっているような場合は、書いておく方がよいか・・・

ON ENDPAGE(DDNAME)

BEGINでなくDOで囲むとON条件になっていなくても最初に1回実行されてしまうので注意!

ISPFエディター

EPDF dsname(member) MIXED NO HILITEコマンドを使うならMIXモードをOFFにする。
EPDF SYSOUT(Jnnnnn) MIXED NO コンパイル・リストのPL/Iソースをエディターで表示すればHILITE表示できる。

HILITE PLI;HILITE PAREN PL/I用の強調表示を行い、対になっている括弧記号も高輝度表示する。

コーディング

  • PROCと対になるENDのプログラム名は省略可
  • 2~72カラムに書く
  • /* ~ */がコメント
  • ステートメントは;で終わる
  • CHAR(n)   バイト(文字)
  • FIXED DEC(n)   パック10進
  • FIXED BIN(15)   ハーフワードBinary(64K以下)
  • FIXED BIN(31)   フルワードBinary(21億以下)
  • PIC ‘ZZ,ZZ9’
  • PIC ‘\\,\\9’
  • PIC ’99V.999’  99V/99なら1/23のように出る、Vが小数点位置.や/が表示文字
  • 領域名が不要なら名前の代わりに*を書ける。DCL 3 * CHAR(4) INIT(‘ ‘),  無意味な変数名を並べなくてよい。
  • PUT EDIT   SYSPRINTへメッセージ出力
  • GET EDIT   SYSINからカード入力
  • DCL
          1 DT.
            3 YY ,  DT.YYで参照できる
  • DOとENDが対になっていないと永久ループに入ることがある。PROCに対するENDが、ENDが漏れたDOのENDと見なされコンパイルエラーになるが、それを無視すると走ってしまう。

    PROC MAINでなくサブルーチンを作り、それをJCLで直接実行するとABENDS0C4となる。( 頭でいきなりS0C4-04)

    あるレコードで処理を止めたい時、IF~GOTOでループから抜けるのではなく、IF~SIGNALでEOFを通知するような作り方が好まれる。IF~THEN READ ELSE SIGNAL

    複数ファイルを処理する時、どちらが先にEOFになるかは予測できない。

    IBM0121S、IBM0122S

    WRITE FILE。出力領域の長さとDCB上のLRECLがアンマッチだとU4038で落ちる。SYSOUTの場合、DCBを定義しない方がいい。3390の場合はVB/255/28998になる。

    IBM0482S FIXED OVERFLOW

    2進整数の演算結果の答えが長すぎる。

  • 答えを格納する器が小さすぎる
  • 除数が短すぎる、乗数が長すぎる
  • 被除数が長すぎる(商が大きすぎる)
  • 被乗数が長すぎる(積が大きすぎる)
  • IBM1352I、IBM1373I等

    PUT EDITの形式リストで桁数を省略する(A,F,A)と、コンパイル時にSYNTAXエラーになってしまうことがある。A(4),F(5),A(5)のように長さを明示する。

    IBM1660I

    いろいろ調べたが、FILE定義のENV RECSIZEではLRECLを出力領域のストラクチャーの長さで指定する方法がわからなかった。好みではないがとりあえず即値で書く。ストラクチャーの長さと矛盾してもコンパイルエラーになるので実行前に合わせられるか・・・

    MAXMSG

    MAXMSG(E,1)オプションを追加すると、エラーが1つでも見つかればコンパイルが止まるので、コンパイル・リストの見方に慣れてないうちは、沢山のエラーに悩まされずに済む。

    テーブル作成

    コンパイル・オプション

  • A,S,STMT,X,AG,NEST
  • GNを追加(実行までするなら)
  • GNが無くてもLISTオプションを付けておけばCEEDUMPとASMリストからエラーSTMTは特定できる
  • その他いろいろ