Mennyire vállalhatatlan megoldás ez (C)?
Igazából nincs most konkrét gyakorlati jelentősége, csak ahogy tanulok-gyakorlok merült fel bennem az ötlet, hogy írni kellene egy generikus függvényt, aminek az argumentuma különböző struktúrák lehetnek.
Keresgélés után arra jutottam, integerré castolom a struct pointerét, azt az integert adom át a függvénynek paraméterként, és a függvényen belül castolom vissza pointerré, ahol már el lehet dönteni (egyenlőre a második paraméter alapján), hogy mit kezdjünk vele.
Pl.
struct Struct1 {
_int v1, v2; };
struct Struct2 {
_float v1, v2; };
void print_sum(int mem, int type){
_if (type==1) {
__struct Struct1 *p = (struct Struct1*)mem; printf("%d\n", p->var1+p->var2);}
_else {
__struct Struct2 *p = (struct Struct2*)mem; printf("%f\n", p->var1+p->var2);}
}
int main(){
_struct Struct1 s1;
_s1.v1 = 1;
_s1.v2 = 2;
_print_sum((int)&s1, 1);
_struct Struct2 s2;
_s2.v1 = 1;
_s2.v2 = 2;
_print_sum((int)&s2, 2);
}
Elképzelésem szerint olyankor jöhetne jól, ha például különböző láncolt listákhoz írnék közös függvényeket.
Van ennél jobb megoldás?
Bónusz kérdés: hogyan oldjátok meg gyk-n az indentálást meg a szöveg formázását?
Nem vagyok egy C guru, inkább C++-ban utazok, ahol erre a kérdésre triviális lenne a válasz (template-ek használata). C-ben viszont tudtommal nincs ilyen, szóval nézzük...
Az a helyzet, hogy te itt nem írsz közös logikát, minden típusra külön-külön leírod a rá illő kódot (ami javarészt ugyanaz), tehát nem spórolod meg a kódduplikálást. Akkor viszont már nemes egyszerűséggel megírhatod ugyanazt a függvényt minden típusra külön-külön, és akkor nem kell a második paraméter. Már csak azért is jobb lenne ez a megoldás, mert egy függvénynél célszerű törekedni a hibamentességre, a függvény a lehető legkevesebb ponton okozzon hibát. Ehhez pedig az egyik fő alapelv a paraméterek függetlenítése, azaz ne lehessen elmondani azt, hogy "ha az egyik paraméter értéke x, akkor a másiknak y-nak kell lennie". Jelenleg a te függvényed ezt nem teljesíti, a második apraméternek helyesen meg kell mondania az első paraméter típusát.
Oh, és ha már típusazonosítókat akarsz használni, akkor ne mezei inteket használj, hanem használj enumot, sokkal beszédesebb.
"integerré castolom a struct pointerét"
Amennyire lehet, kerüld a cast-ot. (Pláne integerré... mi a baj a void* pointerrel?) Listákhoz praktikusabb lenne inkább egy általános láncolt lista elemet csinálni, pl. előző-következő pointerek, és egy pointer az elem adatára. Vagy ha már a közös függvényt úgyis a struct-okra kell szabni, akkor inkább a struct tartalmazza a saját típusát mondjuk a legelső, fix nevű-típusú változóban. Én mondjuk ezt sem preferálom.
"Bónusz kérdés: hogyan oldjátok meg gyk-n az indentálást meg a szöveg formázását?"
Én pl -re cserélem a szóközöket:
int xx()
{
return 4;
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!