Volani funkci v C pres tabulku vektoru

Jindroush kubecj na asw.cz
Středa Březen 28 01:50:46 CEST 2012


Podle me to nemuze jit, kvuli ruznym parametrum.

jeste mozna jedno reseni - udelat to jako struct, ktery bude mit kazdou 
polozku typedefovany pointer na fci (za predpokladu, ze velikost ptr ve 
vasem programu a v tom vektoru bude stejna a dobre se to packuje).

Pak by teoreticky asi stacilo neco jako

typedef struct fnarrayType
{
  f1Type f1;
  f2Type f2;
} *pFnArray;

pFnArray pArr = (pFnArray)0x100000;

pArr->f1(1);
...

Ale to uz mluvim skoro ze spani ;)

On 28.3.2012 1:41, Petr Labaj wrote:
> Diky.
> Takze myslite, ze neexistuje varianta skakat primo podle te tabulky
> vektoru (coz by v assembleru urcite slo jako indirect call), ale musim
> to z te Flash vytahat do RAM (do tech pointeru) a volat to az pres ne.
> Myslel jsem prave jestli neexistuje nejaka konstrukce, ktera by v C
> udelala nejak elegantne ekvivalent toho indirect call podle konstaty
> ve Flash.
>
> PL
>
> *************************************
>
> From: "Miroslav Šinko"<sinkomiro na gmail.com>
> To: "HW-news"<hw-list na list.hw.cz>
> Sent: Wednesday, March 28, 2012 1:31 AM
> Subject: Re: Volani funkci v C pres tabulku vektoru
>
>
> Par poznamok bez testovania:
>
> zadefinujte si typ pointera na funkcie. nie je to nutne, ale sprehladni:
> typedef void(*fpFunc1)(int par1);
> typedef int (*func2)(int par1, char *par2);
>
> vytvorte instancie pointerov:
> fpFunc1 pFunc1;
> fpFunc2 pFunc2;
>
> do pointerov teraz treba priradit adresy z tabulky, toto asi z hlavy
> nedam celkom spravne. nejak takto:
> pFunc1 = (fpFunc1)*(0x100000);
> pFunc2 = (fpFunc2)*(0x100004);
>
> vsetky 3 predchadzajuce kroky sa daju napisat v jednom riadku na
> funkciu, ale by to bolo neprehladne.
>
> potom volanie:
> pFunc1(par1);
> iRet = pFunc2(par1, "par2");
>
>
> miro
>
>
> On 28. 3. 2012 0:59, Petr Labaj wrote:
>> Potreboval bych pres tabulku vektoru volat v C knihovni funkce, ktere
>> budou ulozene nekde ve Flash.
>>
>> Vyrobit tu tabulku vektoru na definovane adrese snad nebude moc
>> velky problem, v linker scriptu tomu vyrobim sekci na pevne adrese
>> a udelam tu tabulku treba v ASM:
>>
>> .section ".vectors"
>> .long func1
>> .long func2
>>
>> Ale jak pak ty funkce volat z jineho programu v C, kdyz jedine co vim je,
>> ze funkce maji prototypy napr.
>>
>> void func1 (int par1);
>> int func2 (int par1, char *par2);
>>
>> a ze tabulka vektoru zacina na absolutni adrese treba 0x100000, tedy
>> ze adresa funkce func1 je ulozena na 0x100000 a adresa funkce func2
>> je na 0x100004.
>>
>> Diky za kazdy tip.
>> PL
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>


-- 
Jindroush (kubecj na avast.com)
http://www.kostky.org - Pro fany stavebnic LEGO.


Další informace o konferenci Hw-list