Ermittelt Pointeradditionen, bei denen der zu addierende Wert nicht zur Basisdatengröße des Pointers passt. Nur Literale der Basisgröße dürfen addiert werden. Es dürfen auch keine Multiplikationen der Basisgröße addiert werden.
Begründung: In CODESYS (im Gegensatz zu C und C++) wird bei einer Addition eines Pointers mit einem Integerwert nur dieser Integerwert als Anzahl der Bytes addiert, und nicht der Integerwert mit der Basisgröße multipliziert. Zum Beispiel in ST:
pINT := ADR(array_of_int[0]) pINT := pINT + 2 ; // in CODESYS zeigt pINT anschließend auf array_of_int[1]
Dieser Code würde in C anders funktionieren:
short* pShort pShort = &(array_of_short[0]) pShort = pShort + 2; // in C zeigt pShort anschließend auf array_of_short[2]
Daher sollte man in CODESYS immer ein Vielfaches der Basisgröße des Pointers zu einem Pointer addieren. Ansonsten zeigt der Pointer möglicherweise auf einen nicht-alignten Speicher was (je nach Prozessor) beim Zugriff zu einer Alignment Exception führen kann.
Wichtigkeit: Hoch
Beispiel
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); // SA0065 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: Pointeraddition passt nicht zur Basisgröße