Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, コンパイラーおよびランタイム 移行ガイド

IBM1216: 間違った構造体宣言

同様に、次の宣言について見てみましょう。

   DCL
     1 S,
       2 A    CHAR(10),
       2 B,
         2 C  CHAR(3),
         2 D  CHAR(3);

従来のコンパイラーは、この宣言についてメッセージを出力しません。 しかし新しいコンパイラーは、次のメッセージを出力します。

  IBM1216I W  The structure member B is declared without any data
              attributes. A level number may be incorrect.

このメッセージは、宣言内の考えられるエラー、すなわち CD はレベル 2 ではなくレベル 3 で宣言されるべきであることを 示しています。しかし上記の宣言の場合、C と D は B と同じ構造 体レベルであるため、B はこれらの親ではなく、B にはデフォルト属 性の FLOAT が割り当てられます。 これは、ほぼ間違いなくユーザーの希望に反する処理であり、こ の新しいメッセージは、この発生する可能性の高い問題への注意を促しています。

コンパイラーは、以下のカスタマー・コードに対してもこのメッセージを出します。

          DCL PARDIASE CHAR (20);
          DCL 1 INDIASE1 BASED (PTPDIASE),
               2 C1CODIA CHAR      (1),
               2 C1FECDI DEC FIXED (9),
               2 C1DIADI CHAR (9),
               2 C1ABRDI CHAR (3),
               2 C1RESDI;
          DCL PTPDIASE POINTER;
          PTPDIASE = ADDR (PARDIASE);
          . . .
          INDIASE1 = '';

このメッセージは、変数 C1RESDI がデータ属性を指定せずに宣言されているという事実に対して フラグを立てるものです。 このため、FLOAT DEC(6) というデフォルト属性を取得することになり、構造体 INDIASE1 が 22 バイトを占めることを意味します。 しかし、この構造体は CHAR(20) フィールドのアドレスが割り当てられているポインター をベースにしているため、INDIASE1 = ’’; という代入は、他の変数が使用している 2 バイトのストレージ をブランクにしてしまいます。 カスタマーのコードでは、これによってライブラリー・ルーチン内で異常終了が発生することになります。 C1RESDI が CHAR(2) として宣言されているか、あるいは少なくとも CHAR(0) として宣言されていれば (しかも、CHAR(0) が PL/I で合法であれば)、問題は発生しません。

そのため、この章で説明している他の多くのメッセージと同様、このメッセージは E レベル・メッセージではありませんが、コードを変更して、コンパイルでこのメッセージ が出ないようにするのが最適な方法です。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)