Dobrý den,
měl bych dotaz ohledně funkce SIZEOF. V programu mám definováno:
VAR_GLOBAL CONSTANT
ciMAX_INDEX_EVENT : int := 9;
END_VAR
TYPE T_EVENT_ARRAY:
STRUCT
aPole : array[0..ciMAX_INDEX_EVENT] of string[16];
END_STRUCT
END_TYPE
VAR_GLOBAL
aEvent : T_EVENT_ARRAY;
END_VAR
A v programu pak mám tento kód:
Memcpy(length := SIZEOF(aEvent.aPole[iIndexMenu]), source := void(aEvent.aPole[iIndexMenu]), dest := void(sText1));
Memcpy(length := SIZEOF(aEvent.aPole[iIndexMenu+1]), source := void(aEvent.aPole[iIndexMenu+1]), dest := void(sText2));
zjistil jsem, že SIZEOF vrací hodnotu celé struktury (170( a ne jednoho prvku (17), tak jak je to běžné v např. C.
Protože nějak neumím dohledat popis funkce SIZEOF, tak prosím o přesnou definici Vašeho pojetí této funkce.
Děkuji
Jan Kamrad
Odpovědi 1
Dobrý den,
pokud se dotazujete pomocí funkce SIZE_OF() na velikost prvku pole, tak by funkce měla vrátit velikost tohoto prvku, což funguje, když zadáte index prvku číslem. Bohužel, když ho zadáte takto přes proměnnou, tak se velikost spočítá špatně a funkce vrátí velikost celého pole. To musíme opravit.
Aby program fungoval i teď, tak bych si nadefinoval typ pro řetězec délky 16 znaků, např. ShortString a v dotazu na velikost prvku pole bych zavolal funkci SIZEOF(ShortString). Tak jako tak v poli jsou všechny prvky stejně velké. Kdyby se měnila délka textů, tak by stačilo upravit délku řetězce v deklaraci tohoto datového typu. Zároveň bych zrušil deklaraci struktury, která obsahuje pouze jeden prvek typu pole, tím se ten zápis také zjednoduší. Ve zdrojovém kódu by to tedy mohlo vypadat následovně:
VAR_GLOBAL CONSTANT
ciMAX_INDEX_EVENT : int := 9;
END_VAR
TYPE
ShortString : STRING[16];
T_EVENT_ARRAY : ARRAY [0..ciMAX_INDEX_EVENT] OF ShortString;
END_TYPE
VAR_GLOBAL
aEvent : T_EVENT_ARRAY;
END_VAR
PROGRAM prgDvaTexty
VAR
iIndexMenu : USINT;
sText1 : STRING;
sText2 : STRING;
VelikostText1 : UINT;
VelikostText2 : UINT;
END_VAR
(*....*)
VelikostText1 := Memcpy(length := SIZEOF(ShortString), source := void(aEvent[iIndexMenu]), dest := void(sText1));
VelikostText2 := Memcpy(length := SIZEOF(ShortString), source := void(aEvent[iIndexMenu+1]), dest := void(sText2));
(*....*)
END_PROGRAM
Vaše odpověď
Pro vložení odpovědi je nezbytné být přihlášený. Pokračujte na přihlášení.