JohanKa Programování Mosaic 11. 2. 2025 14:14 17. 2. 2025 17:07

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

Luboš Urban 17. 2. 2025 17:07

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í.