Onko C ohjelmointikieli helppo oppia

Anonyymi

Törmäsin verkossa ärsyttävään opastukseen. ( https://s7.gifyu.com/images/strchr2.png ). Tuossahan opastetaan, selvittämään, onko joku merkki merkkijonossa. Katso kuvaa ja yritä tajuta kuinka tuota soveltaisit omassa ohjelmassasi.

Tein samasta asiasta itse esimerkin, jossa ei ole mukana mitään mikä ei 100% liity asiaan ( https://s7.gifyu.com/images/strchr1.png ). Ja tästä saattaa jo aloittelijakin keksiä kuinka asia pitää hoitaa. Lisätään tähän vielä että tuo verkosta löytynyt ohje on vielä englannin kielinen, joka jo yksinään saattaa estää asian ymmärtämisen.

Niin, onko C helppo oppia?

69

1979

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Lisäksi on näitä täysin virheellisiä ohjeita kuten tämä strcat() ohje, joka opastaa kuinka kaksi merkkijonoa yhdistetään toisiinsa.

      Montako virhettä löydät ohjeesta?

      • Anonyymi

      • Anonyymi

        Kas kun netissä kuka tahansa voi kirjoittaa verkkosivulleen ihan mitä tahansa soopaa. Tämä kannattaa pitää aina mielessä varsinkin, jos perustaa ostopäätöstään nettiarvosteluihin. Jokainen eläköityvä putkimies ja koulupudokas muuttuu nettiin päästessään lääketieteen ja tietotekniikan eritysasiantuntijaksi.


      • Anonyymi
        Anonyymi kirjoitti:

        Kas kun netissä kuka tahansa voi kirjoittaa verkkosivulleen ihan mitä tahansa soopaa. Tämä kannattaa pitää aina mielessä varsinkin, jos perustaa ostopäätöstään nettiarvosteluihin. Jokainen eläköityvä putkimies ja koulupudokas muuttuu nettiin päästessään lääketieteen ja tietotekniikan eritysasiantuntijaksi.

        Niinpä, jotta ei vain sanottaisi jonkin olevan väärin täytyy myös esittää kuinka se tulisi hoitaa. Tässä alla tuon esimerkin virheet korjattuna, ja muotoiltuna niin että asia on helppo ymmärtää:

        #include <stdio.h>
        #include <string.h>
        int main(void) {
        char str1[11] = "Hei";
        char str2[8] = " Seppo!";
        strcat(str1, str2);
        printf("%s", str1);
        return 0;
        }

        En viitsinyt kuvana laittaa, vaikka tiedän ettei nuo tabuloinnit säily.

        int main(void)
        kertoo että ohjelma palauttaa int tyyppisen paluuarvon, ja (void) kertoo että se ei ota vastaan parametreja.

        str1 ja str2 muuttujat vaativat tilanvarauksen, annoin minimi arvot. Joten opastus sisälsi kolme pahaa virhettä.

        Kommentointisi sävystä päätellen on aika lopettaa c:stä puhuminen vähäksi aikaa, tehdään niin.

        Ter. Sekatyömies


      • Anonyymi
        Anonyymi kirjoitti:

        Niinpä, jotta ei vain sanottaisi jonkin olevan väärin täytyy myös esittää kuinka se tulisi hoitaa. Tässä alla tuon esimerkin virheet korjattuna, ja muotoiltuna niin että asia on helppo ymmärtää:

        #include <stdio.h>
        #include <string.h>
        int main(void) {
        char str1[11] = "Hei";
        char str2[8] = " Seppo!";
        strcat(str1, str2);
        printf("%s", str1);
        return 0;
        }

        En viitsinyt kuvana laittaa, vaikka tiedän ettei nuo tabuloinnit säily.

        int main(void)
        kertoo että ohjelma palauttaa int tyyppisen paluuarvon, ja (void) kertoo että se ei ota vastaan parametreja.

        str1 ja str2 muuttujat vaativat tilanvarauksen, annoin minimi arvot. Joten opastus sisälsi kolme pahaa virhettä.

        Kommentointisi sävystä päätellen on aika lopettaa c:stä puhuminen vähäksi aikaa, tehdään niin.

        Ter. Sekatyömies

        Tuhlaat pinomuistia. Varaa merkkijonoille muisti dynaamisesti vaikka malloc()-funktiolla. Joudut käyttämään stdlib-kirjastoa.
        https://www.tutorialspoint.com/c_standard_library/c_function_malloc.htm


      • Anonyymi
        Anonyymi kirjoitti:

        Tuhlaat pinomuistia. Varaa merkkijonoille muisti dynaamisesti vaikka malloc()-funktiolla. Joudut käyttämään stdlib-kirjastoa.
        https://www.tutorialspoint.com/c_standard_library/c_function_malloc.htm

        Niinpä taas palattaisiin siihen mikä on helppo ja mikä ei, esimerkki oli nimen omaan typistetty helposti ymmärrettäväksi.

        Dynaaminen muistinvaraus ( malloc(); ) ja sen vapauttaminen ( free(); ) on vaihtoehto isompien arrays[] muutujien kanssa kun tarvittavan muistin määrää ei tiedetä etukäteen ohjelmaa kirjoitettaessa. Esimerkki sellaisessa tilanteesta kun ohjelmoija ei voi tietää etukäteen, minkä kokoisia tiedostoja käyttäjä haluaa avata ohjelmalla, näin voi olla vaikka kuvankäsittelyohjelman kanssa.

        Mutta tässä yksi tapa rajata ylimääräinen muistinkäyttö, vaikka en kyllä suosittele tähän esimerkinkään tapaukseen, aivan turhaa elvistelyä pienikokoisissa muuttujissa:

        #include <stdio.h>
        #include <string.h>
        int main(void) {
        char str1[sizeof("Hei")] = "Hei";
        char str2[sizeof(str1) sizeof(" Seppo!")] = " Seppo!";
        int m = sizeof(str1) sizeof(str2);
        strcat(str1, str2);
        printf("%s koko: %d", str1, m);
        return 0;
        }


      • Anonyymi
        Anonyymi kirjoitti:

        Niinpä taas palattaisiin siihen mikä on helppo ja mikä ei, esimerkki oli nimen omaan typistetty helposti ymmärrettäväksi.

        Dynaaminen muistinvaraus ( malloc(); ) ja sen vapauttaminen ( free(); ) on vaihtoehto isompien arrays[] muutujien kanssa kun tarvittavan muistin määrää ei tiedetä etukäteen ohjelmaa kirjoitettaessa. Esimerkki sellaisessa tilanteesta kun ohjelmoija ei voi tietää etukäteen, minkä kokoisia tiedostoja käyttäjä haluaa avata ohjelmalla, näin voi olla vaikka kuvankäsittelyohjelman kanssa.

        Mutta tässä yksi tapa rajata ylimääräinen muistinkäyttö, vaikka en kyllä suosittele tähän esimerkinkään tapaukseen, aivan turhaa elvistelyä pienikokoisissa muuttujissa:

        #include <stdio.h>
        #include <string.h>
        int main(void) {
        char str1[sizeof("Hei")] = "Hei";
        char str2[sizeof(str1) sizeof(" Seppo!")] = " Seppo!";
        int m = sizeof(str1) sizeof(str2);
        strcat(str1, str2);
        printf("%s koko: %d", str1, m);
        return 0;
        }

        Ei tuo muuta asiaa mihinkään. Pinomuistia kuluu tasan yhtä rajusti.

        Opetelkaa kakarat ensin assembly, ja siirtykää vasta sitten jonninjoutaviin kieliin.


      • Anonyymi
        Anonyymi kirjoitti:

        Ei tuo muuta asiaa mihinkään. Pinomuistia kuluu tasan yhtä rajusti.

        Opetelkaa kakarat ensin assembly, ja siirtykää vasta sitten jonninjoutaviin kieliin.

        Niin kuluu, mutta se voidaan vapauttaa, ja varata uudestaan uudessa koossa. Ja lopeta tuo "kakarointi". Minäkin aloitin debug ohjelmalla kirjoittamalla suoraan konekielistä koodia, joka oli todella hankalaa jo 20 rivisenä pätkänä. Tein myös pahimman mokani kirjoittamalla suoraan MBR sektoriin. Siihen aikaan ei ollut monikaan kone verkossa, ja tiedon saanti oli kirjaston varassa, menikin pitkä aika ennen kuin asia oli korjattu.


      • Anonyymi
        Anonyymi kirjoitti:

        Niin kuluu, mutta se voidaan vapauttaa, ja varata uudestaan uudessa koossa. Ja lopeta tuo "kakarointi". Minäkin aloitin debug ohjelmalla kirjoittamalla suoraan konekielistä koodia, joka oli todella hankalaa jo 20 rivisenä pätkänä. Tein myös pahimman mokani kirjoittamalla suoraan MBR sektoriin. Siihen aikaan ei ollut monikaan kone verkossa, ja tiedon saanti oli kirjaston varassa, menikin pitkä aika ennen kuin asia oli korjattu.

        Sizeof-operaattorin varaamaa pinomuistia ei vapauteta mitenkään. Käännösvaiheessa tehdään muistinvaraus, joka kestää maailman tappiin. Tulee stack overflow riski.

        Opetelkaa ensin koodauksen alkeet. Jokainen on toki amatööri alkuvaiheessa, itsekin 1970-luvulla. Yrittäkää kehittyä, ja älkää missään nimessä opetelko koodaamaan päin persettä, kuten pinomuistia tuhlaten.

        Aloittakaa aasta, eli assemblystä.


      • Anonyymi
        Anonyymi kirjoitti:

        Sizeof-operaattorin varaamaa pinomuistia ei vapauteta mitenkään. Käännösvaiheessa tehdään muistinvaraus, joka kestää maailman tappiin. Tulee stack overflow riski.

        Opetelkaa ensin koodauksen alkeet. Jokainen on toki amatööri alkuvaiheessa, itsekin 1970-luvulla. Yrittäkää kehittyä, ja älkää missään nimessä opetelko koodaamaan päin persettä, kuten pinomuistia tuhlaten.

        Aloittakaa aasta, eli assemblystä.

        Sizeof ei varaa mitään, sillä selvitetään kohteen tarvitsema tila.


      • Anonyymi
        Anonyymi kirjoitti:

        Ei tuo muuta asiaa mihinkään. Pinomuistia kuluu tasan yhtä rajusti.

        Opetelkaa kakarat ensin assembly, ja siirtykää vasta sitten jonninjoutaviin kieliin.

        Jos viittaan C-kieleen sanalla jonninjoutava niin se kyllä paljastaa että et taida juurikaan ymmärtää ohjelmoinnista tuon taivaallista.

        Nykyiset C-kääntäjät tekevät optimoinnit tapissa niin hyvää binääriä ettei assemblerilla tehty juuri tuo mitään etuja. C-kielellä on kuitenkin mahdollista kirjoittaa paljon laajempia ohjelmia tai kirjastoja kun ohjelman suunnittelu on paljon helpompaa tuollaisella jo lähes ihmismäisellä kielellä.


      • Anonyymi
        Anonyymi kirjoitti:

        Jos viittaan C-kieleen sanalla jonninjoutava niin se kyllä paljastaa että et taida juurikaan ymmärtää ohjelmoinnista tuon taivaallista.

        Nykyiset C-kääntäjät tekevät optimoinnit tapissa niin hyvää binääriä ettei assemblerilla tehty juuri tuo mitään etuja. C-kielellä on kuitenkin mahdollista kirjoittaa paljon laajempia ohjelmia tai kirjastoja kun ohjelman suunnittelu on paljon helpompaa tuollaisella jo lähes ihmismäisellä kielellä.

        Eipä vaan mahtunut C-kielinen ohjelmakoodi mikrokontrollerin muistiin. Oli pakko kirjoittaa softa uusiksi assemblyllä.

        Sinulle suosittelen Scratchia. https://en.scratch-wiki.info/wiki/Scratch_3.0


      • Anonyymi
        Anonyymi kirjoitti:

        Eipä vaan mahtunut C-kielinen ohjelmakoodi mikrokontrollerin muistiin. Oli pakko kirjoittaa softa uusiksi assemblyllä.

        Sinulle suosittelen Scratchia. https://en.scratch-wiki.info/wiki/Scratch_3.0

        Sinulle suosittelen helmitaulua. Kysy jos isi ostaisi semmoisen.

        Tuo on elitismiä ja turhaa elvistelyä kun otsikko puhuu siitä, onko c-kieli helppo oppia. Nykyisin on hyvin erikoisesta sovelluksesta kyse jos harrastelijakäytössä on niin surkea mikrokontrolleri käytössä ettei sinne mahdu C:llä koodaamaan. At-tiny maksaa alle euron kappale, sen saa suoraan USB-portiin ja koodata voi C:llä. Eli kyllä vähän haetaan jo erikoisuutta jos on "pakko" käyttää assyä.

        Eri juttu kokonaan on sitten ammattikäyttö. Eli silloin kun etitään halvinta mahdolista komponenttia jotta suurissa tuotantomäärissä saadaan sääntöä. Sillä keskustelulla ei ole mitään tekemistä taas c-kielen opiskelun kanssa.

        Eli mene vaan itseesi.


      • Anonyymi
        Anonyymi kirjoitti:

        Niinpä, jotta ei vain sanottaisi jonkin olevan väärin täytyy myös esittää kuinka se tulisi hoitaa. Tässä alla tuon esimerkin virheet korjattuna, ja muotoiltuna niin että asia on helppo ymmärtää:

        #include <stdio.h>
        #include <string.h>
        int main(void) {
        char str1[11] = "Hei";
        char str2[8] = " Seppo!";
        strcat(str1, str2);
        printf("%s", str1);
        return 0;
        }

        En viitsinyt kuvana laittaa, vaikka tiedän ettei nuo tabuloinnit säily.

        int main(void)
        kertoo että ohjelma palauttaa int tyyppisen paluuarvon, ja (void) kertoo että se ei ota vastaan parametreja.

        str1 ja str2 muuttujat vaativat tilanvarauksen, annoin minimi arvot. Joten opastus sisälsi kolme pahaa virhettä.

        Kommentointisi sävystä päätellen on aika lopettaa c:stä puhuminen vähäksi aikaa, tehdään niin.

        Ter. Sekatyömies

        On tuo kyllä niin anaalista käyttä funktioita merkkijonojen peruskäsittelyyn, vieläkö noita joutuu C:ssä käyttämään? Tässä D-kielen vastine. Tykkään D:stä siksi, koska se on melkein kuin C, mutta vähän modernisoiduin ominaisuuksin.

        module testi;
        import std.string;
        import std.stdio;

        int main(void) {
        string str1 = "Hei";
        string str2 = " Seppo!";
        str1~= str2;
        writeln(str2);

        return 0;
        }


      • Anonyymi
        Anonyymi kirjoitti:

        On tuo kyllä niin anaalista käyttä funktioita merkkijonojen peruskäsittelyyn, vieläkö noita joutuu C:ssä käyttämään? Tässä D-kielen vastine. Tykkään D:stä siksi, koska se on melkein kuin C, mutta vähän modernisoiduin ominaisuuksin.

        module testi;
        import std.string;
        import std.stdio;

        int main(void) {
        string str1 = "Hei";
        string str2 = " Seppo!";
        str1~= str2;
        writeln(str2);

        return 0;
        }

        Mikä on D -kielen vahvuus, eli millä se on paikkansa lunastanut?


    • Anonyymi

      Pythonilla kaikki onnistuu suoraan paljon paremmin ja nopeammin ilman mitään oppimisvaikeutta. Ja jos ohjelman ajaa Pypyllä, se on aina nopeampi kuin C:llä koodattu risukasa.

      • Anonyymi

        Olet kuutamolla kuin se kuuluisa Tamppoonin naru.

        Pythonissa hyödynnetään tosi paljon aikuisten ohjelmointikielillä tehtyjä kirjastoja.

        Terveisin: konenäkijä


      • Anonyymi

        Olet oikeassa, PyPy on vaihtoehtoinen nopeampi Python-toteutus. PyPy pyrkii nopeuteen ja pienempään muistin käyttöön verrattuna alkuperäisen Python-tulkkiin.

        Olen itsekin testannut tuota nopeutta, ja saanut huomata että noin 2 kertaa nopeammin toimii kuin vastaava C sovellus. Valitettavasti PyPy tulkin kautta ei voi ajaa mitä tahansa Python sovellusta. Mutta silloin kun voi se kannattaa tehdä.


      • Anonyymi
        Anonyymi kirjoitti:

        Olet oikeassa, PyPy on vaihtoehtoinen nopeampi Python-toteutus. PyPy pyrkii nopeuteen ja pienempään muistin käyttöön verrattuna alkuperäisen Python-tulkkiin.

        Olen itsekin testannut tuota nopeutta, ja saanut huomata että noin 2 kertaa nopeammin toimii kuin vastaava C sovellus. Valitettavasti PyPy tulkin kautta ei voi ajaa mitä tahansa Python sovellusta. Mutta silloin kun voi se kannattaa tehdä.

        Lisätäänpä vielä C ei ole mikään risukasa, ei missään nimessä.

        Wikipedia sanoo näin:
        C on yleiskäyttöinen, imperatiivinen ja rakenteinen käännettävä tietokoneiden ohjelmointikieli, joka on levinnyt laajalle 1970-luvulta lähtien, jolloin Dennis Ritchie kehitti sen UNIX-käyttöjärjestelmää varten. Kielessä yhdistyvät koneenläheisyys ja korkean tason kielen ominaisuudet.


      • Anonyymi

        Python on myös parempi merkkijonojen käsittelyssä. Esimerkkinä vaikka tämä

        >>> str="Tämä on yöllä kirjoitettu"
        >>> str.find('ö')

        Pythonilla ei ääkköset ja öökköset ole mikään ongelma, mutta yritäppä C:llä löytää monesko merkki ö on str -merkkijonossa. C:ssä moni merkkijonon käsittelyyn tarkoitettu funktion ei toimi ollenkaan skandien kanssa, ja se syö C:n arvostusta niin pahasti, että jos pitää valita vain toinen niin se on Python.


      • Anonyymi
        Anonyymi kirjoitti:

        Olet oikeassa, PyPy on vaihtoehtoinen nopeampi Python-toteutus. PyPy pyrkii nopeuteen ja pienempään muistin käyttöön verrattuna alkuperäisen Python-tulkkiin.

        Olen itsekin testannut tuota nopeutta, ja saanut huomata että noin 2 kertaa nopeammin toimii kuin vastaava C sovellus. Valitettavasti PyPy tulkin kautta ei voi ajaa mitä tahansa Python sovellusta. Mutta silloin kun voi se kannattaa tehdä.

        Siis häh! Meinaatteko okeasti ja tosissanne että tulkattu koodi olisi nopeampaa suorittaa kuin käännetty? En oikein usko.


      • Anonyymi
        Anonyymi kirjoitti:

        Siis häh! Meinaatteko okeasti ja tosissanne että tulkattu koodi olisi nopeampaa suorittaa kuin käännetty? En oikein usko.

        Tehdäänpäs kokeilu. Kirjoittakaa ohjelma pythonilla joka mittaa kauanko kestää, kun loopissa muutetaan muuttujan arvo nollasta neljään miljardiin yksi numero kerrallaan.

        Tein C-kielellä toteutuksen, näette koodin niin voitte kokeilla omilla koneillanne. Minun i5 @ 2,2 GHz suoriutui karvan alle yhdeksässä sekunnissa, kuten kuvakaappauksesta näette.

        Veikkaan, ettei pythonilla mitenkään päästä noin nopeaan suoritukseen. Mutta kokeilen mielelläni jos joku kirjoittaa tuon saman pythonilla.

        Tässä kuvakaappaus lähdekoodista ja ohjelman ajosta:
        https://i.postimg.cc/cCYjjy6w/looppitesti.png

        ps.
        tuosta kuvasta jäi alusta pois näkyvistä kolme riviä lähdekoodia:

        #include <stdio.h>
        #include <time.h>

        void main(void)


      • Anonyymi

        C:llä siis 9 sekuntia. Ei pitäisi yrittää päässä laskea.


      • Anonyymi
        Anonyymi kirjoitti:

        Siis häh! Meinaatteko okeasti ja tosissanne että tulkattu koodi olisi nopeampaa suorittaa kuin käännetty? En oikein usko.

        Kyllä sinun pitäisi uskoa, se todellakin on monessa tapauksessa noin 2 kertaa nopeampi. Tein WHILE silmukan C:llä ja Pythonilla. Molempien suoritusaika mitattiin Linux järjestelmän omalla ulkoisella time-ajanotolla. Käyttämäni tiedostonimet olivat speed.py ja speed.c

        PYTHON ( speed.py )
        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-
        i = 1
        while i < 4000000000: i = 1

        AJETTU komennolla: time pypy3 speed.py
        real 0m3,284s
        user 0m3,247s
        sys 0m0,020s

        -

        C ( speed.c )
        #include <stdio.h>
        int main(void) {
        unsigned long i = 1;
        while ( i < 4000000000) { i = 1; };
        }

        AJETTU komennolla: time speed
        real 0m6,684s
        user 0m6,681s
        sys 0m0,000s

        Kuten huomaat C kielinen While silmukka, vei yli kaksi (2) kertaa pitempään. Toivottavasti tämä ei nyt sitten poistu moderoinnin vuoksi.


      • Anonyymi
        Anonyymi kirjoitti:

        C:llä siis 9 sekuntia. Ei pitäisi yrittää päässä laskea.

        Arvelinkin että timestampit on ylläpidolle liikaa.

        Pythonilla menis siis 9 minuuttia 16 sekuntia, ja C:llä 9 sekuntia.

        Pythonin luuppi:

        while (n < 4000000000):
            n =1

        Ja C:llä sama:

        while(n < 4000000000) {
            n ;
        }


      • Anonyymi
        Anonyymi kirjoitti:

        Arvelinkin että timestampit on ylläpidolle liikaa.

        Pythonilla menis siis 9 minuuttia 16 sekuntia, ja C:llä 9 sekuntia.

        Pythonin luuppi:

        while (n < 4000000000):
            n =1

        Ja C:llä sama:

        while(n < 4000000000) {
            n ;
        }

        Noniin, eli siis neljään miljariin päästiin

        Python: yli yhdeksän minuuttia

        C-kieli: noin yhdeksän sekunttia



        C-kielellä tehty ohjelma siis pyörii todella paljon nopeammin kuin pythonilla tehty ohjelma. Se ei _tietentkään_ tee pythonista "huonoa" ohjelmointikieltä. Kaikki riippuu käyttätarkoituksesta.

        Selvää kuitenkin on, että silloin kun pitää tehdä tehokasta koodia, tarvitaan joku käännettävä kieli. Näitähän on tietysti monia, esim: C-kieli, C , Pascal, Rust...


      • Anonyymi
        Anonyymi kirjoitti:

        Arvelinkin että timestampit on ylläpidolle liikaa.

        Pythonilla menis siis 9 minuuttia 16 sekuntia, ja C:llä 9 sekuntia.

        Pythonin luuppi:

        while (n < 4000000000):
            n =1

        Ja C:llä sama:

        while(n < 4000000000) {
            n ;
        }

        Kokeilin vielä Javascriptillä Node.js:n kanssa ja tulos oli 8 sekuntia. Eli se toimii suunnilleen yhtä nopeasti kuin C, vaikka onkin tulkattava kieli.


      • Anonyymi
        Anonyymi kirjoitti:

        Tehdäänpäs kokeilu. Kirjoittakaa ohjelma pythonilla joka mittaa kauanko kestää, kun loopissa muutetaan muuttujan arvo nollasta neljään miljardiin yksi numero kerrallaan.

        Tein C-kielellä toteutuksen, näette koodin niin voitte kokeilla omilla koneillanne. Minun i5 @ 2,2 GHz suoriutui karvan alle yhdeksässä sekunnissa, kuten kuvakaappauksesta näette.

        Veikkaan, ettei pythonilla mitenkään päästä noin nopeaan suoritukseen. Mutta kokeilen mielelläni jos joku kirjoittaa tuon saman pythonilla.

        Tässä kuvakaappaus lähdekoodista ja ohjelman ajosta:
        https://i.postimg.cc/cCYjjy6w/looppitesti.png

        ps.
        tuosta kuvasta jäi alusta pois näkyvistä kolme riviä lähdekoodia:

        #include <stdio.h>
        #include <time.h>

        void main(void)

        4E9 luuppi kierrosta 9 sekuntiin, näyttävä suoritus, 1980-luvulla
        10000 for -- next silmukkaa oli varsinainen nopeustesti.

        Itse en käytä enää C:tä, mutta ajattelin kokeilla käytössäni olevilla
        FORTH-versiolla miten käy, FORTHilla oli hidas maine, kun ne olivat
        tulkkikoneita. mutta asiat muuttuvat.

        C ja FORTH ovat hyvin erilaisia kieliä, FORTH on pinokoneelle tarkoitettu,
        siksi aivan täsmällistä käännöstä on hankala tehdä, kun jo loopit toimivat
        eri periaatteella.

        Tein 4E9 kierroksisen BEGIN--UNTIL loopin, tosin sillä muunnoksella että
        käytössäni olevat versiot ovat pinoltaan 32 bittiä leveitä, joten suora osoitus
        pinossa ei onnistu, tai en ala kokeilemaan sitä. Siis tein loopin missä
        pyörii kaksi 2E9 looppia perätysten. Tästä saisi ainakin suuruusluokan.

        : ajo 1 begin 1 dup 2000000000 > until drop ;

        Koodi on tuossa ilman ajanottoa, pitäisi toimia yleisesti FORTHeilla, pinon
        leveys otettava huomioon.

        Käytössäni on kaksi konekielelle kääntävää versiota, VFX Forth ja
        SwiftForth.

        Tulokset ovat: 2X2E9 kierrosta.

        VFX Forth 1.966 sek. nopein aika.
        SwiftForth 2.8 sek.

        Miksi näin nopeita, koodi näyttää että koko operaatio tehdään pinossa.
        mitään muuttujia ei käytetä, pinokäsittely on erittäin nopeaa.

        FORTH on hyvin joustava kieli, tuon kokeen voisi tehdä usealla eri tavalla,
        voi olla että BEGIN--UNTIL on nopein, mitä pitänee kokeilla,


      • Anonyymi
        Anonyymi kirjoitti:

        Lisätäänpä vielä C ei ole mikään risukasa, ei missään nimessä.

        Wikipedia sanoo näin:
        C on yleiskäyttöinen, imperatiivinen ja rakenteinen käännettävä tietokoneiden ohjelmointikieli, joka on levinnyt laajalle 1970-luvulta lähtien, jolloin Dennis Ritchie kehitti sen UNIX-käyttöjärjestelmää varten. Kielessä yhdistyvät koneenläheisyys ja korkean tason kielen ominaisuudet.

        "Kielessä yhdistyvät koneenläheisyys ja korkean tason kielen ominaisuudet."

        Tuo kuvaus sopii paremmin Delphiin kuin C -kieleen.

        Ja jos sekaan haluaa sotkea assembly -kieltä, niin assembly -kielen yhdistäminen Delphiin on helpompaa kuin assembly -kielen yhdistäminen C -kieleen. Syynä tähän C -kielen sekavat "constraints" -säännöt.

        Kumpikaan kieli ei suoraan tue CPU:n carry flagin käsittelyä, toki inline assemblyä käyttämällä se onnistuu helposti (Delhissä) tai vaikeasti (C -kielessä).


      • Anonyymi
        Anonyymi kirjoitti:

        Python on myös parempi merkkijonojen käsittelyssä. Esimerkkinä vaikka tämä

        >>> str="Tämä on yöllä kirjoitettu"
        >>> str.find('ö')

        Pythonilla ei ääkköset ja öökköset ole mikään ongelma, mutta yritäppä C:llä löytää monesko merkki ö on str -merkkijonossa. C:ssä moni merkkijonon käsittelyyn tarkoitettu funktion ei toimi ollenkaan skandien kanssa, ja se syö C:n arvostusta niin pahasti, että jos pitää valita vain toinen niin se on Python.

        "Python on myös parempi merkkijonojen käsittelyssä. Esimerkkinä vaikka tämä

        >>> str="Tämä on yöllä kirjoitettu"
        >>> str.find('ö')"

        Samoin Delphissä:

        var
        S : String;
        n : Integer;

        begin

        S := 'Tämä on yöllä kirjoitettu';
        n := pos('ö', S);

        // muuttujassa n on nyt arvo 10, koska "ö" on tuon merkkijonon 10. merkki.

        end;

        Edes FreePascal / Lazarus ei yllä tässä samaan helppouteen kuin Delphi.

        Jos merkkijonossa olisi vaikkapa ä -kirjain ennen ö- kirjainta, niin FreePascalin pos() -funktio palauttaisi epäjohdonmukaiselta näyttäviä arvoja, tosin ne ovat loogisia (omalla tavallaan).

        Kas kun FreePascal käyttää UTF-8 -enkoodattua unicodea merkkijonojensa sisäisenä esitystapana, jolloin ä ja ö kirjaimet kuluttavat yli 1 tavu/kirjain, mutta kirjaimet a-z kuluttavat tasan 1 tavu/kirjain.

        Windowsissa käytetään usein UTF-16 -enkoodattua unicodea.

        Tässä ei suomen kielen ä ja ö -kirjainten kohdalla synny vastaavaa ongelmaa, mutta kokeilepa vaikkapa jotain näistä merkeistä (U+10840 .. U+1085F):

        https://en.wikipedia.org/wiki/Imperial_Aramaic_(Unicode_block)

        Niissä käy myös niin, että 1 merkki = 2 enkoodausyksikköä.

        Tässä enkoodausyksikkönä on 16-bittinen WORD.

        Kannattaa vielä huomata:

        JOS valitaan vaikkapa merkki U+10840, niin se korrekti (ja Unicode consortiumin hyväksymä) koodaustapa UTF-8 -esitystavalla kuluttaa 4 tavua.

        MUTTA:

        Väittäisinpä, että 99% - 100% GPL -lisensioiduista linux -käyttöjärjestelmässä ajettavista ohjelmista ei osaa koodata tuota merkkiä oikein, vaan koodaa sen virheellisesti 6 -tavuiseksi kummajaiseksi !

        Tällainen vaihtoehtoinen koodaustapa ei ole eikä ole koskaan ollutkaan Unicode consortiumin hyväksymä koodaustapa.

        MIKSI?

        Koska avoimen lähdekoodin fanaatikot (jotka linux -maailmassa tekevät päätökset, ikävä kyllä) eivät suostu uskomaan, että jos joki BMP (Basic Multilingual Page):hen kuulumaton merkki esitetään UTF-16 -enkoodauksella 2 peräkkäisellä surrogate -arvolla, niin tuota EI SAA koodata UTF-8:ksi niin, että koodaa kummankin surrogaten erikseen (mutta näin jokin linuxissa yleisesti käytetty kirjasto, olisiko libiconv tai jotain, toimii, vaikka se rikkoo törkeästi unicode -standardia) , vaan oikein on ensin purkaa nuo 2 peräkkäistä surrogate -arvoa 21 -bittiseksi UNICODE -koodiksi, ja vasta sitten enkoodata tämä 21-bittinen UNICODE -koodi UTF-8 -enkoodauksella, jolloin saadaan oikea ja standardinmukainen 4-tavuinen UTF-8 -enkoodattu esitysmuoto tuollaiselle merkille.

        Montakohan (kymmentä) vuotta vielä kuluu, ennekuin kovapäiset linux -fanaatikot tämän suostuvat tajuamaan, ja korjaamaan linux -kirjastonsa sellaiseksi, että se osaisi enkoodata myös Basic Multilingual Page:en kuulumattomat unicode -merkit UTF-8:ksi oikein eli standardinmukaisella tavalla ????


    • Anonyymi

      "Käännösvaiheessa tehdään muistinvaraus, joka kestää maailman tappiin."

      Tuolla tavalla joku väitti tuossa yläpuolella ettei varattu muisti vapaudu. Tein pienen ohjelman jolla asian voi itse testata. Sinulla pitää olla joku mistä näet vapaan muistin suorituksen eri vaiheissa.

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>

      void test( void ) {
      char *str;
      str = (char *) malloc(1500000000);
      memset(str,'$',1500000000);
      printf( "Muisti varattu!");
      getchar( );
      free(str);
      printf( "Muisti vapautettu!");
      getchar( ); }

      int main () {
      printf( "Seuraa muistin käyttöä!");
      getchar( );
      test();
      return(0); }

      • Anonyymi

        Jollei ole mitään muuta niin Linuxin ( free ) komento näyttää käytetyn ja vapaan muistin. Joudut vain avaamaan kaksi komentokehoiteikkunaa, toisessa ajat tuon testin, ja toisessa luet muistin tilan.


    • Anonyymi

      Mikähän lie kun ketjulistaus ei päivity. 18 min odottelin ketjulistauksen päivittymistä, ei tullut.

      • Anonyymi

        Tämä ketjulistauksen päivityskäytäntö on varmaankin muutettu noiden sämppäreiden vuoksi.


      • Anonyymi
        Anonyymi kirjoitti:

        Tämä ketjulistauksen päivityskäytäntö on varmaankin muutettu noiden sämppäreiden vuoksi.

        Ei hyvä tällä tavalla.


    • Anonyymi

      Basick kieli on helpompaa.

      10 PRINT "SEPPO"
      20 GOTO 10

      RUN

      • Anonyymi

        Tai sama C-kielellä:

        #include <stdio.h>

        void main(void)
        {
        int i = 1;

        while(i)
        {
        printf("SEPPO\n");
        }

        }

        Kääntäminen:
        gcc seppo.c -o sepotin
        Ajaminen:
        ./sepotin

        Tosin, myös C-kielessä on goto-käsky olemassa. Sen käyttäminen vaan on kamalan rumaa.


    • Anonyymi

      Ylläpito hei, olisitteko niin hyvä ja poistaisitte nuo harjaavat viestit. KIITOS

      • Anonyymi

        Automaatti poistelee nyt vääriä viestejä. Nuo ilkeilyt täältä joutaa pois.


      • Anonyymi

        Kiitosta paljon.


    • Anonyymi

      Sinä joka annoit näytteen BASIC koodista, viestisi poistui varmaan siksi, että se sisälsi isoja kirjaimia liikaa suhteessa viestin pituuteen.

      • Anonyymi

        S24-nörtit kehittelemässä sääntöjä. Toivottavasti pääsevät joskus tekemään oikeaakin laindäädäntöä.


      • Anonyymi
        Anonyymi kirjoitti:

        S24-nörtit kehittelemässä sääntöjä. Toivottavasti pääsevät joskus tekemään oikeaakin laindäädäntöä.

        Kyllä minuakin harmittais :)


      • Anonyymi
        Anonyymi kirjoitti:

        Kyllä minuakin harmittais :)

        C on yksi vaikeimmista kielistä kirjoittaa oikein ensi yrittämällä. Itse kirjoittaisin tuon while(i) silmukan ilman i:tä, eli for(;;) muistamalla, että for-silmukan kaikki parametrit ovat optionaalisia. Kielen huono puoli tosiaan on se, että se mahdollistaa huonon koodin kirjoittamisen vähän turhankin helpolla ja tästä syystä joutuu käyttämään linteriä ja -Wall yms. tarkistuksia. Ehkäpä pitäisi sitten opetella jokin parempi kieli, vaikka Haskell - tai sitten ei..


    • Anonyymi

      Ei onnistu vastata, moderointi poistaa tänään kaikki viestit, mitä yrittää kirjoittaa. Kumma että eilen sai kirjoitettua ja kaikki viestit jäivät näkymään. Taas rupeaa korpeemaan tämä suomi24 sivuston moderointi. Mailman huonoin sivusto.

    • Anonyymi

      Kumma että noinkin nyrjähtänyt kieli on saanut merkittävän aseman eikä esim työsuojelutarkastaja ole puuttunut asiaan.

    • Anonyymi

      Silmukkatesteissä kannattaa huomata että kääntäjät ja tulkit optimoi niitä lennossa jos huomaavat että ovat dummeja. Kääntäjät/tulkit tekee nykyään ihmeellisiä asioita.

      Kyllä C-kielellä tehty ja käännetty koodi on paljon nopeampaa kuin Pythonilla.
      MUTTA Pythoniin on loistavia kirjastoja jotka on nopeita. Lienevät kirjoitettu C:llä.

      Jos Python olisi nopeampi ja tehokkaampi kuin C niin kaippa Linux olisi kirjoitettu uudelleen Pythonilla ...

    • Anonyymi

      Perustiedot ohjelmoinnista pitäisi kuitenkin tietää mikä oli A-kieli tietystikin Assembly, sitten tuli B-kieli, sitten tuli C-kieli joka on hallitseva aina tehokkaissa sovelluksissa.

    • Anonyymi

      Mikä tahansa ohjelmointikieli on helppoa oppia jos on ymmärrystä logiikasta ja loogisesta päättelystä että matemaattisia taitoja.

      Ohjelmonti vaatii myös pitkäjännitteisyyttä.

      Itse en kuitenkaan C kieltä ihan ensimmäisenä lähtisi opiskelemaan, ainakin jos tarkoitus on itsekseen kotona opiskella ja oppia.

      Itse suosittelisin:

      1) Opettele bash-skriptaus ensin (Linux)
      2) PHP tai Python
      3) Nyt vasta C, tai vähän PERLiä ensin

      • Anonyymi

        Tuosta ensimmäisestä kohdasta olen täysin samaa mieltä. On ehdottoman tärkeää tuntea oma käyttöjärjestelmänsä mahdollisuudet.

        Pythonissakin os -kirjasto on pelkästään käyttöjärjestelmän omien mahdollisuuksien soveltamista, ellei järjestelmäänsä tunne on ihan turha kirjoittaa riviä:

        import os


    • Anonyymi

      Kyllä, pythoniin tulee paljon import:ia ihan sen mukaan että mitä tarvitsee tehdä, aivan kuten C -kielessä tulee #include:ja, ja C:ssä pitää käytännössä aina kuitenkin laittaa se kuuluisa #include "stdio.h"....

    • Anonyymi

      Sen enempää asiaan tutustumatta kommentoin vain että jos AP:n tehtävänannossa on tarkoitus C -kielellä etsiä jonkin merkki merkkijonosta, niin se tapahtuu funktiolla 'strchr'.

      Ja näitä funktioita C-kielessä riittää, ja ne kaikki vaan pitää opetella ja muistaa. Kyse on ihan samasta asiasta kuin että opettelisi vieraita kieliä.

      Omista korkeakouluopinnoista Yliopistolla muistan että siellä proffa oli antanut laskarit kotiin, ja minähän tein työtä käskettyä. Sitten luennolla proffa alkoi selittämään että 'yksi näistä tehtävistä näköjään osoittautui aika vaikeaksi kun siitä tuli niin paljon kysymyksiä sähköpostilla'.

      Ihmettelin vaan, ja sitten tavalliseen tapaan proffa tuli tarkistamaan kaikkien laskarit, ja ihmetteli ja pyöritteli päätään että mitä kummaa oikein olin tehnyt. Selitin vain että 'tehtävän anto oli tehdä olio joka luo olioita'...

      Proffa vaan pyörittelee päätään ja toteaa että, 'noh, olio-ohjelmointiahan tässä tehdään joka tapauksessa niin kyllä se sinulla hanskassa alkaa olemaan', ja kaikki laskarit kuitattiin tehdyksi ja hyväksytyksi.

      Eli siis tosielämässä, niin opiskellessa kuin työelämässä tulee tapauksia jotka voi joskus olla vähän hankalasti hahmotetavissa, ja sitten näkee välillä myös aika 'mienekiintoisia' virityksiä mutta, no, oppia ikä kaikki...

      • Anonyymi

        Eli et tiedä C -ohjelmoinnista mitään.


      • Anonyymi
        Anonyymi kirjoitti:

        Eli et tiedä C -ohjelmoinnista mitään.

        ....ja väitteesi perustuu mihin faktaan....?


    • Anonyymi

      Hieman vaikeampi kuin Fortran.

    • Anonyymi

      Justiinsa niin tuo että niin tytöt haluavat tietokoneensa tekemään mitä itse haluavat, joka olisi mukavaa..

    • Anonyymi

      Tuollainen on aika hauskaa jos osaa ohjelmoida grariikkakiihdyttimien ominaisuuksia ja shader, blader, light fodus what ever, mutta niin tee vahingossa joku hassu grafiikkakiihdytiin piirää ruudull3 :DS

    • Anonyymi

      Kyllä C-kielen oppii jos halua on, sillä on hyvä tylsistyttää aivonsa
      töissä.
      Mutta jos haluat älyllistä seikkailua ohjelmoinnin parissa, parempia
      vaihtoehtoja on tarjolla.
      En tarkoita eksoottisia aivojen nyrjäyttäjiä, vaan jotain sellaista jolla
      voi rakentaa hyödyllistä, vaikka mikrokontrolleri avaruusluotaimeen.

      Voisin melkein suositella forth-nimistä kieltä, ei fortran, se on toinen juttu.
      Siinä missä c:n pino on piilotettu kääntäjän käyttöön, forthissa se näkyvillä
      ohjelmoijan käytössä, sen kautta hoidetaan kaikki parametri liikenne.
      Tämä tuntuu tutulta hp:n laskimista, siellä on samanlainen pinosysteemi
      ja käänteinen puolalainen logiikka, mikä yksinkertaistaa laskemista.

      Forth on eräs vaihtoehto pinokoneiden kieleksi, se hyviä puolia on nopea
      ohjelman rakentaminen, tiivis koodi, jopa konekieltä tiukempaa,
      avaruusluotaimet pitävät siitä, ohjelmien testaus ja debuggaus erittäin
      yksinkertaista, kääntäminen hyvin nopeaa, ei linkkeriä.

      Haitaksi voisi laskea koodin lukemisen vaikeutta, näyttää kryptiseltä,
      koska siinä ei yleensä näy pinon sisältöä, vain funktiot jotka käsittelevät pinoa.
      Koodi on vain funktioluetteloa erotettuna välilyönnillä, joten syntaksi on
      erittäin yksinkertaista.
      Forthia on sanottu ohjelmoijan vahvistimeksi, hyvä ohjelmoija tekee hyvää
      koodia, huono saa aikaan hirvittävää koodia, c tarjoaa runsaasti köyttä mihin
      voi hirttäytyä, forth tarjoaa säkillisen myrkkykäärmeitä ja liekinheittimen.

      Kun tutustuin c-kieleen, vaikutelmaksi tuli "ai näin se tehdään c-kielellä", ja
      yritin ottaa selvää risuaidasta.
      Forthilla voi käyttää luovuutta, kääntäjä ei pakota ohjelmoijaa raameihinsa,
      forthilla olen kokenut aitoa luomisen riemua, "ai näin sen voi tehdä" tyyliin.
      Forthilla voit laajentaa kääntäjää, jos haluat eri tavalla käyttäytyvän muuttujan
      voit tehdä sen, se on sitten erottamaton osa kieltä.

      Koodi esimerkkinä yksinkertainen, jopa huvittava, ehkä käyttökelpoinen.

      : 1 1 ;
      : on kääntäjän käynnistysmerkki.
      1 on funktion nimi, ei aivan funktio, kuten perinteisissä kielissä.
      1 toiminta joka suoritetaan, pinossa oleva numeroa kasvatetaan yhdellä,
      pinossa 5 1 jälkeen 6.
      ; kääntäjälle lopetusmerkki.

      Jos aikaisemmin on joutunut käyttämään 1 , välimerkki välissä, tuon
      jälkeen voi käyttää 1 , se on tullut uudeksi osaksi kieltä.



      Eri kielistä on hyvä sivu, googlatkaa .
      Rosettacode.org
      Sieltä sitten Explore.

    • Anonyymi

      Tämän ketjun pilasi moderointi ja rollit yhdessä toisiaan tukien, jalkoihin jäi python taitajat.

    • Anonyymi

      C-kielen formaali on tekninen, ja teknisenäkin osittain matemaattisesta merkintätavasta poikkeava.
      Esimerkiksi Basic-kielen formaali on kielellinen ja matemaattista merkintätapaa noudattava.

      Ohjelmointi on myös ajattelua. Onko järkevää ajatella teknisen formaalista kun voi ajatella kielellisesti? Pidemmän päälle tekninen formaali aiheuttaa aina vain monimutkaisempia rakennelmia, jotka ikävä kyllä johtavat lopulta tuhoon. Katsokaa vaikka nykyaikaisten internetsivujen "koodia".

      • Anonyymi

        Tuosta ymmärsin hyvin vähän, tai en sitäkään.

        C on yleiskäyttöinen, yksiselitteisiin komentoihin perustuva, käännettävä, tietokoneiden ohjelmointikieli. Kun taas Basic on aloittelijalle sopiva ohjelmointikieli.


      • Anonyymi
        Anonyymi kirjoitti:

        Tuosta ymmärsin hyvin vähän, tai en sitäkään.

        C on yleiskäyttöinen, yksiselitteisiin komentoihin perustuva, käännettävä, tietokoneiden ohjelmointikieli. Kun taas Basic on aloittelijalle sopiva ohjelmointikieli.

        Onko ruotsin kieli helppo oppia? On jos haluaa ja jaksaa opiskella.

        Onko saksan kieli helppo oppia? On, jos jakssa opiskella, mutta helpompaa on jos osaa jo ruotsia.

        Onko japanin kieli helppo oppia? On, jos jaksaa opiskella. mutta suomalaiselle kaikista helpointa koska lausuntatapa on sama suomenkielen kanssa.

        Kirja käteen ja lukemaan. Niin minäkin tein, aikana jolloin ei ollut nettiä muuten kun modeemilla käytettävissä...


    • Anonyymi

      Kun löytää mielekiintoisen kohteen rakentaa, ei sitä tehdessä kielen vaikeus tule mieleen.

    • Anonyymi

      Taitaa jankkaava toksinen koodari olla / c:stä

    • Anonyymi

      Ota Microsoftilta joku Visual C++ ohjeistus voi toimia paremmin vaikka:
      https://learn.microsoft.com/en-us/visualstudio/get-started/visual-studio-ide?view=vs-2022

      Itselläni oli melkein pakko hommata uusi kone joka olisi kuin peruskäyttäjän juttu kun OpenGL-juttuja ja pitää saada sellaisia että Stand-Alone -juttuja niin voi testata sellaisella miten toimii eikä ole mitään puuttuvia Dillejä eli DLL-tiedostojakaan.

      OpenGL, niin joo Silicon Graphics, aina tulee vastaan tuo Hardware Acceleration noissa grafiikkajutuissa:
      https://en.wikipedia.org/wiki/Silicon_Graphics

    • Anonyymi

      Mikä on bussikuski?= Bus Dricewr listaa kaikki laitteet jättimäinen lista mitä laitteita on emolevyllä ja kaikki heh, oikeasti tuollainen pyyntö.. assemblyäkin koodia, hirviölista kaikista emolevyllä olevista tuotteista.

    Ketjusta on poistettu 10 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Katso: Ohhoh! Miina Äkkijyrkkä sai käskyn lähteä pois Farmi-kuvauksista -Kommentoi asiaa: "En ole.."

      Tämä oli shokkiyllätys. Oliko tässä kyse tosiaan siitä, että Äkkijyrkkä sanoi asioita suoraan vai mistä.... Tsemppiä, Mi
      Tv-sarjat
      135
      5559
    2. Voi kun mies rapsuttaisit mua sieltä

      Saisit myös sormiisi ihanan tuoksukasta rakkauden mahlaa.👄
      Ikävä
      33
      3425
    3. Haluan jutella kanssasi Nainen

      Olisiko jo aika tavata ja avata tunteemme...On niin paljon asioita joihin molemmat ehkä haluaisimme saada vastaukset...O
      Ikävä
      17
      1893
    4. Poliisiauto Omasp:n edessä parkissa

      Poliisiauto oli parkissa monta tuntia Seinäjoen konttorin edessä tänään. Haettiinko joku tai jotain pankista tutkittavak
      Seinäjoki
      23
      1865
    5. Onko mies niin,

      että sinulle ei riitä yksi nainen? Minulle suhde tarkoittaa sitoutumista, tosin eihän se vankila saa olla kummallekaan.
      Tunteet
      24
      1720
    6. Voitasko leikkiä jotain tunnisteleikkiä?

      Tietäisi ketä täällä käy kaipaamassa.. kerro jotain mikä liittyy sinuun ja häneen eikä muut tiedä. Vastaan itsekin kohta
      Ikävä
      73
      1548
    7. Tietysti jokainen ansaitsee

      Hän varmasti ansaitsee vain parasta ja sopivinta tietenkin, suon sen onnen hänelle enemmän kuin mielelläni. Aika on nyt
      Ikävä
      14
      1463
    8. Armi Aavikko Malmin hautausmaa

      Haudattiinko Armi arkussa Malmin hautausmaalle vai tuhkattiinko hänet? Kuka tietää asiasta oikein?
      Kotimaiset julkkisjuorut
      11
      1346
    9. Haluisin suudella ja huokailla

      ja purra kaulaasi ja rakastella sinua. Haluisin puristella rintojasi ja pakaroitasi. Ei sinulla taida olla kuitenkaan ni
      Ikävä
      16
      1337
    10. Miksi näin?

      Miksi vihervassut haluaa maahan porukkaa jonka pyhä kirja kieltää sopeutumisen vääräuskoisten keskuuteen? Näin kotoutumi
      Maailman menoa
      23
      1308
    Aihe