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でそれなりの量の処理をやっているような場合は、書いておく方がよいか・・・
1 2 3 4 5 6 7 8 9 10 11 |
IF|DO THEN DO; statement; statement; : statement; END; ELSE DO; END; もしくは ELSE; |
ON ENDPAGE(DDNAME)
1 2 3 4 |
BEGIN|DO; PUT ... PUT ... END; |
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用の強調表示を行い、対になっている括弧記号も高輝度表示する。
コーディング
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つでも見つかればコンパイルが止まるので、コンパイル・リストの見方に慣れてないうちは、沢山のエラーに悩まされずに済む。
テーブル作成
1 2 3 4 5 6 7 8 |
DCL TABLE_DATA CHAR(8) INIT('ABCDEFGH') ; DCL 1 TABLE(8) DEFINED TABLE_DATA , 3 CODE CHAR(1) , または DCL 1 CODE(8) CHAR(1) INIT('A','B','C','D','E','F','G','H') , |