Pavel Pelán SW Mosaic 12. 6. 2024 9:47 14. 1. 2021 14:41

Dobrý den,

u funkce Memcpy je v manuálu napsáno: 

POZOR ! Proměnné source a dest nesmí být typu BOOL ! Funkce Memcpy nebude fungovat správně, pokud je některý z parametrů source resp. dest typu BOOL.

Co to znamená, že nebude fungovat správně? Dojde pouze k vyčtení/přepsání následujících cizích registrů z důvodu přesahu bytu(což by mě nevadilo), nebo se BOOL vůbec, ani ve struktuře, nesmí použít?

Děkuji.
Pelán

Odpovědi 1

M.B. 14. 1. 2021 14:38

Dobrý den, pro funkci Memcpy je důležité, aby na vstupně výstupní proměnné byl typ, který není BOOL nebo pole BOOL. BOOL a pole BOOL mají totiž bitové reference místo bytových, jinými slovy jejich pointery jsou 8x větší. Struktury obsahující BOOLy nebo BOOLeovská pole se kopírují správně, vzhledem k tomu, že jsou vždy zarovnané na celé byty a ukazatele na ně jsou taktéž bytové.

Viz příklad níže: 


TYPE
  TS : STRUCT
    a : BOOL;
  END_STRUCT;
END_TYPE

PROGRAM prgMain
  VAR
    t1 : TS;
    t2 : BYTE;
  END_VAR

  //dobre
  Memcpy(length := sizeof(TS), source := void(t1), dest := void(t2));
  //spatne - zde se data vezmou ze spatne adresy
  Memcpy(length := sizeof(TS), source := void(t1.a), dest := void(t2));

END_PROGRAM

Tento dotaz je vyřešený.