Koodaus: Eka C-ohjelma ei toimi

aloitteleva_C-koodari

Tein allaolevan ohjelman moikka.c
#include <stdio.h>
int main(void)
{
printf("Hyvin menee\n");
return 0;
}

Käänsin sen gcc:llä moikka-nimiseksi ja annoin suoritusoikeudet.
Nyt vaan ei millään käyttis (Ubuntuun perustuva) suostu käynnistämään sitä vaan herjaa:

moikka: komentoa ei löytynyt

Missä mahtaa olla vika?

30

541

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • väännös

      Onko siellä hakemistossa edes käännettyä ohjelmatiedostoa? Siitä on nyt aikaa kun viimeksi linuxilla käänsin ceetä, mutta joku lisäpalikka piti asentaa. Oletuksena ei ole kuin c kikkareet.

      ./moikka

      • aloitteleva_C-koodari

        On käännetty ohjelmatiedosto mutta se ei toimi. :(


      • aloitteleva_C-koodari
        aloitteleva_C-koodari kirjoitti:

        On käännetty ohjelmatiedosto mutta se ei toimi. :(

        Pahus, en huomannut että ohjelma pitääkin käynnistää ./-etuliitteellä, nyt toimii.

        Toinen kysymys on se että koitin tehdä ohjelman joka kysyy etunimeä ja sitten tulostaa ruudulle "Terve, xxxx" jossa x:t on siis nimi.
        Eli tällainen koodi:

        #include <stdio.h>
        #include <ctype.h>

        int main(void)
        {
        char x, y;
        printf("Mikä on nimesi?\n");
        scanf("&x", y);
        printf("Terve, &x\n",y);
        return 0;
        }

        Mutta kääntäjä herjaa virheistä eikä tuo suostu tulostamaan nimeä, miten saan nimen luettua muuttujaan?


      • C.on.helppo.kieli
        aloitteleva_C-koodari kirjoitti:

        Pahus, en huomannut että ohjelma pitääkin käynnistää ./-etuliitteellä, nyt toimii.

        Toinen kysymys on se että koitin tehdä ohjelman joka kysyy etunimeä ja sitten tulostaa ruudulle "Terve, xxxx" jossa x:t on siis nimi.
        Eli tällainen koodi:

        #include <stdio.h>
        #include <ctype.h>

        int main(void)
        {
        char x, y;
        printf("Mikä on nimesi?\n");
        scanf("&x", y);
        printf("Terve, &x\n",y);
        return 0;
        }

        Mutta kääntäjä herjaa virheistä eikä tuo suostu tulostamaan nimeä, miten saan nimen luettua muuttujaan?

        Linuxit ovat sekavia, oikeastaan täysiä paskoja jos totta puhutaan.

        Mihin käytät ctype-kirjastoa? Char on C-kielen primitiivi tietotyyppi.

        Miksi et varaa merkkijonolle tilaa? Käyttäisin stdlib-kirjaston calloc-funktiota. Muista sitten vapauttaa muisti, jos päädyt allokoimaan muistia erikseen.

        Pinomuistia ei saa koskaan käyttää, jos on mahdollisuus koodata järkevästi. Eli opettele heti alussa dynaaminen muistinvaraaminen.


      • aloitteleva_C-koodari kirjoitti:

        Pahus, en huomannut että ohjelma pitääkin käynnistää ./-etuliitteellä, nyt toimii.

        Toinen kysymys on se että koitin tehdä ohjelman joka kysyy etunimeä ja sitten tulostaa ruudulle "Terve, xxxx" jossa x:t on siis nimi.
        Eli tällainen koodi:

        #include <stdio.h>
        #include <ctype.h>

        int main(void)
        {
        char x, y;
        printf("Mikä on nimesi?\n");
        scanf("&x", y);
        printf("Terve, &x\n",y);
        return 0;
        }

        Mutta kääntäjä herjaa virheistä eikä tuo suostu tulostamaan nimeä, miten saan nimen luettua muuttujaan?

        Char tyyppi sisältää arvot -128-128 eli siihen mahtuu yksi merkki. unsigned char x[128]; esittelee jo merkkijonon johon mahtuu 128 merkkiä. unsigned taitaa olla oletus, mutta ei siitä haittaakaan ole.


      • malloc-free
        Mikko_Tku kirjoitti:

        Char tyyppi sisältää arvot -128-128 eli siihen mahtuu yksi merkki. unsigned char x[128]; esittelee jo merkkijonon johon mahtuu 128 merkkiä. unsigned taitaa olla oletus, mutta ei siitä haittaakaan ole.

        Taulukon varaaminen pinomuistista ei ole hyvän ohjelmointitavan mukaista. Kannattaa heti alkuun opetella käyttämään muistinvaraus- ja vapautusfunktioita.


      • Turbo-Urpo
        aloitteleva_C-koodari kirjoitti:

        Pahus, en huomannut että ohjelma pitääkin käynnistää ./-etuliitteellä, nyt toimii.

        Toinen kysymys on se että koitin tehdä ohjelman joka kysyy etunimeä ja sitten tulostaa ruudulle "Terve, xxxx" jossa x:t on siis nimi.
        Eli tällainen koodi:

        #include <stdio.h>
        #include <ctype.h>

        int main(void)
        {
        char x, y;
        printf("Mikä on nimesi?\n");
        scanf("&x", y);
        printf("Terve, &x\n",y);
        return 0;
        }

        Mutta kääntäjä herjaa virheistä eikä tuo suostu tulostamaan nimeä, miten saan nimen luettua muuttujaan?

        Tässä esimerkissä otetaan vastaan samalla kertaa, Etunimi ja Sukunimi, lisäksi mukana on värit.

        https://s22.postimg.cc/pj5dwikgh/Valinta_030.png

        #include <stdio.h>
        int main(void){
        #define NORM "\x1B[0m"
        #define PUNA "\x1B[31m"
        #define VIHR "\x1B[32m"
        char enimi, snimi[20];

        printf(VIHR);
        printf("Mikä on nimesi? ");
        printf(NORM);
        scanf("%s %s", &enimi, &snimi);
        printf(VIHR);
        printf("Terve ");
        printf(PUNA);
        printf("%s %s", &enimi, &snimi);
        printf(NORM);
        return 0; }


      • bugeja-piisaa
        Turbo-Urpo kirjoitti:

        Tässä esimerkissä otetaan vastaan samalla kertaa, Etunimi ja Sukunimi, lisäksi mukana on värit.

        https://s22.postimg.cc/pj5dwikgh/Valinta_030.png

        #include <stdio.h>
        int main(void){
        #define NORM "\x1B[0m"
        #define PUNA "\x1B[31m"
        #define VIHR "\x1B[32m"
        char enimi, snimi[20];

        printf(VIHR);
        printf("Mikä on nimesi? ");
        printf(NORM);
        scanf("%s %s", &enimi, &snimi);
        printf(VIHR);
        printf("Terve ");
        printf(PUNA);
        printf("%s %s", &enimi, &snimi);
        printf(NORM);
        return 0; }

        En usko että tuo toimii, koska muuttuja enimi ei ole taulukko.


      • bugeja-piisaa kirjoitti:

        En usko että tuo toimii, koska muuttuja enimi ei ole taulukko.

        Vahvistan toimimattomuuden. Koodi ei käänny ainakaan uusimmalla Ubuntulla.

        kullimoottori@ubuntu18:~/temp$ gcc nimet.c -o nimet
        nimet.c: In function ‘main’:
        nimet.c:11:12: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[20]’ [-Wformat=]
        scanf("%s %s", &enimi, &snimi);
        ~^ ~~~~~~
        nimet.c:15:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[20]’ [-Wformat=]
        printf("%s %s", &enimi, &snimi);
        ~^ ~~~~~~
        kullimoottori@ubuntu18:~/temp$


      • Turbo-Urpo
        Kullimoottori kirjoitti:

        Vahvistan toimimattomuuden. Koodi ei käänny ainakaan uusimmalla Ubuntulla.

        kullimoottori@ubuntu18:~/temp$ gcc nimet.c -o nimet
        nimet.c: In function ‘main’:
        nimet.c:11:12: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[20]’ [-Wformat=]
        scanf("%s %s", &enimi, &snimi);
        ~^ ~~~~~~
        nimet.c:15:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[20]’ [-Wformat=]
        printf("%s %s", &enimi, &snimi);
        ~^ ~~~~~~
        kullimoottori@ubuntu18:~/temp$

        En tiedä mistä vikaa pitäisi etsiä, paikallisesti kääntyy, ja niin kääntyy myös Online kääntäjällä:
        https://onlinegdb.com/ByedmqbgX


      • bugit
        Turbo-Urpo kirjoitti:

        En tiedä mistä vikaa pitäisi etsiä, paikallisesti kääntyy, ja niin kääntyy myös Online kääntäjällä:
        https://onlinegdb.com/ByedmqbgX

        Ohjelmakoodistahan vikaa on tapana etsiä. Vääräntyyppinen muuttuja ei toimi C-kielessä. Voisihan tuossa kokeilla tietysti castausta (vitsi).


      • Turbo-Urpo
        bugit kirjoitti:

        Ohjelmakoodistahan vikaa on tapana etsiä. Vääräntyyppinen muuttuja ei toimi C-kielessä. Voisihan tuossa kokeilla tietysti castausta (vitsi).

        Ai jaa, tää meni tämmöisekisi, olis pitänyt arvata.


      • heti-tiedetty
        Turbo-Urpo kirjoitti:

        Ai jaa, tää meni tämmöisekisi, olis pitänyt arvata.

        Tiesipä sen jo siinä vaiheessa kun tuon virheitä sisältävän koodinpätkän laitoit.


      • Turbo-Urpo
        heti-tiedetty kirjoitti:

        Tiesipä sen jo siinä vaiheessa kun tuon virheitä sisältävän koodinpätkän laitoit.

        Ei siinä mitään virheitä ole, virheet on sinulla ihan muualla.


      • vielä.ovat
        Turbo-Urpo kirjoitti:

        Ei siinä mitään virheitä ole, virheet on sinulla ihan muualla.

        Kyllä se sama virhe on siellä edelleen. Tai kaksi virhettä, jotka korjaantuvat korjaamalla toisen.


      • Turbo-Urpo
        heti-tiedetty kirjoitti:

        Tiesipä sen jo siinä vaiheessa kun tuon virheitä sisältävän koodinpätkän laitoit.

        Teillä on hitonmoinen halu tuhota ja pilata kaikki tämän saitin paras anti, MIKSI ?

        Sitten te itkette kuorossa että Suomi24 on sitä ja tätä, ettekö ymmärrä että se on juuri sitä miksi te itse sen teette.


      • turhaa.sähkönkulutusta
        Turbo-Urpo kirjoitti:

        Teillä on hitonmoinen halu tuhota ja pilata kaikki tämän saitin paras anti, MIKSI ?

        Sitten te itkette kuorossa että Suomi24 on sitä ja tätä, ettekö ymmärrä että se on juuri sitä miksi te itse sen teette.

        Virheellisen ohjelmakoodin postaaminenko on mielestäsi hyvää antia? No huvinsa kullakin.


      • Turbo-Urpo kirjoitti:

        Tässä esimerkissä otetaan vastaan samalla kertaa, Etunimi ja Sukunimi, lisäksi mukana on värit.

        https://s22.postimg.cc/pj5dwikgh/Valinta_030.png

        #include <stdio.h>
        int main(void){
        #define NORM "\x1B[0m"
        #define PUNA "\x1B[31m"
        #define VIHR "\x1B[32m"
        char enimi, snimi[20];

        printf(VIHR);
        printf("Mikä on nimesi? ");
        printf(NORM);
        scanf("%s %s", &enimi, &snimi);
        printf(VIHR);
        printf("Terve ");
        printf(PUNA);
        printf("%s %s", &enimi, &snimi);
        printf(NORM);
        return 0; }

        Koodi on oikein ja kääntyy. Muuttuja emini pitää muuttaa muotoon enimi[20]- Tyypiksi mieluiten unsigned char.
        Siitä on yli 20 v. kun C:tä olen kirjoittanut jotain sentään muistan. Kääntäjissä paljon eroja ja asetuksia on paljon. Se, että ohjelma kääntyy ei takaa että se toimii halutulla tavalla. Ohjelma jossa on miljoonia rivejä koodia on vaikea saada virheettömäksi.


      • bugista.paskaa
        Mikko_Tku kirjoitti:

        Koodi on oikein ja kääntyy. Muuttuja emini pitää muuttaa muotoon enimi[20]- Tyypiksi mieluiten unsigned char.
        Siitä on yli 20 v. kun C:tä olen kirjoittanut jotain sentään muistan. Kääntäjissä paljon eroja ja asetuksia on paljon. Se, että ohjelma kääntyy ei takaa että se toimii halutulla tavalla. Ohjelma jossa on miljoonia rivejä koodia on vaikea saada virheettömäksi.

        Eihän se koodi ole oikein, jos sitä pitää ensin korjata. Olette te linuksjurpot kyllä ihme vänkääjiä.


      • bugista.paskaa kirjoitti:

        Eihän se koodi ole oikein, jos sitä pitää ensin korjata. Olette te linuksjurpot kyllä ihme vänkääjiä.

        Kumman paljon niitä bugi-päivityksiä tulee oli systeemi sitten mikä tahansa. C kielessä muistinhallinta on ohjelmoijan vastuulla. Ei liity Linuxiin - C kieliset ohjelmat kääntyvät monissa ympäristöissä. Ei tule mieleen ympäristöä jossa C:tä ei käytettäisi. Varmaan myös autossasi.


      • myöntäkää.bugi
        Mikko_Tku kirjoitti:

        Kumman paljon niitä bugi-päivityksiä tulee oli systeemi sitten mikä tahansa. C kielessä muistinhallinta on ohjelmoijan vastuulla. Ei liity Linuxiin - C kieliset ohjelmat kääntyvät monissa ympäristöissä. Ei tule mieleen ympäristöä jossa C:tä ei käytettäisi. Varmaan myös autossasi.

        Mitä sitten. Tässä on kyse tuosta yhdestä tähän postatusta koodinpätkästä, jossa näki virheen jo kilometrin päästä katsottuna. Siitä alkoi sitten hillitön itku että koodi toimii, vaikkei se toimi ennen korjaamista, kuten itsekin kerroit.

        Ihme vänkäämistä, kun olisi kerralla voinut todeta että virhehän siinä on.

        Joo, kyllä on C-kieltä vaikka missä. Olen itsekin koodannut sillä tavallisten tietokoneiden lisäksi mikrokontrollereille.


      • pukipuki
        myöntäkää.bugi kirjoitti:

        Mitä sitten. Tässä on kyse tuosta yhdestä tähän postatusta koodinpätkästä, jossa näki virheen jo kilometrin päästä katsottuna. Siitä alkoi sitten hillitön itku että koodi toimii, vaikkei se toimi ennen korjaamista, kuten itsekin kerroit.

        Ihme vänkäämistä, kun olisi kerralla voinut todeta että virhehän siinä on.

        Joo, kyllä on C-kieltä vaikka missä. Olen itsekin koodannut sillä tavallisten tietokoneiden lisäksi mikrokontrollereille.

        Mikähän ihme luovuttaja sinä olet?
        Ai niin, olet sentään koodannut mirokontrollereille.


      • ObjectPascal_Koodaaja
        C.on.helppo.kieli kirjoitti:

        Linuxit ovat sekavia, oikeastaan täysiä paskoja jos totta puhutaan.

        Mihin käytät ctype-kirjastoa? Char on C-kielen primitiivi tietotyyppi.

        Miksi et varaa merkkijonolle tilaa? Käyttäisin stdlib-kirjaston calloc-funktiota. Muista sitten vapauttaa muisti, jos päädyt allokoimaan muistia erikseen.

        Pinomuistia ei saa koskaan käyttää, jos on mahdollisuus koodata järkevästi. Eli opettele heti alussa dynaaminen muistinvaraaminen.

        C EI OLE helppo kieli, vaan vaikea !

        No, jos ajat ohjelmaasi paikallisesti komentoriviltä, silloin ohjelmasi sisältävä tietoturvahaavoittuvuus ei haittaa.

        MUTTA: jos ohjelmaasi voisi ajaa etänä, ja ohjelmasi kysyisi nimen sijasta käyttäjänimen ja salasanan, niin ohjelmasi olisi hakkerille (siis oikeasti krakkerille) ns. helppo kohde !!!

        Itse en ymmärrä, miksi niin moni käyttää C -kieltä.

        Kaiken, mitä voi tehdä C:llä, voi tehdä sekä helpommin että turvallisemmin Objectpascalilla (kääntäjänä FreePascal, ja mahdollisesti Lazarus -käyttöliittymä, JOS haluaa tehdä GUI -ohjelmia).

        Komentoriviohjelmissa Objectpascalilla luetaan koko rivi päätteeltä näin:

        var
        S : String;

        begin
        Write('Syötä nimesi: ');
        ReadLn(S);
        end;

        ja KAS, Pelkkä String -tyypin käyttö riittää!

        ObjectPascal varaa itse dynaamisesti tarpeellisen määrän muistitilaa uudelle syötetylle merkkijonolle, ja se varaa automaattisesti oikean kokoisen tilan; riskiä puskurin ylivuodosta ei ole.

        MUTTA: Siinä missä ObjectPascal hoitaa tämänkaltaiset asiat automaattisesti, C -kielellä ohjelmoija on ITSE vastuussa asiasta !!!

        C-kielessä voit toki tehdä näin:

        typedef unsigned char CHAR;

        typedef *CHAR PChar;

        sitten itse muuttujamäärittely:

        PChar S;

        nyt voisi joku OIKEASTI OSAAJA kirjoittaa C -kielellä koodin, jota voi kutsua näin helposti:

        PChar ReadLn {
        // tähän kyseinen koodi, joka toimii kuten ObjectPascalin ReadLn(S), eli ottaa näppäimistöltä syötteen, kunnes painetaan ENTER. Allokoi automaattisesti dynaamista muistia juuri tarvittavan määrän, lukee ko syötteen allokoituun muistiin, ja lopuksi palauttaa pointterin ko. muistilohkoon funktion paluuarvona. C -kielen tapaan merkkijono loppuu chr(0) eli NULL -merkkiin. Koska tuo NULL vie itse yhden merkkipaikan, niin jos syötetty merkkijono on 10 merkkiä, pitää tilanvarauksen olla silloin 11 merkkiä. Vapautus ilmeisesti mfree(strlen(S) 1);
        }

        Käyttöesimerkki:

        PChar S;

        S = ReadLn();

        osaako joku koodata C:llä OIKEIN tuollaisen ReadLn -funktion, joka osaa itse laskea, montako tavua muistia varataan, tehdä ko. varauksen ja palauttaa pointterin luettuun dynaamisesti allokoituun merkkijonoon ?

        Tuon kun kerran tekisi, ei tarttisi jokaisen aloittelijan oppia ensin tietoturvaltaan heikkoja tapoja tehdä asia.

        JOS kukaan ei tee tätä C:llä, voisi toki tehdä ObjectPascalilla DLL:n (linuxissa .so) joka tekee halutun asian ja palauttaa pointterin C -ohjelman käytettäväksi.

        JOS noin tekee, ehkä silloin käytetään ObjectPascalin muistinhallintaa, ja silloin ko. DLL tarjoaa toisen funktion muistin vapauttamiseen.

        Vaihtoehtoisesti voisi tarjota malloc -funktioon funktio-osoittimen tuon DLL:n käytettäväksi, jolloin olisi mahdollista ObjectPascalilla tehdystä DLL:stä käsin kutsua C -kielen malloc() -funktiota.

        KYLLÄ: kahta eri ohjelmointikieltä VOI yhteiskäyttää!

        Tällöin kuuluu hyviin ohjelmointitapoihin käyttää ns. platform default -kutsutapaa, jollainen on:

        Windowsissa: stdcall;

        Linuxissa: cdecl;

        mirokontrollereista:

        pienimmissä (kuten Atmel AVR) ei yleensä ole dynaamista muistinhallintaa.

        Niissä ObjectPascalin ns. long string -tyyppi EI toimi, kuten edellä on kerrottu, jollei sitten ITSE toteuta dynaamista muistinhallintaa!

        Noissa voi ObjectPascalissa käyttää vanhaa ShortString -tyyppiä, tai jos max. pituus tiedetään, esim:

        String[100];

        Mutta mirokontrollereissa pitää muutenkin olla tarkkana, niissä ei ole käyttöjärjestelmää turvaamassa asioita, vaan jos mokaat, asiat menevätkin oikein kunnolla pieleen !

        Katsotaanpa, osaako joku koodata C:llä oikein suunnitellun vastineen ReadLn -funktiolle ?!


      • paskinta.kaikesta
        ObjectPascal_Koodaaja kirjoitti:

        C EI OLE helppo kieli, vaan vaikea !

        No, jos ajat ohjelmaasi paikallisesti komentoriviltä, silloin ohjelmasi sisältävä tietoturvahaavoittuvuus ei haittaa.

        MUTTA: jos ohjelmaasi voisi ajaa etänä, ja ohjelmasi kysyisi nimen sijasta käyttäjänimen ja salasanan, niin ohjelmasi olisi hakkerille (siis oikeasti krakkerille) ns. helppo kohde !!!

        Itse en ymmärrä, miksi niin moni käyttää C -kieltä.

        Kaiken, mitä voi tehdä C:llä, voi tehdä sekä helpommin että turvallisemmin Objectpascalilla (kääntäjänä FreePascal, ja mahdollisesti Lazarus -käyttöliittymä, JOS haluaa tehdä GUI -ohjelmia).

        Komentoriviohjelmissa Objectpascalilla luetaan koko rivi päätteeltä näin:

        var
        S : String;

        begin
        Write('Syötä nimesi: ');
        ReadLn(S);
        end;

        ja KAS, Pelkkä String -tyypin käyttö riittää!

        ObjectPascal varaa itse dynaamisesti tarpeellisen määrän muistitilaa uudelle syötetylle merkkijonolle, ja se varaa automaattisesti oikean kokoisen tilan; riskiä puskurin ylivuodosta ei ole.

        MUTTA: Siinä missä ObjectPascal hoitaa tämänkaltaiset asiat automaattisesti, C -kielellä ohjelmoija on ITSE vastuussa asiasta !!!

        C-kielessä voit toki tehdä näin:

        typedef unsigned char CHAR;

        typedef *CHAR PChar;

        sitten itse muuttujamäärittely:

        PChar S;

        nyt voisi joku OIKEASTI OSAAJA kirjoittaa C -kielellä koodin, jota voi kutsua näin helposti:

        PChar ReadLn {
        // tähän kyseinen koodi, joka toimii kuten ObjectPascalin ReadLn(S), eli ottaa näppäimistöltä syötteen, kunnes painetaan ENTER. Allokoi automaattisesti dynaamista muistia juuri tarvittavan määrän, lukee ko syötteen allokoituun muistiin, ja lopuksi palauttaa pointterin ko. muistilohkoon funktion paluuarvona. C -kielen tapaan merkkijono loppuu chr(0) eli NULL -merkkiin. Koska tuo NULL vie itse yhden merkkipaikan, niin jos syötetty merkkijono on 10 merkkiä, pitää tilanvarauksen olla silloin 11 merkkiä. Vapautus ilmeisesti mfree(strlen(S) 1);
        }

        Käyttöesimerkki:

        PChar S;

        S = ReadLn();

        osaako joku koodata C:llä OIKEIN tuollaisen ReadLn -funktion, joka osaa itse laskea, montako tavua muistia varataan, tehdä ko. varauksen ja palauttaa pointterin luettuun dynaamisesti allokoituun merkkijonoon ?

        Tuon kun kerran tekisi, ei tarttisi jokaisen aloittelijan oppia ensin tietoturvaltaan heikkoja tapoja tehdä asia.

        JOS kukaan ei tee tätä C:llä, voisi toki tehdä ObjectPascalilla DLL:n (linuxissa .so) joka tekee halutun asian ja palauttaa pointterin C -ohjelman käytettäväksi.

        JOS noin tekee, ehkä silloin käytetään ObjectPascalin muistinhallintaa, ja silloin ko. DLL tarjoaa toisen funktion muistin vapauttamiseen.

        Vaihtoehtoisesti voisi tarjota malloc -funktioon funktio-osoittimen tuon DLL:n käytettäväksi, jolloin olisi mahdollista ObjectPascalilla tehdystä DLL:stä käsin kutsua C -kielen malloc() -funktiota.

        KYLLÄ: kahta eri ohjelmointikieltä VOI yhteiskäyttää!

        Tällöin kuuluu hyviin ohjelmointitapoihin käyttää ns. platform default -kutsutapaa, jollainen on:

        Windowsissa: stdcall;

        Linuxissa: cdecl;

        mirokontrollereista:

        pienimmissä (kuten Atmel AVR) ei yleensä ole dynaamista muistinhallintaa.

        Niissä ObjectPascalin ns. long string -tyyppi EI toimi, kuten edellä on kerrottu, jollei sitten ITSE toteuta dynaamista muistinhallintaa!

        Noissa voi ObjectPascalissa käyttää vanhaa ShortString -tyyppiä, tai jos max. pituus tiedetään, esim:

        String[100];

        Mutta mirokontrollereissa pitää muutenkin olla tarkkana, niissä ei ole käyttöjärjestelmää turvaamassa asioita, vaan jos mokaat, asiat menevätkin oikein kunnolla pieleen !

        Katsotaanpa, osaako joku koodata C:llä oikein suunnitellun vastineen ReadLn -funktiolle ?!

        Pascal on nimensä mukaisesti paskaa.


    • Turbo-Urpo
      • Turbo-Urpo

        GIF animaatiosta saa käsityksen, että olisi Windows XP, josta kuva on peräisin, mutta totuus on että kyseessä on Fedora 28 Xfce 4.12 työpöytä, XP teemalla.


    • Copypastesin koodisi uusimpaan Ubuntuun ja ainakin siinä se toimi normaalisti heti käännön jälkeen.

      kullimoottori@ubuntu18:~/temp$ gcc moikka.c -o moikka
      kullimoottori@ubuntu18:~/temp$ ./moikka
      Hyvin menee
      kullimoottori@ubuntu18:~/temp$

      • joopa_joo

        Joo, ristiinkääntelin tuota ubuntussa arm-ytimelle lenovo tab:iin ja ajoin virtuaalisess com-portissa olevassa terminaalissa: Kyllä se toimii ihan niin kuin pitää myös tabletissa.


    • Anonyymi

      C ja C kielissä on molemmissa tuo muistin hallinta kyllä hankalaa aloittelijalle. Se hidastaakin tavallaan oppimista, mutta toisaalta antaa sitten kyllä aika täydellisen kontrollin siihen, miten asiat oikeasti suoritetaan koneen uumenissa.

      Rust on myös yksi uudehko ja mielenkiintoinen kieli joka pyrkii pääsemään eroo noista muistin hallintaan liittyvistä murheista. Syntaksi on vähän tutumpaa C/C koodaajalle kuin esim. pascal. Tai näin ainakin omaan silmään näyttäisi.

      • Rust, Clang ja LLVM valtaamassa alaa. Uusimmat Firefoxit kääntyy noilla. C oikeasti hankala kieli, mutta hyvät kirjastot auttaa. Merkkijononkin lukuun löytyy valmiita kirjastoja jotka toimii. Esimerkiksi hetun lukeminen vaatii jo enemmän koodia jos halutaan tarkistaa sen oikeellisuus.


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

    Luetuimmat keskustelut

    1. Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita

      Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita – neljä Jyväskylän Outlaws MC:n jäsentä vangittu: "Määrät p
      Jyväskylä
      56
      1836
    2. Persut petti kannattajansa, totaalisesti !

      Peraujen fundamentalisteille, vaihtkaa saittia. Muille, näin sen näimme. On helppo luvata kehareille, eikä ne ymmärrä,
      Maailman menoa
      49
      1615
    3. Ei luottoa lakko maahan

      Patria menetti sovitun ksupan.
      Suomen Keskusta
      52
      1554
    4. Nähtäiskö ylihuomenna taas siellä missä viimeksikin?

      Otetaan ruokaöljyä, banaaneita ja tuorekurkkuja sinne messiin. Tehdään taas sitä meidän salakivaa.
      Ikävä
      5
      1507
    5. Sinäkö se olit...

      Vai olitko? Jostain kumman syystä katse venyi.. Ajelin sitten miten sattuu ja sanoin ääneen siinä se nyt meni😅😅... Lis
      Ikävä
      6
      1495
    6. Housuvaippojen käyttö Suomi vs Ulkomaat

      Suomessa housuvaippoja aletaan käyttämään vauvoilla heti, kun ne alkavat ryömiä. Tuntuu, että ulkomailla housuvaippoihin
      Vaipat
      6
      1395
    7. Hyvää yötä ja kauniita unia!

      Täytyy alkaa taas nukkumaan, että jaksaa taas tämän päivän haasteet. Aikainen tipu madon löytää, vai miten se ärsyttävä
      Tunteet
      8
      1306
    8. Lepakot ja lepakkopönttö

      Ajattelin tehdä lepakkopöntön. Tietääkö joku ovatko lepakot talvella lepakkopöntössä ´vai jossain muualla nukkumassa ta
      12
      1271
    9. Revi siitä ja revi siitä

      Enkä revi, ei kiinnosta hevon vittua teidän asiat ja elämä. Revi itte vaan sitä emborullaas istuessas Aamupaskalla
      Varkaus
      4
      1153
    10. Kello on puoliyö - aika lopettaa netin käyttö tältä päivältä

      Kello on 12, on aika laittaa luurit pöydälle ja sallia yörauha kaupungin asukkaille ja työntekijöille. It is past midni
      Hämeenlinna
      4
      1128
    Aihe