Outoa C -kieltä:
---------------------------------------
main()
{
int yyparse();
return(yyparse());
}
---------------------------------------
Kutsutaanko tuossa funktiota yyparse() kerran vai 2 kertaa ?
Jos syntaksi on laillinen, miksi?
Ja jos syntaksi on laillinen, tekeekö saman kuin allaoleva, siivottu versio:
int main(void)
{
int tulos;
tulos = yyparse();
return(tulos);
}
Outoa C -kieltä ?
10
829
Vastaukset
- se vaan on
Ei kutsu, vaan se on funktion esittely. Tarkoittaa että yyparse() on jossain toisessa tiedostossa. Hyvä tapa olisi kirjoittaa:
extern int yyparse();
Mutta koska extern on oletus niin ei ole pakko. Mutta tässä on pakko:
main()
{
int yyparse();
extern int foo;
return(yyparse());
}
Siis foo on jossain toisessa tiedostossa globaalina. Linkkeri kasaa homman .o-tiedostoista. Ilman externiä foo olisi tietysti mainin lokaali muuttuja.- ....
Miksi laitat funktion prototyypin ja intin funktion sisälle? Epäselvää.
Ja miksi laitat paluuarvon sulkuihin? Ei return ole funktio! Ei ne sulut haittaa, mutta ovat turhia.
Näin:
int yyparse(void);
extern int foo;
main()
{
return yyparse();
} - .....
.... kirjoitti:
Miksi laitat funktion prototyypin ja intin funktion sisälle? Epäselvää.
Ja miksi laitat paluuarvon sulkuihin? Ei return ole funktio! Ei ne sulut haittaa, mutta ovat turhia.
Näin:
int yyparse(void);
extern int foo;
main()
{
return yyparse();
}siis tietenkin myös mainissa pitää olla tyyppi:
int yyparse(void);
extern int foo;
int main(void)
{
return yyparse();
} - vaiko selvää?
.... kirjoitti:
Miksi laitat funktion prototyypin ja intin funktion sisälle? Epäselvää.
Ja miksi laitat paluuarvon sulkuihin? Ei return ole funktio! Ei ne sulut haittaa, mutta ovat turhia.
Näin:
int yyparse(void);
extern int foo;
main()
{
return yyparse();
}"Miksi laitat funktion prototyypin ja intin funktion sisälle? Epäselvää."
Ei se ole (mielestäni) epäselvää, jos sitä muuttujaa tai funktiota käytetään *vain yhdessä* funktiossa. Jos useassa, niin sitten blokkien ulkopuolella. Toinen tapahan tehdä homma on tietysti .h-tiedoston avulla.
"Ja miksi laitat paluuarvon sulkuihin? Ei return ole funktio! Ei ne sulut haittaa, mutta ovat turhia."
Totta, mutta ne oli tuossa alkuperäisessä. Itse tekisin näin:
int somefunc()
{
extern int yyparse();
extern int foo;
return foo yyparse();
}
Siis extern aina mukaan selvyyden vuoksi. - ....
vaiko selvää? kirjoitti:
"Miksi laitat funktion prototyypin ja intin funktion sisälle? Epäselvää."
Ei se ole (mielestäni) epäselvää, jos sitä muuttujaa tai funktiota käytetään *vain yhdessä* funktiossa. Jos useassa, niin sitten blokkien ulkopuolella. Toinen tapahan tehdä homma on tietysti .h-tiedoston avulla.
"Ja miksi laitat paluuarvon sulkuihin? Ei return ole funktio! Ei ne sulut haittaa, mutta ovat turhia."
Totta, mutta ne oli tuossa alkuperäisessä. Itse tekisin näin:
int somefunc()
{
extern int yyparse();
extern int foo;
return foo yyparse();
}
Siis extern aina mukaan selvyyden vuoksi.Olen edelleen sitä mieltä, että on erittäin hämäävää jos ei-lokaaleita funktioita tai muuttujia laitetaan funktiomäärittelyn sisään. Funktiomäärittelyn sisään laitetaan vain ja ainoastaan funktion itsensä käyttämät muuttujat. Tarkemmin sanottuna ei funktion sisään, vaan lohkon sisään. (Funktiokin on lohko.)
Esimerkki:
extern int x, y;
void func1(void) {
int z = lakse(x,y);
while(ehto()) {
int i;
for(i=0; i - on tää...
.... kirjoitti:
Olen edelleen sitä mieltä, että on erittäin hämäävää jos ei-lokaaleita funktioita tai muuttujia laitetaan funktiomäärittelyn sisään. Funktiomäärittelyn sisään laitetaan vain ja ainoastaan funktion itsensä käyttämät muuttujat. Tarkemmin sanottuna ei funktion sisään, vaan lohkon sisään. (Funktiokin on lohko.)
Esimerkki:
extern int x, y;
void func1(void) {
int z = lakse(x,y);
while(ehto()) {
int i;
for(i=0; iEn minäkään normaalisti esittele funktiota/muuttujia blokin sisällä, mutta ketjun ajoittaja ihmetteli mikä kumma on 'int yyparse();' funktion sisällä. Mutta JOS siten niitä esittelee niin pistää sitten sen 'extern'-määreen mukaan, joka (ehkä) vihjaa koodaria että mistä on kyse.
Tietääkseni ei ole mitään syytä 'hakea' esittelyllä globaalia .c-tiedostossa externillä, vaan aina voidaan käyttää header-tiedostoja. Mutta koska tällaista koodia näkee, niin pitää tietää että se on mahdollista ja 'laillista', mutta huonoa tyyliä.
Siis vielä kerran: EN SUOSITTELE globaalien esittelyä .c-tiedostoissa en lohkon sisällä enkä ulkona, vaan .h-filuissa kuten sinäkin kirjoitit.
(Ja tietysti 'static'-määrettä tulee käyttää c-tiedostossa funktioille/muuttujille/vakiolle, jotka halutaan pitää privaattina.) - achat cialis
.... kirjoitti:
Olen edelleen sitä mieltä, että on erittäin hämäävää jos ei-lokaaleita funktioita tai muuttujia laitetaan funktiomäärittelyn sisään. Funktiomäärittelyn sisään laitetaan vain ja ainoastaan funktion itsensä käyttämät muuttujat. Tarkemmin sanottuna ei funktion sisään, vaan lohkon sisään. (Funktiokin on lohko.)
Esimerkki:
extern int x, y;
void func1(void) {
int z = lakse(x,y);
while(ehto()) {
int i;
for(i=0; ibbsvmlli, kamagra, uxenvvdy, Levitra, metbyciw, compra levitra, svadmitw, levitra, nfmiotir,
- viagra costo
.... kirjoitti:
Olen edelleen sitä mieltä, että on erittäin hämäävää jos ei-lokaaleita funktioita tai muuttujia laitetaan funktiomäärittelyn sisään. Funktiomäärittelyn sisään laitetaan vain ja ainoastaan funktion itsensä käyttämät muuttujat. Tarkemmin sanottuna ei funktion sisään, vaan lohkon sisään. (Funktiokin on lohko.)
Esimerkki:
extern int x, y;
void func1(void) {
int z = lakse(x,y);
while(ehto()) {
int i;
for(i=0; imswselbp, kamagra costo, pfyfxbto, kamagra, obqjgrjs, acquisto levitra, dasdidau, kamagra, nuddxhdu,
- ...
"Ja jos syntaksi on laillinen, tekeekö saman kuin allaoleva, siivottu versio:
int main(void)
{
int tulos;
tulos = yyparse();
return(tulos);
}
"
-------------
Ei tuo ole siivottu. Siinä on ihan turha välimuuttuja "tulos". Näin:
int main(void)
{
return yyparse();
}
-----
Jos välimuuttajaa tarvitaan jostain syystä, niin näinkin voi tehdä:
int main(void)
{
int tulos = yyparse();
return tulos;
} - Ogma
vastaan viestiin vaikka se onkin vähän vanha. Uusien listassa se oli kuitenkin merkattu pari päivää vanhaksi. Noh, ilmeisesti palvelupäivitys toi mukanaan uusia ominaisuuksia.
----------------------------------------------------------------------------------------
Oheinen koodin muoto on varmaankin vuodelta sarvi-ja-kypärä. Sen on tuottanut jäsentäjägeneraattori yacc, joka syntyi AT&T:llä joskus 70-luvun lopulla. Sen tuoreempi inkarnaatio bison on varmaan tuottanut ko. koodin.
Koodin muoto on K&R eli C:n luojien Kerningham ja Ritchie:n aikoinaan käyttämään muotoon. Jos main-funktio esitellääm ilman paluuarvoa, niin kääntäjä olettaa paluuarvon olevan int. Parametrinä annettu sulutus nykyisten käytäntöjen mukaan vaatii void:in antamisen.
Yllä olevat koodit eivät ole sama asia. Yllä olevassa koodissa on kyse skooppien käytöstä. Alkuperäisessä on haluttu, että vain main-funktion sisällä tunnetaan yyparse-funktio eikä muualla main-funktion sisältävässä tiedostossa sitä tunneta.
Näin muistaisin skooppien menevän. Alempi funktio aiheuttaa todennäköisesti käännösvirheen.
Ketjusta on poistettu 20 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
- 1077773
Siekkilässä ajettu ihmisten yli- mitä tapahtui? Länsi-Savo ei ole uutisoinut asiata
Manneja, vaiko matuja?1126036- 835187
- 1394546
Alavuden sairaala
Säästääkö Alavuden sairaala sähkössä. Kävin Sunnuntaina vast. otolla. Odotushuone ja käytävä jolla lääkäri otti vastaan113230- 633014
- 582948
Törkeää toimintaa
Todella törkeitä kaheleita niitä on Ylivieskassakin. https://www.ess.fi/uutissuomalainen/8570818102454- 612437
Hei........
Pelkkä sun näkeminen saa mut hymyilemään pitkin iltaa. Oot niin 🤩😘 Edellinen poistettiin.562066