Typy a datové struktury




...pro funkce převodu textového tvaru programu na binární a naopak:

...pro funkce pro provádění programu:

Prosté datové typy:



SYNOPSIS

typedef int (*rpnprocmkjcb_t)(int __mkjcb, rpnprocmkjval_t *, void *__userdata);

DESCRIPTION

Funkce je volána z funkce rpnproc_makejob() z důvodů, které rozlišuje argument __mkjcb. Jakých tento argument nabývá hodnot a co znamenají popisuje následující tabulka.

NázevVýznamPoužitý člen unionu rpnprocmkjval_t
RPNPROC_MKJCB_MEMJOB Žádost o paměť pro ukládání binární formy programu. .memjob
RPNPROC_MKJCB_LINE Žádost o řádku programu s aktuální instrukcí pro převod. .linet

RETURN VALUE

Možností, co vrátit, tato funkce nemá mnoho:



SYNOPSIS

typedef union
{
    struct
    {
        rpnprocjobp_t   jobp;
        int             size;
    } memjob;
    char                linet[RPNPROC_LINE_SIZE];
rpnprocmkjval_t;

DESCRIPTION

Jak bylo uvedeno v popisu callback funkce rpnprocmkjcb_t pro různé typy rozlišení žádosti vrstvy "RPNPROC" jsou použity různé členy tohoto unionu:



SYNOPSIS

typedef int (*rpnproclsjcb_t)(char __linetxt[], void *__userdata);

DESCRIPTION

Voláním této funkce vrstva "RPNPROC" předá uživatelskému programu jednu řádku programu v textovém tvaru (viz popis funkce rpnproc_listjob()).

RETURN VALUE

Návratové hodnoty jsou popsané zde.



SYNOPSIS

typedef struct
{
    int             radix;
    unsigned long   delim;
    rpnproclsjcb_t  fncp;
    void            *userdata;
rpnproclsjval_t;

DESCRIPTION

Struktura sdružuje argumenty společné funkcím rpnproc_listjob() a rpnproc_listone(). Argumenty mají následující významy:



SYNOPSIS

typedef int (*rpnprocexecb_t)(int __execb, rpnprocexeval_t *, void *__userdata);

DESCRIPTION

Funkce je volána z funkce rpnproc_execute() z důvodů, které rozlišuje argument __execb. Jakých tento argument nabývá hodnot a co znamenají popisuje následující tabulka. (Kromě prvních dvou se jedná o chybová hlášení).

NázevVýznam
RPNPROC_EXECB_TRACE Pro ladění: k volání callback funkce dojde před provedením každé instrukce (viz argument __tracef pro funkci rpnproc_execute()).
RPNPROC_EXECB_PSE Pause: nejčastěji k zobrazení mezivýsledků (viz instrukce PSE).
RPNPROC_EXECB_DIVBY0 Dělění nulou.
RPNPROC_EXECB_VARRNG Číslo adresující proměnnou je mimo rozsah.
RPNPROC_EXECB_LBLRNG Číslo adresující návěští je mimo rozsah.
RPNPROC_EXECB_LBLDUP Duplicitní výskyt návěští.
RPNPROC_EXECB_LBLNEX Požadovaný skok na neexistující návěští.
RPNPROC_EXECB_RTNOVF Kapacita stacku pro návratové adresy vyčerpána.
RPNPROC_EXECB_ILLTYPE Neznýmý typ instrukce.

RETURN VALUE

Návratové hodnoty jsou popsané zde.



SYNOPSIS

typedef struct
{
    int             lblidx;
    unsigned        lineno;
rpnproctrace_t;

typedef struct
{
    rpnproctrace_t  tracev;
    rpnprocjobp_t   curjobp;
rpnproctrcjob_t;

typedef struct
{
    rpnprocvalue_t  stackx;
    rpnproctrcjob_t trcjobv;
rpnprocexeval_t;

DESCRIPTION

Tyto tři do sebe vnořené struktury obsahují členy, které poskytují následující informace:



Statické vytváření programu.

Na řadě míst tohoto textu je popisován vznik programu pro RPN procesor použitím funkce rpnproc_makejob(). Není to však jediná cesta. Binární kód je možno zapsat přímo do "statického pole" tasku používajícího SW vrstvu RPNPROC. Každého samozřejmě okamžitě napadne námitka "Proč bych psal RPN kód rovnou do programu? To můžu napsat požadovaný postup/výpočet do svýho programu rovnou a na celej RPN procesor se vyfláknu, ne?!" S takovou námitkou lze pouze souhlasit, jiná cesta není. Přesto je tato možnost uživateli ponechána a přostředky pro to jsou v headeru rpnproc.h obsaženy.
K čemu to tedy opravdu je?
Uspokojivá odpověď se nachází skutečně obtížně. Přesto zde je příklad, který by mohl býti typickým:

Ukázka statického vytváření programu je zde.