Eli kysymys tietuetyypistä struct -määreellä. Lueskelen Hietaniemen C ja olio-ohjelmointi kirjaa sekä Hirvosen Ohjelmoinnin alkeet C-kieltä käyttäen ja pikkasen meinaa olla ristiriitaista ihan tuo Hietasen kirjan jututkin. Jos voitte niin katsokaa itse Hietasen kirjasta Luku 9 sivut 148-151. Eli Hietasen kirjassa puhutaan tietueen (struct) määrittelystä ja esittelystä sekä alustuksesta. Määrittelyn ja esittelyn ero vähän ihmetyttää. struct PVM { int pp; int kk; int vv; }; (Onko tämä esittely vai määrittely) Eli tästä sanotaan että tietue määritellään struct määreen avulla. (Voiko muuten C :ssa käyttää tuossa edessä vielä typedef-määritystäkin? C:ssä ainakin voi... Mikälie ero?) Kohta sitten sanotaankin että "tietuetyypin esittely ei vielä varaa muistilaa..." Ja jonkun rivin päästä: "Tietueen tilanvaraus tapahtuu tilanvaraus tapahtuu määrittelemällä tietue." TIETUETYYPPI tietue eli tässä tapauksessa esim PVM pvm; Sitten kirjassa on esimerkki 9-3 PVM-tietueiden käyttö joka on selitetty, ja siellä taas koko homma on koko ajan kerrottu että tietue on määritelty... helvetin sekavaa Ja sitten kun katsoo vielä Hirvosen ohjelmoinnin alkeet niin vielä enemmän sekaisin menee. SIellä ei puhuta esittelystä mitään, ainoastaan määrittelystä joka on tällainen typedef struct{ char tuote_nimi[30]; float hinta; }HINTA_TIETUE; HINTA_TIETUE tuote; Selittäkääpä tätä juttua, kiitos.
tietuetyyppi struct -määreellä
5
790
Vastaukset
- jatkokysymys
tarkoittaisiko nämä samaa asiaa? ------------- struct PVM { int pp; int kk; int vv; }; PVM pvm; ------------ ------------ struct PVM { int pp; int kk; int vv; }pvm; ------------
- tarkoittavat
juurikin samaa. Taisit unohtaa että varaus on: struct PVM pvm; Typedef tekee "aliaksen", jonka jälkeen tuota ei enää tarvi. Ajattele struktuureita tietotyyppeinä, kuten inttiä. Inttiä ei tarvitse esitellä missään, koska se tunnetaan aina. Inttiä ei myöskään tarvitse määritellä, koska se tunnetaan ja on määritelty sisältämään kokonaislukuja. Muistin varaus tapahtuu samalla lailla struktuurin kanssa kuin intinkin, int i; tekee muuttujan. Tuo ensimmäinen versio on "perusmalli" joka määrittelee PVM:n (pelkkä esittely olis struct PVM;). Kakkonen määrittelee ja varaa PVM mallisen struktuurin nimeltään pvm. Typedef säästää structin jatkuvalta kirjottamiselta. Jos haluat lisää PVM tyyppejä, teet aina: struct PVM foo; typedef struct {} jotain; riittää jotain foo;
- tietuetyypin määrittely ja ...
eli nythän kai tajusin vähän väärin; on kaksi eri asiaa tietuetyypin määrittely ja tietueen määrittely. Mutta onko tietuetyypin esittely==tietuetyypin määrittely. Nuo sanat on otettu Hieatasen kirjasta.
- hieman...
Tapa 1: struct foo; /* esittely (declare) */ Esittely kertoo vain että on olemassa jokin foo-niminen struct. struct foo { /* määrittely (define) (tai esittely määrittely, jos esittelyä ei aiemmin)*/ int bar1; int bar2; }; Määrittely kertoo structin sisällön. typedef struct foo foo; /* synonyymi struct foolle */ typedef struct foo Too; /* toinen nimi */ Nyt käy: struct foo f1; foo f2; Too t3; Tapa 2: Kaikki samassa: typedef struct foo { /* esittely määrittely synonyymi(t) */ int bar1; int bar2; } foo, Too; Nyt käy myös: struct foo f1; foo f2; Too t3; Tapa 3: typedef struct { /* vain määrittely synonyymi */ int bar1; int bar2; } foo; Nyt käy vain: foo f2; Tapa 4: typedef struct foo Too, foo; /* esittely ja synonyymit ennen */ struct foo { /* määrittely */ int bar1; int bar2; }; Taas käy: struct foo f1; foo f2; Too t3; Tavat 1, 2 ja 4 on täysin sama asia. Ja ykkösessä voi jättää esittelyn pois. Selkein lienee nelos-tapa. "Mutta onko tietuetyypin esittely==tietuetyypin määrittely. Nuo sanat on otettu Hieatasen kirjasta." Siis typedef antaa datatyypille uuden nimen eli synonyymin, ja sitä pitänee kai sanoa määrittelyksi, koska se voidaan vain kerran määritellä (vrt. esittely ja myöhemmin määrittely). Toisaalta sitä ehkä voisi sanoa esittelyksi... Asia pitäisi tarkistaa C-kielen tekijöiden Kernighan, Ritchie: The C Programming Language-kirjasta (suomeksi C ohjelmointi). Siis eri asioita: typedef struct foo Too; On siis: uusi tyyppi Too synonyymiksi foolle ja structin foo esittely. Tätä tarkoittaa 'tietuetyypin esittely'. Ja toi Tapa 2, olisi se 'tietuetyypin määrittely', vaikka se on oikeasti (pilkkua nusuttaen) tietueen esittely määrittely ja tyypin synonyymin määrittely. Katso myös: http://c-faq.com/struct/typedef.html
- hieman...
hieman... kirjoitti:
Tapa 1: struct foo; /* esittely (declare) */ Esittely kertoo vain että on olemassa jokin foo-niminen struct. struct foo { /* määrittely (define) (tai esittely määrittely, jos esittelyä ei aiemmin)*/ int bar1; int bar2; }; Määrittely kertoo structin sisällön. typedef struct foo foo; /* synonyymi struct foolle */ typedef struct foo Too; /* toinen nimi */ Nyt käy: struct foo f1; foo f2; Too t3; Tapa 2: Kaikki samassa: typedef struct foo { /* esittely määrittely synonyymi(t) */ int bar1; int bar2; } foo, Too; Nyt käy myös: struct foo f1; foo f2; Too t3; Tapa 3: typedef struct { /* vain määrittely synonyymi */ int bar1; int bar2; } foo; Nyt käy vain: foo f2; Tapa 4: typedef struct foo Too, foo; /* esittely ja synonyymit ennen */ struct foo { /* määrittely */ int bar1; int bar2; }; Taas käy: struct foo f1; foo f2; Too t3; Tavat 1, 2 ja 4 on täysin sama asia. Ja ykkösessä voi jättää esittelyn pois. Selkein lienee nelos-tapa. "Mutta onko tietuetyypin esittely==tietuetyypin määrittely. Nuo sanat on otettu Hieatasen kirjasta." Siis typedef antaa datatyypille uuden nimen eli synonyymin, ja sitä pitänee kai sanoa määrittelyksi, koska se voidaan vain kerran määritellä (vrt. esittely ja myöhemmin määrittely). Toisaalta sitä ehkä voisi sanoa esittelyksi... Asia pitäisi tarkistaa C-kielen tekijöiden Kernighan, Ritchie: The C Programming Language-kirjasta (suomeksi C ohjelmointi). Siis eri asioita: typedef struct foo Too; On siis: uusi tyyppi Too synonyymiksi foolle ja structin foo esittely. Tätä tarkoittaa 'tietuetyypin esittely'. Ja toi Tapa 2, olisi se 'tietuetyypin määrittely', vaikka se on oikeasti (pilkkua nusuttaen) tietueen esittely määrittely ja tyypin synonyymin määrittely. Katso myös: http://c-faq.com/struct/typedef.html
"Ja toi Tapa 2, olisi se 'tietuetyypin määrittely', vaikka se on oikeasti (pilkkua nusuttaen) tietueen esittely määrittely ja tyypin synonyymin määrittely." Tietysti myös Tapa 3 on 'tietuetyypin määrittely'. Tavat 1 ja 4 esittelevät ja määrittelevät tietueen erikseen ja asettavat tietotyypin nimen. Näin siis luulisin (näkemättä), mitä noissa kirjoissa tarkoitetaan. Onhan tää aika sekavaa... valitettavasti.
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Kuka maksaa Elokapinan töhrinnän?
Vieläkö tukevat Elokapinan toimintaa mm. Aki Kaurismäki, Sofi Oksanen, Paleface, Koneen Säätiö ym. ? Kenen kukkarosta ot5873900Muuttaisiko viesti mitään
Haluaisin laittaa viestin, mutta muuttaisiko se mitään. Oletko yhä yhtä ehdoton vai valmis kyseenalaistamaan asenteesi j483338- 382811
Valpuri Nykänen elokapina
Aikas kiihkomielinen nainen kun mtv:n uutiset haastatteli. Tuollaisiako ne kaikki on.662779Oon vähän ihastunut suhun nainen
Vaikka toisin jokin aika sitten väitin mutta saat mut haluamaan olemaan parempi ihminen :)192154- 322101
Se että tavattiin
Hyvin arkisissa olosuhteissa oli hyvä asia. Olimme molemmat lähestulkoon aina sitä mitä oikeasti olemme. Tietysti pieni121997- 291875
Oot pala mun sielua
Jos toivot, että lähden mä lähden. Jos toivot, että jään mä jään. Koen, että olet mun sielunkumppani, mutta lämmöllä my171830Hei T........
Ajattelin kertoa että edelleen välillä käyt mielessä.... En ole unohtanut sinua, enkä varmasti ikinä... Vaikka on kulunu471759