www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Prehod CARM -> RV30 in Menu

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Tor Dec 26, 2006 12:15 pm    Naslov sporočila:  Prehod CARM -> RV30 in Menu Odgovori s citatom

Nekega lepega dne sem se odločil, da prrogram za diferencialni termostat prestavim iz CARM compilerja na RealView compiler. Počasi sem zgladil vse nekompatibilnosti razen ene. Program uporablja tudi malce predelan MarEtov menu (izvirnik). Ker se mi zdi neumno, da bi menu neprestano visel v ramu, mu pred definicijo prilimam const, kjer pa se vse skupaj zatakne. Struct je definiran takole:
Koda:
typedef struct _menu {
   char *txt;
   void *up,*down,*parent,*child;
   void (*exec) (void);
   char fparam;
} Menu;

Menu je inicializran takole
Koda:
const Menu test[] = /*      Prev      Next         Parent         Child       Exec */
   {{"Nastavitve",         NULL,      &test[1],      NULL,         &test[1],   NULL,   0} , // 0
   {"Vklop/Izklop",         &test[0],   NULL,          NULL,          &test[0],   NULL,   0} , // 1
   };

Napaka pa je sledeča
Koda:
menu.c(94): error:  #144: a value of type "const Menu *" cannot be used to initialize an entity of type "void *"


Poskusil sem že pointerje na ostale menuje definirati kot struct _menu namesto void, vendar je napaka enaka. Če definiciji menuja odstranim const, vse deluje kot je treba. Ima kdo kakšno idejo? (V CARMu je to seveda lepo delovalo);

Hvala in Lp, Matic

_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Tor Dec 26, 2006 2:42 pm    Naslov sporočila:   Odgovori s citatom

Kaj pa če bi namesto "typedef struct _menu" napisal "typedef const struct _menu" oz "typedef struct const _menu" (ne vem katera bi bila pravilna).

Druga možnost pa bi bila, da "Menu" ne definiraš pri "typedef struct _menu" ampak da nekje drugje napišeš "const _menu Menu" (mogoče je potrebno še pred oz za const vstaviti struct).

Nimam izkušen s tema dvema kompilerjema, ampak govorim na splošno glede na C jezik.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
snow
Član
Član



Pridružen-a: Tor 27 Dec 2005 14:02
Prispevkov: 341
Aktiv.: 1.44
Kraj: Ljubljana || Velenje

PrispevekObjavljeno: Sre Dec 27, 2006 1:31 am    Naslov sporočila:   Odgovori s citatom

Kaj pa če namesto inicializacije konstantne strukture, uporabiš strukturo konstantnih elementov?

Koda:
typedef struct _menu {
   const char *txt;
   const void *up,*down,*parent,*child;
   const void (*exec) (void);
   const char fparam;
} Menu;


Koda:
Menu test[] = /*      Prev      Next         Parent         Child       Exec */
   {{"Nastavitve",         NULL,      &test[1],      NULL,         &test[1],   NULL,   0} , // 0
   {"Vklop/Izklop",         &test[0],   NULL,          NULL,          &test[0],   NULL,   0} , // 1
   };



Mimogrede, zakaj se uporablja fparam? Je bilo to mišljeno kot parameter funkciji exec?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.56

PrispevekObjavljeno: Sre Dec 27, 2006 1:45 am    Naslov sporočila:   Odgovori s citatom

Ce bi bili parametri, bi bil nanje (najbrz) genericen seznam pointerjev oz. pointer na tak seznam, ne spremenljivka tipa char, ki lahko drzi samo omejeno stevilo vrednosti ...

Zgoraj omenjena koda je totalno pretirana (in neizkoriscena, glede na avtorjeve namene). Ce ne potrebujes vsega, kar je imel avtor v mislih, mocno svetujem poenostavitev ...

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Sre Dec 27, 2006 9:06 am    Naslov sporočila:   Odgovori s citatom

@Djurodrljaca: Problem je sigurno možno rešiti s pravilno c-jevsko sintakso, tako da bom probal tvoja predloga, ko le najdem čas.

@Snow: če uporabim strukturo konstantnih elementov je problem ostane, le da je ravno obraten. Ja, fparam je parameter, ki se uporabi za ugotavljanje različnih menijejev, ki kličejo isto funkcijo.

@Sokrat: Menu mi je všeč, ker je sistematično narejen in dobro deluje. Seveda je precej predimenzioniran, vendar je tudi moj meni kar obširen (tisto, kar sem skopiral sem, je zgolj za predstavitev problema). Skupaj s funkcijo za dodajanje menija na poljubno mesto je koda zelo uporabna in glede na "neomejene" količine flasha na LPCjih jo z veseljem uporabljam.

Lp, Matic

_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
snow
Član
Član



Pridružen-a: Tor 27 Dec 2005 14:02
Prispevkov: 341
Aktiv.: 1.44
Kraj: Ljubljana || Velenje

PrispevekObjavljeno: Sre Dec 27, 2006 8:32 pm    Naslov sporočila:   Odgovori s citatom

Kaj pa
Koda:
struct menu {
   char *txt;
   void *up,*down,*parent,*child;
   void (*exec) (void);
   char fparam;
};




Koda:
const struct menu test[] = /*      Prev      Next         Parent         Child       Exec */
   {{"Nastavitve",         0,      &test[1],      0,         &test[1],   0,   0} , // 0
   {"Vklop/Izklop",         &test[0],   0,          0,          &test[0],   0,   0} , // 1
   };
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
oversc0re
Član
Član



Pridružen-a: Tor 13 Sep 2005 15:20
Prispevkov: 460
Aktiv.: 1.94
Kraj: Radomlje

PrispevekObjavljeno: Pet Dec 29, 2006 7:11 pm    Naslov sporočila:   Odgovori s citatom

Deluje prva resitev, ki jo je predlagal Djurodrljaca (typedef const struct _menu). Mislim, da bi sicer delovala tudi zadnja rešitev, ki jo je predlagal snow, vendar to povzroči precej predelav, saj tip Menu potem ne obstaja in je problem s podajanjem parametrov funkcijam. Hvala za pomoč!

Lp, Matic

_________________
The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny ...'
Isaac Asimov (1920 - 1992)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 495 dni


Powered by phpBB © 2001, 2005 phpBB Group