Pavel Pelán Programování Mosaic 12. 6. 2024 11:07 15. 5. 2021 20:08

Dobrý den,

lze nějakým způsobem pomocí funkce GetVarNameByAdr získat jméno prvku struktury, zde např. 'testStruct.testReal' ?  
Něco ve smyslu:  g_varIntName := GetVarNameByAdr( varAdr := void(testStruct.testReal), varSize := sizeof(real)); 

Děkuji.

Odpovědi 4

M.B. 7. 5. 2021 17:42

Dobrý den,

funkce GetVarNameByAdr se většinou používá opačně, tedy ke zjištění jména instance. Funkce vrací plné jméno, takže jméno prvku lze z navráceného řetězce získat. Omezením je, že funkce pracuje pouze s bajtovými adresami, takže nejde použít na prvky typu BOOL.

V přiloženém souboru je funkce, která jméno prvku struktury vrací. Pro správnou funkci je nutné, aby prvek struktury byl označen direktivou {TRACK_ADR} a nebyl typu BOOL.

Pro správnou funkci se prosím ujistěte, že máte poslední verzi prostředí 2021.1.2 Fix2 (v předchozí verze se negenerovala mapa pro {TRACK_ADR} správně)

M.B. 9. 5. 2021 19:12

Příklad v předchozí reakci obsahuje chybu. V cyklu chybí dekrementace délky řetězce, takže by funkce končila chybou, pokud by vstupem byla jednoduchá proměnná, jejíž jméno by neobsahovalo znak tečka.

V přiloženém souboru je opravená funkce.

Tom 13. 5. 2021 12:09

Dobrý den. V poslední verzi Mosaicu 2021.1 Fix 2 mi funkce stále nefuguje.  Vrací prázdný řetězec.

I.L. 15. 5. 2021 20:08

Všiml jsem si anomálie, která by s tím mohla souviset:

Když má struktura g jen jednu položku m1, vrací GetVarNameByAdr() jenom "g" namísto "g.m1". (Možná důsledek rovnosti sizeof(g.m1)=sizeof(g) ?)

Jakmile do struktury přidáme další položku m2, už vrací "g.m1".

Viz přiložený kód.

Tento dotaz je vyřešený.