Kezdőoldal » Számítástechnika » Programozás » Mennyire vállalhatatlan...

Ozmium42 kérdése:

Mennyire vállalhatatlan megoldás ez (C)?

Figyelt kérdés

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?


2019. aug. 3. 21:10
 1/3 anonim ***** válasza:
100%

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.

2019. aug. 3. 21:36
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:
100%

"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.

2019. aug. 4. 13:10
Hasznos számodra ez a válasz?
 3/3 anonim ***** válasza:
100%

"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;

}

2019. aug. 5. 09:35
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!