Új hozzászólás Aktív témák

  • Karma

    félisten

    válasz martonx #8118 üzenetére

    Azért az erős overkill :) Egy mikrokontroller nem fog XML-t parsolgatni :N

    Wyll:

    Van egy ötletem a tetszőleges mélységű fára: egy konstans char*[] és egy konstans int[] segítségével.

    I) A char*[]-ben felsorolod az összes lehetséges menüpont nevét, ezáltal mindegyiknek lesz egy egyedi azonosítója: az indexe a tömbben. Egy enummal még egyértelműbbé lehet tenni a dolgot.

    A példádból ez lesz (pszeudoC, most nincs kapacitásom fordítgatni):

    static const char*[] MenuTitles = { "MENU1", "MENU2", "MENU3", "SUBMENU1", "SUBMENU2", "SUBMENU3", "SUBSUBMENU1", "SUBSUBMENU2", "SUBSUBMENU3"};

    typedef enum {
    MENU1 = 0,
    MENU2,
    MENU3,
    SUBMENU1,
    SUBMENU2,
    SUBMENU3,
    SUBSUBMENU1,
    SUBSUBMENU2,
    SUBSUBMENU3,
    NONE = -1
    } menu_item;

    II) Az int[] trükkösebb, mert két logikai ugrás van benne.

    Először is, van az a stratégia, amivel egy tetszőleges fát bináris fában ábrázolsz. A szabály egyszerű: az új fában egy pont első gyereke bal oldalra, az első testvér pedig jobb oldalra kerül.

    Megrajzoltam a menüdet:

    A másik pedig az, hogy egy bináris fát egyértelműen tárolhatsz egy egydimenziós tömbben. Ez wikipédián le van írva, nem fordítanám át, inkább csak az eredményt mutatom:

    static const int[] MenuTree = { MENU1, SUBMENU1, MENU2, NONE, SUBMENU2, SUBMENU1, MENU3, NONE, NONE, SUBSUBMENU1, SUBMENU3, NONE, SUBMENU2, NONE, NONE, NONE, NONE, NONE, NONE, NONE, SUBSUBMENU2, SUBSUBMENU1}

    III) Ha írsz egy olyan függvényt, ami egy indexhez visszaadja a gyerekeit (csak jobbra kell menni, azaz az i-edik csúcshoz a 2i+2-ik csúcs kell while ciklussal, amíg ki nem mész a tömbből vagy NONE-ra nem futsz), bármilyen menüt felépíthetsz ezzel.

    Megj.) egy menüelem akár több helyen is előfordulhat, ahogy a példádban is volt, hiszen csak az indexet kell többször feltüntetni a fában :)

Új hozzászólás Aktív témák

Hirdetés