Kezdőoldal » Számítástechnika » Programozás » C++-ban hogyan lehet (ha...

C++-ban hogyan lehet (ha lehetséges) void függvényfejben típusra hivatkozni?

Figyelt kérdés

Van egy típusom. TTipus {string a; string b; int c; int d;};

Van egy ilyen típusó tömböm. TTipus TOMB[100];

Void függvénnyel szeretnék beolvastatni. Hogyan tudok a függvényfejben hivatkozni az összetevőkre? Van-e jobb megoldás, mint az, hogy


void szovegbeolvasas(TTipus TOMB[],string q);

void szambeolvasas(TTipus TOMB[],string q);


int main(){TTipus TOMB[100]; szovegbeolvasas(TOMB,a); szovegbeolvasas(TOMB,b); szambeolvasas(TOMB,c); szambeolvasas(TOMB,d);}


szovegbeolvasas(TTipus TOMB[],string q){

for (int i=0;i<100;++i){cin >> TOMB[i].q;return;}

szambeolvasas(TTipus TOMB[],string q){

for (int i=0;i<100;++i){cin >> TOMB[i].q;return;}


Lehetséges, hogy egyből csak egy oszlopra hivatkozzak a void függvényfejben?



2014. nov. 19. 14:28
 1/9 anonim ***** válasza:
WAT??
2014. nov. 19. 14:30
Hasznos számodra ez a válasz?
 2/9 Tengor ***** válasza:

Ez így elég meredek. A C nem script nyelv, nem tudsz egy struktúra adattagjára stringgel hivatkozni.

A mainben meg sem adtad, hogy mi az a, b, c, d változód típusa v. értéke. Azért mert leírod még nem lesz belőle string.


Én egy függvényt írnék, ami várja a tömböt és egy 0-4 értéket.

A függvényen belül ha 0-át kapok, akkor a tömb elemének a tagját olvasom be, ha 1-et, akkor a b tagját... ha 3-at, akkor a d tagját.

2014. nov. 19. 14:37
Hasznos számodra ez a válasz?
 3/9 anonim ***** válasza:

Template-ekkel tökéletesen meg lehet oldani, és így nem a középsulis else-if megoldást kell használnod.


template <int C>

void readColumn(TTipus* pTomb);


template <>

void readColumn<0>(TTipus* pTomb, int len)

{

   for (int i = 0; i < len; i++)

    {

        cin >> pTomb[i].a;

    }

}


template <>

void readColumn<1>(TTipus* pTomb, int len)

{

    for (int i = 0; i < len; i++)

    {

        cin >> pTomb[i].b;

    }

}


Ez kódban így néz ki:


int main()

{

    TTipus tomb[100];

    readColumn<0>((TTipus*) tomb, 100);

    readColumn<1>((TTipus*) tomb, 100);

    // ...

    return 0;

}

2014. nov. 19. 14:51
Hasznos számodra ez a válasz?
 4/9 Tengor ***** válasza:

#3, biztos, hogy jó a template-es játék?

Ha a TTipust egy adatbázis rekordnak veszünk, akkor a TTipus[] egy táblázat. A paraméterként adott azonosító, kijelöli, hogy a táblázat melyik oszlopát akarod tölteni.

Ez jó dolog template-tel megcsinálni?

2014. nov. 19. 14:54
Hasznos számodra ez a válasz?
 5/9 anonim ***** válasza:

Ez a templates megoldás is ugyanolyan szörnyű és tele van kódismétléssel.

Ha egy adatstruktúrának az oszlopait nem egyszerre olvasod be, akkor csinálj nekik külön függvényeket, vagy eleve a struktúrádat bontsd szét.

2014. nov. 19. 15:01
Hasznos számodra ez a válasz?
 6/9 SimkoL ***** válasza:

Tengor válasza a legkiválóbb. Egy eljárás - bocs c: függvény - és a kapott paraméter alapján a megfelelő oszlopot írja. Nem 'középsulis else-if megoldást kell használnod' persze van, kell egy case szerkezet.

Könyörgöm, hagyatkozzunk már a józan paraszti észre és ne a bal kezünkkel vakarjuk a jobb fülünket orrpiszkálás közben.

2014. nov. 19. 15:28
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:

Tengorral én is egyet értek.


Érdemes eleve oszloponként tárolni az adatokat, így a cache miss esélye is kisebb, tehát performancia téren is jobb lesz a program. nem beszélve arról, hogy bekerülhet egy (hash) map-ba tehát stringként is tudunk rá hivatkozni.


Az én template megoldásom a kérdező kérdésre vonatkozott, kifejezetten erre a célra. Egyértelmű, hogy a template-ek nem erre valóak, még a TMP se.

2014. nov. 19. 16:53
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:
Csinálj négy tömböt és használd azokat. Vagy várd meg a C++20 vagy későbbi szabványt abban lehet hogy lesz reflexió.
2014. nov. 19. 17:00
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:
Nem hinném, hogy C++-ban lenne reflexió valaha is. Nem menedzselt nyelvről van szó. igazából nem is kell, mert vannak függvény pointerek.
2014. nov. 20. 12:29
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!