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
773
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
Tällä kertaa Marinia kadehtii Minäminä Päivärinta
Kokoomuksen tyhjäntoimittelija itkeä tuhertaa, kun kansainvälinen superstaramme ei leiki hänen kanssaan. Oikean puoluee3881533- 1051288
Miksi koulut pakottavat
Lapset uimaan sekaryhmänä? Murrosikäiset tunnetusti häpeilevät vartalossa tapahtuvia muutoksia. Tulee turhia poissaoloja1161220Miksi jollain jää "talvi päälle"
Huvittaa kastoa ullkona jotain vahempaa äijää joka pukeutuu edelleen kun olisi +5 astetta lämmittä vaikka on helle keli1651145- 44987
- 63906
Se katse silloin
Oli hetki, jolloin katseemme kohtasivat. Oli talvi vielä. Kerta toisensa jälkeen palaan tuohon jaettuun katseeseen. Tunt32816Suomen Pallolitto: Tasoryhmät lasten jalkapallossa - Erätauko-tilaisuus ma 20.5.2024
Tasoryhmät lasten ja nuorten jalkapallossa herättävät paljon keskustelua. Mitä tasoryhmät ovat ja mikä on niiden tarkoit0810Susanne Päivärinta kirjassaan: Sannalla nousi valta päähän, Big Time!
Päivärinta toteaa ettei ole nähnyt kenenkään muuttuvan niin totaalisesti kuin Marinin, eikä siis todellakaan parempaan s91804Tuhdit oluet kauppoihin. Miksi vastustaa?
8% oluet kauppoihin mutta mikä siinä on että osa politikoista vstustaa ? Kauppa kuitenkin hinnoittelee vahvan oluen ni167701