SA0065:ポインタの追加がベースサイズと一致しません
追加される値がポインターの基本サイズと一致しないポインターの追加を検出します。基本データ サイズとその倍数のリテラルのみをエラーなく追加できます。
位置揃え: で CODESYS (C および C++ とは対照的に) 整数値を持つポインターを追加する場合、整数値に基本サイズを乗算したものではなく、この整数値のみがバイト数として追加されます。
例 76. STの例
pINT := ADR(array_of_int[0]); pINT := pINT + 2; //in CODESYS, pINT then points to array_of_int[1]
このコードは、Cでは異なる動作をします。
short* pShort pShort = &(array_of_short[0]) pShort = pShort + 2; //in C, pShort then points to array_of_short[2]
したがって、 CODESYSの場合は、常にポインターの基本サイズの倍数をポインターに加算する必要があります。それ以外の場合、ポインタは次を指す可能性があります。 揃っていない (プロセッサによっては) アクセス時にアライメント例外が発生する可能性があるメモリ。
重要性:高い
例 77. 例
VAR pudiTest:POINTER TO UDINT; udiTest:UDINT; prTest:POINTER TO REAL; rTest:REAL; END_VAR
pudiTest := ADR(udiTest) + 4; // OK pudiTest := ADR(udiTest) + ( 2 + 2 ); // OK pudiTest := ADR(udiTest) + SIZEOF(UDINT); // OK pudiTest := ADR(udiTest) + 3; // SA0065 pudiTest := ADR(udiTest) + 2*SIZEOF(UDINT); // OK pudiTest := ADR(udiTest) + ( 3 + 2 ); // SA0065 prTest := ADR(rTest); prTest := prTest + 4; // OK prTest := prTest + ( 2 + 2 ); // OK prTest := prTest + SIZEOF(REAL); // OK prTest := prTest + 1; // SA0065 prTest := prTest + 2; // SA0065 prTest := prTest + 3; // SA0065 prTest := prTest + ( SIZEOF(REAL) - 1 ); // SA0065 prTest := prTest + ( 1 + 4 ); // SA0065
での出力 メッセージ ビュー:
SA0065: 基本サイズへのポインタの追加が正しくありません