C ertokhoz kerdes
Rancz Lajos
csigaaelektro at freemail.hu
Thu Oct 21 10:14:57 CEST 2004
On Thu, 21 Oct 2004 08:39:00 +0200 (CEST), hg12345 wrote:
Helló!
Én eleve ezt a különbséget sem értem. Minek? Egyszerûen leteszed s fv.ek címeit a const tömbbe (persze a tömb létrehozása elõtt deklarálnod kell a fveket!) és adott számút meghívod. Nem kell belel eltolt címzés.
Tehát
// Fv. deklaraciok
void fugg0(struct *);
void fugg1(struct *);
..
..
..
void fuggn(struct *);
// Tipus a fv. mutato pointernek
typedef void (* funPtr)(char *);
// Tomb deklaracio
const funPtr Items[] = {fugg0, fugg1, fugg2};
void main(void)
{
unsigned char a = 5;
// Hivas
Items[0](&a);
}
Üdv,
Lajos
> Szia,
>
> koszonom, mindenkinek a segitseget, de valoszinleg a tudatlansagom
> miatt nem sok sikerrel jartam.
>
>
> Tobb felekeppen probalkoztam, de nem sikerult.
> A kovetkezo problemam a Bazis+Index cimzes technikanak, mar
> forditasi idoben rendelkezesre kell allni, ez egy tomoritesi a nagy
> szelektiv menu rendszer szelekitivitasat kezelo programok meghivasi
> pontjainak kezelesehez. Mivel ezek egy kezelesi egysegben vannak es
> egy bazis cimtol keletkeznek és fordulnak, igy jelentos mennyisegu
> idot es helyet lehet megtakaritani a uC-ben. (szerintem..., ilyen
> programom mar mukodik asm-ben irva, bevalt.)
> Sajnos eddig egyetlen probalkozasom se sikerult arra, hogy ezt C-
> ben leforduljon. Jelenleg studio 6-s C-vel probalkozom, ANSI
> uzemmodban. persze utani ezt Hitech C-be szeretnem forditani.
>
> A meghivott fuggvenyek
> void fugg ( struct *) alakuak, ezeket kellene igy kezelnem.
>
> Ha ez nem mukodik, akkor a konstansokra mutato pointerek sem allnak
> rendelkezesre forditasi idoben? pl. egy tablazat ami csak a tobbi
> tablazat kezdopontjat tartalmazza, termeszetesen ezek mind
> konstansok, raadasol futasi idoben ROM-ban helyezkednek el.
>
> udv
> Havas Gabor
>
> A
>
>
>> Szia!
>>
>> Ez inkább linker problémának látszik. Mi tudjuk, hogy két
>>
> függvénypointer
>> különbsége konstans, de a compiler nem. Illetve valószínûleg nem
>>
> tud olyan
>> mûveletet beírni az objectba, hogy két external különbségét
>>
> számolja ki.
>
>> Csináltam egy példát. Az inicializálást kikommenteztem és beírtam
>>
> hozzá azt
>> a hibajelzést, amit adott rá eredetileg. Kicsit perverz, és arra
>> támaszkodik, hogy a kódok rövidek, úgyhogy a pointerek különbsége
>>
> elfér egy
>> bájtban, de lefordítva mûködik.
>>
>> Palasik Sándor
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>>
>> void ITEM0(void)
>> {
>> printf("ITEM0\n");
>> }
>>
>> void ITEM1(void)
>> {
>> printf("ITEM1\n");
>> }
>>
>> void ITEM2(void)
>> {
>> printf("ITEM2\n");
>> }
>>
>> void ITEM3(void)
>> {
>> printf("ITEM3\n");
>> }
>>
>>
>> unsigned char delta_items[4]
>> /*
>> = { (unsigned char)ITEM1-(unsigned char)ITEM0, (unsigned
>> char)ITEM1-(unsigned char)ITEM0, (unsigned char)ITEM2-(unsigned
>> char)ITEM0, (unsigned char)ITEM3-(unsigned char)ITEM0}
>>
>> FUNNY.C(26) : error C2099: initializer is not a constant
>> FUNNY.C(27) : error C2099: initializer is not a constant
>> FUNNY.C(28) : error C2099: initializer is not a constant
>> FUNNY.C(29) : error C2099: initializer is not a constant */ ;
>>
>> int main()
>> {
>> int i;
>>
>> delta_items[0] = (unsigned char)ITEM0-(unsigned char)ITEM0;
>> delta_items[1] = (unsigned char)ITEM1-(unsigned char)ITEM0;
>> delta_items[2] = (unsigned char)ITEM2-(unsigned char)ITEM0;
>> delta_items[3] = (unsigned char)ITEM3-(unsigned char)ITEM0;
>>
>> for (i=0; i<4; i++)
>> ((void (*)(void))((int)ITEM0+delta_items[i]))();
>>
>> return 0;
>> }
>>
>> -----------------------------------
>> Szponzorunk: http://tonerbolt.hu/
>
>
> -----------------------------------
> Szponzorunk: http://tonerbolt.hu/
More information about the Elektro
mailing list