Eklenecek değerin işaretçinin temel boyutuyla eşleşmediği işaretçi eklemelerini algılar. Yalnızca temel boyuttaki değişmezler eklenebilir. Ayrıca temel boyutun çarpım ürünleri eklenemez.
Gerekçe: CODESYS adresinde (C ve C++'ın aksine), tamsayı değerine sahip bir işaretçi eklenirken, tamsayı değerinin taban boyutuyla çarpımı değil, yalnızca bu tamsayı değeri bayt sayısı olarak eklenir. ST'deki örnek:
pINT := ADR(array_of_int[0]) pINT := pINT + 2 ; // In CODESYS, pINT then points to array_of_int[1]
Bu kod C'de farklı şekilde çalışacaktır:
short* pShort pShort = &(array_of_short[0]) pShort = pShort + 2; // In C, pShort then points to array_of_short[2]
Bu nedenle, CODESYS adresinde, bir işaretçiye her zaman işaretçinin temel boyutunun bir katını eklemeniz gerekir. Aksi takdirde, işaretçi hizalanmamış belleği işaret edebilir ve bu da (işlemciye bağlı olarak) belleğe erişirken bir hizalama istisnasına yol açabilir.
Önemliymiş: Yüksek
Örnek
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: Incorrect pointer addition to base size
Ayrıca bakınız