tomasj Programování Mosaic 17. 6. 2021 9:25 16. 6. 2021 18:59

Dobrý den,

z jiných programovacích jazyků jsme zvyklý využívat výčtové typy. Kromě označení typu a použití v if / case testech využívám i jejich číselné hodnoty. Např. na indexaci v polích, na výpočty (např. algoritmus je ve 5. kroku z 20.). Bohužel tohoto se mi nedaří v Mosaicu nijak dosáhnout. Jakákoliv snaha o použití číselné hodnoty enumu selhává. Je toto nějak možné?

Dále se mi nedaří vytvořit pole enumů. Kompilátor hlásí - Není podporováno. Nicméně obalení enumu do struktury a následné vytvoření pole této struktury už lze. Jde to nějak i bez takového obalování?

Díky za odpověď.

Odpovědi 2

M.B. 2. 6. 2021 17:57

Dobrý den,

prozatím jsme požadavek na prosté pole enumerací nezaznamenali, takže jsme jeho implementaci hlouběji neřešili. Nejsem momentálně schopen říct, jak bude složité implementaci doplnit a tak nemohu slíbit zda v blízké době bude tento typ dostupný. Obejití přes pole struktur je možné.

Co se týká použítí enumerace jako číselné hodnoty, v naší implementaci je enumerace uložena jako typ USINT a jednotlivé položky jsou přiřazovány vzestupně od nuly. Pokud je potřeba přistoupit na hodnotu enumerace je možné použít ukazatel na pointer. Viz příklad níže:

TYPE
  enumerace : (one1, two2, three3, four4);
END_TYPE

PROGRAM prgTest
  VAR
    e : enumerace;
    p : PTR_TO USINT;
    pole : ARRAY [0..4] OF REAL;
    res : REAL;
  END_VAR

  p := ADR(e);
  res := pole[p^];
END_PROGRAM

Hodnota jednotlivých položek enumerace a datový typ použitý pro uschování hodnoty je IEC normou definován jako implementačně závislý a tak kód, který se na hodnotu obrací, nemusí být přenositelný mezi systémy různých výrobců.

tomasj 16. 6. 2021 18:59

Díky za vysvětlení.

Tento dotaz je vyřešený.