Portál AbcLinuxu, 11. května 2025 04:47

Dotaz: C; pointer na fciu v strukture

20.12.2010 16:50 mato
C; pointer na fciu v strukture
Přečteno: 506×
Odpovědět | Admin
Cafte, pri rieseni problemu sm narazil na zaujimavy problem, pri ktorom som si nie celkom isty. Otazka znie: je spravne menit adresu fcie pocas jej behu (po zavolani)? Otazka asi nie je polozena uplne spravne .. na ukazku kod:
#include <stdio.h>

/* fwd deklaracia */
struct point __point;

/* exec fcia */
typedef int(*f_execute)(struct point* p);

struct point {
        int x;
        int y;
        int z;

        f_execute       exec;
};

int exec_primary(struct point* p);
int exec_secondary(struct point* p);

int main()
{
        struct point p;

        p.x = p.y = p.z = 0;
        p.exec = &exec_primary;

        /* execute */
        while (p.exec != NULL) {
                p.exec(&p);

                printf ("DEBUG: p: [%d,%d,%d]\n", p.x, p.y, p.z);
        }

        return 0;
}

int exec_primary(struct point* p)
{
        p->x += 4;
        p->y += 2;
        p->z += 1;

        p->exec = &exec_secondary;
        return 0;
}

int exec_secondary(struct point* p)
{
        p->x *= 2;
        p->y *= 4;
        p->z *= 3;

        p->exec = NULL;
        return 0;
}

Nech mam struktutu point, ktora v sebe ma okrem suradnic aj pointer na fciu, ktoru ma vykonat. Na zaciatku je exec nastaveny na prvu, zakladnu exec fciu exec_primary. Ta pocas svojho behu zmeni point exec pointer na druhu fciu, exec_secondary
mozem mat zadefinovany neobmedzeny pocet exec fcii, ktory nie je vopred znamy, pripadne sa dynamicky meni od systemu

vsetko funguje ako ma, no nie som si isty ci je toto spravne, resp. uplne koser riesenie.

musim si pozriet hlbsie teoriu o tom, ako su fcie volane (tj. mngmnt ohladne volani fcii), ale mozno mi niektori z vas budete vediet poradit, resp. nasmerovat, ci je takyto sposob v poriadku

vopred vdaka

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.12.2010 17:59 R
Rozbalit Rozbalit vše Re: C; pointer na fciu v strukture
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nemenis "adresu funkcie", ale menis nejaky pointer ulozeny v strukture. Ze je v nom ulozena adresa samotnej funkcie, to je nezaujimave. Volanie funkcie uz bolo vykonane a do dalsieho volania ten pointer nebude potrebny.

Pre pochopenie si predstav kod v assembleri - funkciu zavolas (CALL), potom bezi a nakoniec sa vrati (RET).
20.12.2010 18:52 mato
Rozbalit Rozbalit vše Re: C; pointer na fciu v strukture
ano, pravda..zle som sa vyjadril v tej otazke ..

dobre si to naznacil s tym CALL/RET .. RET bude adresa <main>; to ze je v strukture pointer na adresu, ktoru som zavolal a zaroven strukturu pozmenil je jedno (tj. je jedno ci menil integer alebo pointer (co je koniec koncov zas len cislo)

.. uz sa dlhsi cas chystam pozriet si info ohladne volanie fcia a mngmnt stack-u .. zimne vecery su ten idealny cas

diq

21.12.2010 12:10 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: C; pointer na fciu v strukture
Odpovědět | | Sbalit | Link | Blokovat | Admin
No nevím jakou logiku se tím snažíte naprogramovat, ale nebylo by jednodušší prostě ty funkce zavolat rovnou za sebou?
In Ada the typical infinite loop would normally be terminated by detonation.
21.12.2010 12:46 mato
Rozbalit Rozbalit vše Re: C; pointer na fciu v strukture
ten horeuvedeny priklad sluzi len ako ukazka principu, co pouzivam vo svojom kode ja ..

problem spociva v tom, ze pocet funkcii nie je vopred znamy a je definovany uzivatelom .. moze ich byt lubovolne vela, kde posledna fcia musi byt NULL.
jedna sa (resp. bude sa jednat) o kniznicu simulacneho jadra, kde entita zijuca v systeme prechadza lubovolnym poctom eventov; zo systemu odchadza, ked je jej exec nastaveny na NULL

pavlix avatar 21.12.2010 19:30 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: C; pointer na fciu v strukture
Pak nevidím problém během volání funkce ukazatel nastavit na novou funkci. S CALL a RET to nemá nic společného. Jediná souvislost mezi strukturou a funkcí je v tomhle případě, že se struktura na funkci odkazuje.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
21.12.2010 19:51 __dark__
Rozbalit Rozbalit vše Re: C; pointer na fciu v strukture
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tvuj pristup je v poradku. Adresa funkce se nacte pokazde, kdyz se ma funkce zavolat. Jak uz bylo zmineno, ty nemenis adresu te funkce, ale jen ukazatel. Akorat si ted nejsem jisty tim struct point __point;, nemelo by tam byt jen struct point;?
22.12.2010 10:10 mato
Rozbalit Rozbalit vše Re: C; pointer na fciu v strukture
s tou fwd declaraciou mas pravdu, uplne by postacilo

struct point;
__point je uz zadef. premenna, co trosku mozno nema zmysel .. ja to (zne)uzivam na to, aby som videl, ze je to to fwd declaracia - bije mi to do oci hned ked otvorim zdrojak ..

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.