Menu kezelés C-ben

Rancz Lajos csiga at fosch.com
Fri Sep 21 16:42:25 CEST 2007


Helló!

Értem. Ebben az esetben, megkülönböztetnék kétfajta menüt. Az egyik menü 
olyan, ami nem ismétlődik, a másik meg igen, és a struktúrában van 
tárolva, hogy hányszor. Tehát a menü függvény eldönti egy definiált 
konstans szerint, hogy az most szimpla vagy multi menü-e és annak 
megfelelően használja. Pl:
tyepdef struct
{
    char* name;
    void (*funptr)();
} SimpleMenu;

typedef struct
{
    char* name;
    char count;
    void (*funptr)(int);  <= itt adod át, hogy hanyadik, ezt a 
multimenut feldolgozó fv. teszi bele. Pl. lesz egy Alarmot bekero fv. 
ed, ami megkapja az Alarm számát a doMenu fv. től
} SimpleMenu;

typedef struct
{
    char type;
    union
    {
       SimpeMenu    smenu;
       MultiMenu      mmenu;
    }
} MenuElement;

Ekkor van egy tömb:
MenuElement menu[] = {......};

a függvény pedig:
int doMenu(MenuElement *mptr)
{
    // Mondjuk  do-while cikusban
    do
    {
        // Szimpla menu
        if (mptr->type = SIMPLE)
        {
        ....
        }
        // Ismétlődős menu
        else
        {
        ....
        }
    } while (exit == 0);
}

A másik, hogy az adatok tárolását és a menü felépítését nem tudod egy 
helyen megoldani, tehát (ha jól értem) az alábbi nem fog menni.

> > struct MENUITEM
> > {
> >            int iString;
> >            int *PtrMem;
> >            char iNumber;
> >            union{
> >              struct{
> >                      char Setting;
> >                      char DecimalPoint;
> >                      char Valid;
> >                        };
> >                       void *Fn(void); 
> >                      };
> > };

hg12345 írta:
> Hi!
>
> Adott egy MENU részlet ami ismétlödik
>
> ALARM:
>   ALARM1
>   ALARM2
>   ..........
>   ALARM16
>  
>   ALARM*:
>         CONFIG
>         SETPOINT
>         HYSTEREZIS              <<< erre hivatkozom....
>         TIME
>
> Az minden ALARM menünek egy közös almenüje van.
> A memória hozzáférését egyszerüen leirható pl.:
>
>   ALARM +  n*SIZEOF(ALARM) + (&HYSTEREZIS-&CONFIG)
>
> A memórában igy van elhelyezve. Amikor kezdem feldolgozni a fa ágait, 
> a menüleírás alapján, kikapom az ALARM abszolút címét ehhez 
> hozzáadom hányadik ALARM-t használom (ezt a menü leírás 
> tartalmazza) majd hozzá adom a fa melyik levelén vagyok ez szintén 
> egy relativ cim. Az összeadás végén kapok egy abszolút címet ami 
> alapján a beolvashatom a X. alarm hiszterézis értékét.
> Minden MENÜ bejegyzéshez tartozik egy memória, de ha minden MENÜ 
> bejegyzéshez egyedi saját leírót használnék akkor 
> pl.:  3000 * 8 byte = 24Kbyte lenne leirás ami még nem tartalmazná az 
> öröklödést.
> a készülékeinkben ez funkciók azonossága miatt, kb 1/10 1/20 
> csökkenthet&#337;, de a 1/10 esetén is csak 2.4K, mivel a bejegyzések 
> azonos öröklödési programokat hívnak, ez is kisebb de minimum 
> ugyanakkora területet foglal, mint nem ilyen megoldású.
>
> A maradék helyen 21K elfér a készülék teljes programja...... :-()
>
> Remélem igy érhetöbb vagyok.  Ha megnézed ennek a készüléknek a 
> MENÜ leírását, talán érthetöbbi válik a dolog. (Az egész 38K-ban elfér 
> tokkal vonóval)
> http://meter.hu/adatlap/szabalyozo/pdf/96du_h.pdf
> 7-8 oldal...



More information about the Elektro mailing list