Designated initializers v c89 – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Designated initializers v c89 – C / C++ – Fórum – Programujte.comDesignated initializers v c89 – C / C++ – Fórum – Programujte.com

 

shela
~ Anonymní uživatel
4 příspěvky
20. 2. 2012   #1
-
0
-

Dobrý den,

mám principiálně takovýto union:

typedef union
{
  int *pInt;
  void (*pFcn)(int);
} u_t;

a potřebuji staticky definovat pole s tímto unionem, takže něco jako:

int fooInt;
void fooFce(int i);

const u_t u[] = {{.pFce = &fooFce}, {.pInt = &fooInt}};

Problém je v tom, že nemůžu použít C podle c99, ale jen c89. Takže nemůžu použít "designated initializers". Zároveň to píšu pro mikrokontrolér, takže jde o každý byte a nemůžu si dovolit nahradit union strukturou a pole musí být definováno s const.

Nevíte někdo, jak toto vyřešit?

Díky moc!

Nahlásit jako SPAM
IP: 158.196.65.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2012   #2
-
0
-

trosku nechapu uplne na co...  ale muzes zkusit void pointery

hlavni je poznat co je co... ale to u unionu musis resit taky

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondra.holub+1
Stálý člen
20. 2. 2012   #3
-
0
-

A toto ti to nesežere?

const u_t u[] = {{&fooFce}, {&fooInt}};

Nemám překladač pro mikrokontrolery, takže to můžu zkusit jenom v gcc a visual c. Ale jak píše KIIV, vždycky to můžeš nahradit nějakým void pointrem nebo nějakou strukturou, do které se vejde každá varianta a pak to přetypovávat.

Nahlásit jako SPAM
IP: 194.138.12.–
shela
~ Anonymní uživatel
4 příspěvky
20. 2. 2012   #4
-
0
-

Díky za odpověď.

Poznávání "co, je co" řeším ve struktuře, ve které je ten union vložený a to, o co se pokouším je implementace adresáře objektů "object dictationary" k CANopen. Protože nemám místa nazbyt, tak jsem chtěl jednoduché objekty implementovat pouze jako ukazatel na data někde jinde v programu a ty složitější řešit přes ukazatele na funkce.

Můžeš mě prosím popostrčit ohledně void ukazatelů? Při zběžném googlování jsem nenarazil na způsob, jak je realizovat tak, aby fungovali jako ukazatele na proměnné i funkce. Je to vůbec možné?

Nahlásit jako SPAM
IP: 158.196.65.–
shela
~ Anonymní uživatel
4 příspěvky
20. 2. 2012   #5
-
0
-

#3 ondra.holub

toto nefunguje :-(. Snaží se to pokaždé nacpat do první položky.

Nahlásit jako SPAM
IP: 158.196.65.–
KIIV
~ Moderátor
+43
God of flame
20. 2. 2012   #6
-
0
-

neco jako    void * u[] = { (void*)&fooFce,  (void *)&fooInt}

pak to chce akorat zase spravne pretypovat nazpet... (hlavne poznat co je co)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondra.holub+1
Stálý člen
20. 2. 2012   #7
-
0
-

Tak si rozšiř ten union na

typedef union
{
    void* any;
    int *pInt;
    void (*pFcn)(int);
} u_t;

a pak už není problém, že to cpe pokaždé do prvního. Samozřejmě to bude fungovat jenom tehdy, když tam budeš strkat jenom ukazatele nebo něco stejně velkého.

Na (void*) se nemusí přetypovávat, to se přetypuje samo.

Nahlásit jako SPAM
IP: 194.138.12.–
shela
~ Anonymní uživatel
4 příspěvky
20. 2. 2012   #8
-
0
-

To je geniální! Už to funguje...

Díky moc všem!

Nahlásit jako SPAM
IP: 95.82.138.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 28 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý