C ertokhoz kerdes
hg12345
hg12345 at freemail.hu
Thu Oct 21 08:39:00 CEST 2004
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/
>
More information about the Elektro
mailing list