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