 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Tor Dec 26, 2006 12:15 pm Naslov sporočila: Prehod CARM -> RV30 in Menu |
|
|
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 |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Tor Dec 26, 2006 2:42 pm Naslov sporočila: |
|
|
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 |
|
 |
snow Član


Pridružen-a: Tor 27 Dec 2005 14:02 Prispevkov: 341 Aktiv.: 1.44 Kraj: Ljubljana || Velenje
|
Objavljeno: Sre Dec 27, 2006 1:31 am Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.56
|
Objavljeno: Sre Dec 27, 2006 1:45 am Naslov sporočila: |
|
|
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 |
|
 |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Sre Dec 27, 2006 9:06 am Naslov sporočila: |
|
|
@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 |
|
 |
snow Član


Pridružen-a: Tor 27 Dec 2005 14:02 Prispevkov: 341 Aktiv.: 1.44 Kraj: Ljubljana || Velenje
|
Objavljeno: Sre Dec 27, 2006 8:32 pm Naslov sporočila: |
|
|
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 |
|
 |
oversc0re Član

Pridružen-a: Tor 13 Sep 2005 15:20 Prispevkov: 460 Aktiv.: 1.94 Kraj: Radomlje
|
Objavljeno: Pet Dec 29, 2006 7:11 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|