Pascalin ärsyttävyyksiä..

moiks..

Tuli tässä mieleen. Että vaikka itse koodailenkin Delphillä työkseni ja tykkään koodata Delphillä (Pascalilla), niin mitä ärsyttävyyksiä tässä kielessä on?

Mulla tulee mieleen semmoinen hankaluus, että miksi muuttujat pitää määrittää metodin alussa?

procedure xxx;
var
x, y, z: tyyppi;
begin
..
end;

Miksi ei voisi määrittää C tapaan missä tahansa näitä muuttujia, kuten vaikka

for var I := 0 to List.Count-1 do
begin
var b := 1974 I;
end;

Olen joskus huomannut, että ainaskin joskus Delphi 2006 yrittää arvata ja lisätä metodin alkuun jonkun muuttujan, mutta ei se oikein toimi :/

30

769

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • ap..

      Unohtui heti sitten tyypin määritys noista, heh heh! Eli uusiksi

      for var I:Integer = 0 to List.Count-1 do
      begin
      var b: Integer = 1974 I;
      end;

      Noh, taisinkin tajuta, että tuo näyttää aika typerältä? C :ssa on vaan jotenkin fiksumpi tuommoinen tapaus kummiskin :/

    • tarkoituksella,

      Pascal on tehty nimenomaan ohjelmoinnin opiskeluun ja tarkoituksena on pakottaa tyyppimäärittelyyn hyvän ohjemointitavan mukaisesti.

      Kaikissa kielissähän määrittelyä ei tarvitse tehdä ollenkaan vaan se "arvataan" muuttujan ensimmäisen sijoituksen perusteella. Se saattaa ensituntumalta kuulostaa tehokkaalta mutta johtaa yleensä vähänkin monimutkaisemmassa sovelluksessa isotöiseen debuggaukseen vaikeasti havaittavien virhetoimintojen muodossa.

      >...määrittää C tapaan...

      Ammattilaisten kielissä kuten Java, C , jne. oletetaan että tyyppimääritys tulee selkäytimestä aina kun muuttujaa ensimmäisen kerran tarvitaan joten sen voi määritellä siinä samalla.

      • -_.._-

        Tuo Pascalin käytäntö on ihan hyvä. Lohkon muuttujat esitellään yhdessä paikassa ja
        ne dokumentoidaan siinä. Kun koodia katsoo jälkikäteen niin helposti löytää minkä tyyppimem muuttuja on. Onko esim. muuttujan arvoalue sopiva esim. 0..255 eli byte.


      • "Pascal on tehty nimenomaan ohjelmoinnin opiskeluun"

        Ehkä se olikin tehty tuohon joskus kivikaudella. Nykyään se on ohjelmointikieli siinä missä C ja huomattavasti selkeämpi siinä. Javaa ei tehokkuudessa ja monipuolisuudessa voi edes verrata Delphiin.


      • Ei juu

        >Kaikissa kielissähän määrittelyä ei tarvitse tehdä ollenkaan vaan se "arvataan" muuttujan ensimmäisen sijoituksen perusteella.

        Kannattaa opetella tämä asia paremmin. Kuka arvaa ja mitä?

        >Se saattaa ensituntumalta kuulostaa tehokkaalta mutta johtaa yleensä vähänkin monimutkaisemmassa sovelluksessa isotöiseen debuggaukseen vaikeasti havaittavien virhetoimintojen muodossa.

        Pascalin tyyppisysteemin avulla ei voi havaita sellaisia virheitä kuten nollalla jakoa tai väärää laskulogiikkaa käännösvaiheessa. Nämäkin johtavat isotöiseen debuggaukseen, jos ohjelmaa ei testaa kunnolla.

        Vapaasti tyypitetyissä kielissä myös tyyppivirheet napataan testausvaiheessa. Siksi ne eivät käytännössä olekaan niin isotöisiä kuin kokematon luulee.

        Tosin jos ne muuttujat aiheuttavat niin paljon virheitä, eikö silloin paras ja turvallisin ohjelmointityyli ole sellainen, ettei siinä käytetä muuttujia ollenkaan? :-)


      • D vuodesta luumu

        Ensinnäkin: Pascalin ärsyttävyyksiä: "Olen joskus huomannut, että ainaskin joskus Delphi 2006 yrittää arvata ja lisätä metodin alkuun jonkun muuttujan, mutta ei se oikein toimi :/"

        Ei se Delphi siinä mitään arvaile, alustamaton muutuja on mitä siinä osoitteessa silloin on!

        Ihan: "Ammattilaisten kielissä kuten Java, C , jne..."

        Todellakin, jos arvuuttelee tyyppien kanssa kuten esim. Nuo aloittelevat PHP-koodarit niin ollaan aika heikoilla jäillä, ei se kääntäjäkään ihmeisiin pysty, suosittelen todella joka alan/kielen koodareille natiivin C-kielen ohjelmoinnin hanskaamista, helpottaa kummasti silloin kun ihmetellään miksi miksi?


    • Ei Delphi kokemusta

      Uskon kysymyksen olevan laadullisesta asiasta, eli siitä, jotta koodia on helppoa analysoida ja osoittaa se toimivaksi. Kun muuttujat ovat esitelty alussa, tietää silloin yhdellä vilaukselta kuinka monta, ja minkä nimisiä, muuttujia funktiossa on, ja mitä muuttujat vievät pinosta tilaa.

      Esimerkiksi kielissä joissa ei ole muuttujien tyypitystä ollenkaan, ei edes kääntäjä pysty herjaamaan kaikista mahdollisista tyyppi virheistä. Vastaavasti C kielen ohjelmaa on varsin monimutkaista osoittaa toimivaksi, koska C sallii olion "ylikirjoittaa" perusoperaattorit (=, , ==, jne.).

      • otaksun näin

        Käsittäkseni myös Delphi sallii olion "ylikirjoittaa" operaattoreita.

        (joka oikein käytettynä on hyvä asia).


        (Paikallisten) muuttujien esittely alussa on hyvä asia.


    • ap..

      Oli se, että muuttujan voi määrittää C/C :ssa melkein missä tahansa. Delphissä se määritellään aina metodin/funktion alussa. Vie aikaa aina hyppiä sinne metodin alkuun määrittelemään se muuttujan tyyppi.

      Mutta jokaisessa kielessä on ne huonot ja hyvät puolet. Silti kyllä tykkään todella paljon Pascalista, ei siitä mitään.

      • Vinkki vain

        Tuo voitaisiin tehdä jonkinlaisella koodin täydentäjällä. Se siirtäisi muuttujan esittelyn
        aliohjelman/funktion muuttujien esittelylohkoon (var lohkoon).

        Tuo muuttujien esittely omassa lohkossa on se ominaisuus mitä kaipaan (esim) c:ssä! Koodin luettavuus ja ylläpito on helpompaa kun varsinainen toiminta on selkeästi esillä omassa koodilohkossa ja muuttujat kommentoituna omassa!


      • puutteita...
        Vinkki vain kirjoitti:

        Tuo voitaisiin tehdä jonkinlaisella koodin täydentäjällä. Se siirtäisi muuttujan esittelyn
        aliohjelman/funktion muuttujien esittelylohkoon (var lohkoon).

        Tuo muuttujien esittely omassa lohkossa on se ominaisuus mitä kaipaan (esim) c:ssä! Koodin luettavuus ja ylläpito on helpompaa kun varsinainen toiminta on selkeästi esillä omassa koodilohkossa ja muuttujat kommentoituna omassa!

        Ikävintä on, että kaikki lausekkeet eivät palauta arvoa. Se estää lauseet tyyliin write(read(a)) tai a := b := 0; No, ehkä se on katsottu vaarallisiksi alunperin opetukseen tarkoitetussa kielessä, mutta Delphissä tän olisi jo voinut korjata.

        Myöskin begin ja end on ikävä kirjoittaa, { ja } on niin paljon näppärämpää.

        Ternary-operaattoria "(a < b ? a : b)" ei taida olla vieläkään Delphissä?


      • d vuodesta luumu
        puutteita... kirjoitti:

        Ikävintä on, että kaikki lausekkeet eivät palauta arvoa. Se estää lauseet tyyliin write(read(a)) tai a := b := 0; No, ehkä se on katsottu vaarallisiksi alunperin opetukseen tarkoitetussa kielessä, mutta Delphissä tän olisi jo voinut korjata.

        Myöskin begin ja end on ikävä kirjoittaa, { ja } on niin paljon näppärämpää.

        Ternary-operaattoria "(a < b ? a : b)" ei taida olla vieläkään Delphissä?

        Mielestäni "begin..end;" lohko on luettavuuden puolesta parempi kuin yleisesti käytetty "{}", tällöin sulut yms metodien alku ja loppu erottuu jo ensi silmäyksellä.

        Kuten myös uskon että nuo muutkin esittelemäsi operaatiot eivät ole tuettuina, koska ylläpito/luettavuus kärsii, jos joku nyt sattuu ihmettelemään miksi sen luettavuuden yms tulee tulee olla selkeää, yksinkertaista ja hyvin kommentoitua niin voin sanoa kokemuksella, että toisen tekemää koodia kun rupeaa päivittelemään niin säästää todella paljon aikaa siinä kun selvittää itselleen mitä- ja miksi ex koodari on näin tehnyt, jos koodi on epäselvää ja muuttujat yms yms kaikki oman mielen mukaan järkevästi aseteltu niin kyllä rupeaa näppäimistö kärsimään..


      • d vuodesta luumu
        d vuodesta luumu kirjoitti:

        Mielestäni "begin..end;" lohko on luettavuuden puolesta parempi kuin yleisesti käytetty "{}", tällöin sulut yms metodien alku ja loppu erottuu jo ensi silmäyksellä.

        Kuten myös uskon että nuo muutkin esittelemäsi operaatiot eivät ole tuettuina, koska ylläpito/luettavuus kärsii, jos joku nyt sattuu ihmettelemään miksi sen luettavuuden yms tulee tulee olla selkeää, yksinkertaista ja hyvin kommentoitua niin voin sanoa kokemuksella, että toisen tekemää koodia kun rupeaa päivittelemään niin säästää todella paljon aikaa siinä kun selvittää itselleen mitä- ja miksi ex koodari on näin tehnyt, jos koodi on epäselvää ja muuttujat yms yms kaikki oman mielen mukaan järkevästi aseteltu niin kyllä rupeaa näppäimistö kärsimään..

        ..Sitä varten on hyvä että jo kääntäjän/editorin puolesta tähän puututaan, tavalla tai toisella, koska jos oppii väärän ns. oman tavan kirjoittaa tahtonsa ruudelle niin siitä on vaikea päästä eroon. Uskon että todellakin tuo luettavuus on monelle se asia numero 1, ainakin minulle.


      • Delphiosaaja
        puutteita... kirjoitti:

        Ikävintä on, että kaikki lausekkeet eivät palauta arvoa. Se estää lauseet tyyliin write(read(a)) tai a := b := 0; No, ehkä se on katsottu vaarallisiksi alunperin opetukseen tarkoitetussa kielessä, mutta Delphissä tän olisi jo voinut korjata.

        Myöskin begin ja end on ikävä kirjoittaa, { ja } on niin paljon näppärämpää.

        Ternary-operaattoria "(a < b ? a : b)" ei taida olla vieläkään Delphissä?

        "Myöskin begin ja end on ikävä kirjoittaa, { ja } on niin paljon näppärämpää. "

        no huhhuh!

        Tuo nyt ei paljasta muuta kuin sen että kirjoittaja ei osaa hyödyntää Delphin nerokkaan IDE:n mahdollisuuksia.

        Itse koodia kirjoittaessani kirjoitan vain be, painan ctrl-J ja enter.

        Seurauksena tästä Delphin automatiikka tuottaa seuraavaa:

        begin
        |
        end;


        missä "|" kuvaa kohtaa, johon kohdistin jää Ctrl-J:n ja ENTERin painalluksen jäkeen.

        Jos ei tuota ole valmiina Delphissä, niin sen saa lisättyä näin:

        (Ohje sellaisenaan Delphi 7:ään, mutta sama periaate toimiii muissakin versioissa, yksityiskohdissa voi olla eroja)

        Tools - Editor Options - Source Options - Edit Code Templates; näin avautuvasta dialogista löytyy työvälineet omien "code template":jen luontiin ja/tai olemassaolevien muokkaukseen.

        (object)pascalissa { ja } ovat kommenttimerkkejä, kuten myös (* sekä *) kuten myös yhden rivin kommentti //.

        C/C :n tapa lohkottaa { ja } -merkeillä on ruma ja sekava.

        begin ja end erottuvat koodista selkeästi, vaikka olisi pienempikin fontti käytössä.

        Jos vielä haluaa lisäerottuvuutta, sitä Delphin mainio IDE tarjoaa mahdollistamalla varattujen sanojen lihavoinnin sekä tekstin/taustan värivalinnan mahdoliistamalla.

        Delphin IDE:ssä on paljon muitakin koodausta helpottavia toimintoja, mainittakoon vaikkapa Ctrl-Shift-R (=macro record; nauhoitus loppuu painamalla samaa näppäinyhdistelmää uudelleen) sekä sen vastine Ctrl-Shift-P (=Macro Play).

        Nämä kun yhdistää 9 numeroituun kirjanmerkkiin:

        asetus: Ctrl-K 1 .. Ctrl-K 9

        käyttö: Ctrl-Q 1 .. Ctrl-Q 9

        niin näillä kahdella yhdessä voi tehdä sellaisiakin toistuvia editointeja joissa Delphin Search/Replace on jopa "regular expressions" -toimintokin käyttäen voimaton.

        Esimerkkinä vaikkapa C struktuurin muunnos Delphin (packed) Recordiksi.

        Tuo Search/Replace "regular expressions" on muuten buginen: jos maalaat vain osan rivistä ja rajaat muutoksen "vain valittu alue" ja painat "Replace All" niin yllätys: muutoksia tehdään myös maalatun rivin maalaamattomalle osalle. Ikävä kyllä Delphissäkin on bugeja, vaikka muuten mainio ja tehokas väline onkin.

        Ehkäpä paras tapa kiertää bugi olisi:

        1. paina ENTER maalatuksi aikomasi alueen alussa ja lopussa

        2. maalaa nyt koko haluttu rivi

        3. tee muutokset

        4. tarkista että meni oikein ja korjaa jos ei mennyt

        5. yhdistä näin syntyneet 3 riviä takaisin 1:ksi.


      • Delphiosaaja
        Delphiosaaja kirjoitti:

        "Myöskin begin ja end on ikävä kirjoittaa, { ja } on niin paljon näppärämpää. "

        no huhhuh!

        Tuo nyt ei paljasta muuta kuin sen että kirjoittaja ei osaa hyödyntää Delphin nerokkaan IDE:n mahdollisuuksia.

        Itse koodia kirjoittaessani kirjoitan vain be, painan ctrl-J ja enter.

        Seurauksena tästä Delphin automatiikka tuottaa seuraavaa:

        begin
        |
        end;


        missä "|" kuvaa kohtaa, johon kohdistin jää Ctrl-J:n ja ENTERin painalluksen jäkeen.

        Jos ei tuota ole valmiina Delphissä, niin sen saa lisättyä näin:

        (Ohje sellaisenaan Delphi 7:ään, mutta sama periaate toimiii muissakin versioissa, yksityiskohdissa voi olla eroja)

        Tools - Editor Options - Source Options - Edit Code Templates; näin avautuvasta dialogista löytyy työvälineet omien "code template":jen luontiin ja/tai olemassaolevien muokkaukseen.

        (object)pascalissa { ja } ovat kommenttimerkkejä, kuten myös (* sekä *) kuten myös yhden rivin kommentti //.

        C/C :n tapa lohkottaa { ja } -merkeillä on ruma ja sekava.

        begin ja end erottuvat koodista selkeästi, vaikka olisi pienempikin fontti käytössä.

        Jos vielä haluaa lisäerottuvuutta, sitä Delphin mainio IDE tarjoaa mahdollistamalla varattujen sanojen lihavoinnin sekä tekstin/taustan värivalinnan mahdoliistamalla.

        Delphin IDE:ssä on paljon muitakin koodausta helpottavia toimintoja, mainittakoon vaikkapa Ctrl-Shift-R (=macro record; nauhoitus loppuu painamalla samaa näppäinyhdistelmää uudelleen) sekä sen vastine Ctrl-Shift-P (=Macro Play).

        Nämä kun yhdistää 9 numeroituun kirjanmerkkiin:

        asetus: Ctrl-K 1 .. Ctrl-K 9

        käyttö: Ctrl-Q 1 .. Ctrl-Q 9

        niin näillä kahdella yhdessä voi tehdä sellaisiakin toistuvia editointeja joissa Delphin Search/Replace on jopa "regular expressions" -toimintokin käyttäen voimaton.

        Esimerkkinä vaikkapa C struktuurin muunnos Delphin (packed) Recordiksi.

        Tuo Search/Replace "regular expressions" on muuten buginen: jos maalaat vain osan rivistä ja rajaat muutoksen "vain valittu alue" ja painat "Replace All" niin yllätys: muutoksia tehdään myös maalatun rivin maalaamattomalle osalle. Ikävä kyllä Delphissäkin on bugeja, vaikka muuten mainio ja tehokas väline onkin.

        Ehkäpä paras tapa kiertää bugi olisi:

        1. paina ENTER maalatuksi aikomasi alueen alussa ja lopussa

        2. maalaa nyt koko haluttu rivi

        3. tee muutokset

        4. tarkista että meni oikein ja korjaa jos ei mennyt

        5. yhdistä näin syntyneet 3 riviä takaisin 1:ksi.

        Seurauksena tästä Delphin automatiikka tuottaa seuraavaa:

        begin
        ..|
        end;

        siis noita pisteitä ei tietenkään sinne tule, mutta ilman niitä Suomi24 forumsofta vääristää paikan, mihin se kohdistin jää. Se jää siis sarakkeeseen 3, EI sarakkeeseen 1 kuten edellisestä kirjoituksestani saattaa saada väärän kuvan asiasta.

        Tämä väärinkäsitys siis on kokonaan suom24 forumsoftan syytä, joka poistaa kirjoitetun rivin alussa olevat välilyönnit ja näin pilaa ohjelmakoodirivien oikean sisennyksen.


      • d vuodesta luumu
        Delphiosaaja kirjoitti:

        Seurauksena tästä Delphin automatiikka tuottaa seuraavaa:

        begin
        ..|
        end;

        siis noita pisteitä ei tietenkään sinne tule, mutta ilman niitä Suomi24 forumsofta vääristää paikan, mihin se kohdistin jää. Se jää siis sarakkeeseen 3, EI sarakkeeseen 1 kuten edellisestä kirjoituksestani saattaa saada väärän kuvan asiasta.

        Tämä väärinkäsitys siis on kokonaan suom24 forumsoftan syytä, joka poistaa kirjoitetun rivin alussa olevat välilyönnit ja näin pilaa ohjelmakoodirivien oikean sisennyksen.

        Paljonko normaali osaava henkilö häviää ajassa jos kirjoittaa "{}" tai "begin..end;"

        Itselläni ainakin nuo kaksi sanaa tulevat jo ilman ajatusta ruudulle, olet kyllä oikeassa että ide:ssä on hyviä nuo templatet yms pikatoiminnot..


      • Kysyjä vaan
        puutteita... kirjoitti:

        Ikävintä on, että kaikki lausekkeet eivät palauta arvoa. Se estää lauseet tyyliin write(read(a)) tai a := b := 0; No, ehkä se on katsottu vaarallisiksi alunperin opetukseen tarkoitetussa kielessä, mutta Delphissä tän olisi jo voinut korjata.

        Myöskin begin ja end on ikävä kirjoittaa, { ja } on niin paljon näppärämpää.

        Ternary-operaattoria "(a < b ? a : b)" ei taida olla vieläkään Delphissä?

        Mikä on ternary operaattori ja mihin sitä käytetään?

        Mitä se tekee?


      • ternary
        Kysyjä vaan kirjoitti:

        Mikä on ternary operaattori ja mihin sitä käytetään?

        Mitä se tekee?

        Se evaluoi 1. operandina olevan ehdon. Jos ehto on tosi, lauseen arvoksi tulee 2. operandi. Jos ehto ei ole tosi, arvoksi tulee 3. operandi.

        Esimerkiksi halutaan sijoittaa muuttujan min arvoksi joko muuttujan a tai muuttujan b arvo sen mukaan, kumpi on pienempi (käytän tässä Pascalin sijoitusmerkkiä vaikka Pascalissa ei ternaryä olekaan, koska tämä on Delphi-palsta).

        min := (a < b ? a : b)

        jos ehto on totta eli a < b niin min := a, muutoin min := b. (huomaa että jos a = b, niin a < b ei ole tosi, joten arvoksi tulee b).

        Sama if-then-else -rakenteella olisi

        if (a < b) then min := a else min := b

        Ternary on siis eräänlainen lyhennysmerkitä if-the-else:lle ja usein näppärämpi kirjoittaa, koska se palauttaa arvon. Esim.

        write('pienempi luku on ' (a < b ? a : b);

        Toivottavasti tämä selvitti asiaa.


      • ap..
        ternary kirjoitti:

        Se evaluoi 1. operandina olevan ehdon. Jos ehto on tosi, lauseen arvoksi tulee 2. operandi. Jos ehto ei ole tosi, arvoksi tulee 3. operandi.

        Esimerkiksi halutaan sijoittaa muuttujan min arvoksi joko muuttujan a tai muuttujan b arvo sen mukaan, kumpi on pienempi (käytän tässä Pascalin sijoitusmerkkiä vaikka Pascalissa ei ternaryä olekaan, koska tämä on Delphi-palsta).

        min := (a < b ? a : b)

        jos ehto on totta eli a < b niin min := a, muutoin min := b. (huomaa että jos a = b, niin a < b ei ole tosi, joten arvoksi tulee b).

        Sama if-then-else -rakenteella olisi

        if (a < b) then min := a else min := b

        Ternary on siis eräänlainen lyhennysmerkitä if-the-else:lle ja usein näppärämpi kirjoittaa, koska se palauttaa arvon. Esim.

        write('pienempi luku on ' (a < b ? a : b);

        Toivottavasti tämä selvitti asiaa.

        Tuo "Ternary" juttu on kyllä kätsä C:n kaltaisissa kielissä, jota olen käyttänyt. Tosin tuo "Ternary" termi on ihan uusi mulle :)

        Siitä on aikaa kun c :lla koodasin, mutta c :ssa on myös hieno juttu tämmöinen..

        if ( bool h = DoSomething( X ) )
        {
        ..if ( !h )
        ..{
        .... error message!...
        ..}
        }

        Samoin C/C ei erottele muuttujien tyyppiä, joko homma on tosi tai epätosi, thats it!

        Saattaa näyttää oudolta sekasotkulta, mutta jos ymmärtää asian pointin, niin on kyllä tehokas tapa koodata, pakko myöntää :)

        Ja vaikka tykkäänkin Pascalista, niin jotenkin silti kaipaan C-kielien kaltaista ytimekkyyttä :)

        Mutta on C huonojakin puolia, ei sen puoleen.


      • ap..
        ap.. kirjoitti:

        Tuo "Ternary" juttu on kyllä kätsä C:n kaltaisissa kielissä, jota olen käyttänyt. Tosin tuo "Ternary" termi on ihan uusi mulle :)

        Siitä on aikaa kun c :lla koodasin, mutta c :ssa on myös hieno juttu tämmöinen..

        if ( bool h = DoSomething( X ) )
        {
        ..if ( !h )
        ..{
        .... error message!...
        ..}
        }

        Samoin C/C ei erottele muuttujien tyyppiä, joko homma on tosi tai epätosi, thats it!

        Saattaa näyttää oudolta sekasotkulta, mutta jos ymmärtää asian pointin, niin on kyllä tehokas tapa koodata, pakko myöntää :)

        Ja vaikka tykkäänkin Pascalista, niin jotenkin silti kaipaan C-kielien kaltaista ytimekkyyttä :)

        Mutta on C huonojakin puolia, ei sen puoleen.

        Tais pettää...

        Eli tietysti ehto täyttyi jo tuossa if (bool h = DoSomethin( X ) ) ehdossa! Mutta silti olen kateellinen C :lle, että siinä voi helposti määrittää "väliaikaisia" muuttujia, kesken koodin :)


      • jepjepjep
        ap.. kirjoitti:

        Tuo "Ternary" juttu on kyllä kätsä C:n kaltaisissa kielissä, jota olen käyttänyt. Tosin tuo "Ternary" termi on ihan uusi mulle :)

        Siitä on aikaa kun c :lla koodasin, mutta c :ssa on myös hieno juttu tämmöinen..

        if ( bool h = DoSomething( X ) )
        {
        ..if ( !h )
        ..{
        .... error message!...
        ..}
        }

        Samoin C/C ei erottele muuttujien tyyppiä, joko homma on tosi tai epätosi, thats it!

        Saattaa näyttää oudolta sekasotkulta, mutta jos ymmärtää asian pointin, niin on kyllä tehokas tapa koodata, pakko myöntää :)

        Ja vaikka tykkäänkin Pascalista, niin jotenkin silti kaipaan C-kielien kaltaista ytimekkyyttä :)

        Mutta on C huonojakin puolia, ei sen puoleen.

        Nimi "ternary" tulee siitä, että operandeja on 3. Yleensähän operaattorilla on kaksi (esim. a b) tai yksi (esim. a ) operandi.

        Tuolta voi lukea lisää
        http://en.wikipedia.org/wiki/Ternary_operation


      • TesTeRi
        ternary kirjoitti:

        Se evaluoi 1. operandina olevan ehdon. Jos ehto on tosi, lauseen arvoksi tulee 2. operandi. Jos ehto ei ole tosi, arvoksi tulee 3. operandi.

        Esimerkiksi halutaan sijoittaa muuttujan min arvoksi joko muuttujan a tai muuttujan b arvo sen mukaan, kumpi on pienempi (käytän tässä Pascalin sijoitusmerkkiä vaikka Pascalissa ei ternaryä olekaan, koska tämä on Delphi-palsta).

        min := (a < b ? a : b)

        jos ehto on totta eli a < b niin min := a, muutoin min := b. (huomaa että jos a = b, niin a < b ei ole tosi, joten arvoksi tulee b).

        Sama if-then-else -rakenteella olisi

        if (a < b) then min := a else min := b

        Ternary on siis eräänlainen lyhennysmerkitä if-the-else:lle ja usein näppärämpi kirjoittaa, koska se palauttaa arvon. Esim.

        write('pienempi luku on ' (a < b ? a : b);

        Toivottavasti tämä selvitti asiaa.

        Eikö IfThen-funktio aja saman asian?

        Vinkki:
        http://keskustelu.suomi24.fi/show.fcgi?category=108&conference=4500000000000646&posting=22000000039353711


      • Näinhän se taitaa olla
        ternary kirjoitti:

        Se evaluoi 1. operandina olevan ehdon. Jos ehto on tosi, lauseen arvoksi tulee 2. operandi. Jos ehto ei ole tosi, arvoksi tulee 3. operandi.

        Esimerkiksi halutaan sijoittaa muuttujan min arvoksi joko muuttujan a tai muuttujan b arvo sen mukaan, kumpi on pienempi (käytän tässä Pascalin sijoitusmerkkiä vaikka Pascalissa ei ternaryä olekaan, koska tämä on Delphi-palsta).

        min := (a < b ? a : b)

        jos ehto on totta eli a < b niin min := a, muutoin min := b. (huomaa että jos a = b, niin a < b ei ole tosi, joten arvoksi tulee b).

        Sama if-then-else -rakenteella olisi

        if (a < b) then min := a else min := b

        Ternary on siis eräänlainen lyhennysmerkitä if-the-else:lle ja usein näppärämpi kirjoittaa, koska se palauttaa arvon. Esim.

        write('pienempi luku on ' (a < b ? a : b);

        Toivottavasti tämä selvitti asiaa.

        Tämä ternary-operaattori taitaa olla c-sukuisten kielin muinainen jäänne jota
        ei toteutettaisi tällä tavoin nykyään jos ohjelmointikieli suunniteltaisiin puhtaalta pöydältä!


      • sitten
        Näinhän se taitaa olla kirjoitti:

        Tämä ternary-operaattori taitaa olla c-sukuisten kielin muinainen jäänne jota
        ei toteutettaisi tällä tavoin nykyään jos ohjelmointikieli suunniteltaisiin puhtaalta pöydältä!

        "Tämä ternary-operaattori taitaa olla c-sukuisten kielin muinainen jäänne jota
        ei toteutettaisi tällä tavoin nykyään jos ohjelmointikieli suunniteltaisiin puhtaalta pöydältä!"

        Ihan mielenkiinnosta, miten se sitten toteutettaisiin puhtaalta pöydältä?


      • TRRY
        sitten kirjoitti:

        "Tämä ternary-operaattori taitaa olla c-sukuisten kielin muinainen jäänne jota
        ei toteutettaisi tällä tavoin nykyään jos ohjelmointikieli suunniteltaisiin puhtaalta pöydältä!"

        Ihan mielenkiinnosta, miten se sitten toteutettaisiin puhtaalta pöydältä?

        Pythoniin tuli tällainen ehtolauseke versiosta 2.5 alkaen. Lopulliseksi muodoksi määräytyi C:stä poiketen

        if else

        kun taas C:ssähän sama asia hoidetaan

        ? :

        Sivulta

        http://www.python.org/dev/peps/pep-0308/

        löytyy myös muita Pythoniin ehdotettuja syntakseja sekä niiden hyvien ja huonojen puolien puntarointia. Ne lukemalla saa jonkinlaisen käsityksen siitä, millaista tällaisen ominaisuuden lisääminen ohjelmointikieleen on: monta asiaa joutuu ottamaan huomioon ja silti voi mennä metsään.


    • .......

      "begin-end" blokin määrittely, miksei vaan voi olla { ja }, vähemmän naputtelemista ?

      • askeltaja

        Joskus 1980-luvulla tuli Turbo Pascal. Sen yksi merkitys oli ohjelmointityön helpottaminen. Sen jälkeen kehitys on edennyt ja nykyään monet asiat tehdään erilaisilla koodin täydentimillä.

        Nykyisillä editoreilla begin end -lohkon tuottaminen onnistuu helposti. Begin - end lohkot ovat paljon helpommin hahmotettavissa nykyisillä syntaksin korostuksen omaavilla editoreilla kuin yhden merkin aaltosulje.

        Vinkkinä kannattaa opetella käyttämään editoria!


      • Delphiosaaja

        begin-end 3 näppäilyllä!

        miten muka { } on vähemmän naputtelemista kuin b ctrl-J enter ?

        molemmissa tasan 3 näppäilyä !

        ks. aiemmin ketjussa:
        "begin/end on HELPPO kirjoittaa"

        SEKÄ "Täsmennys"


      • d vuodesta luumu
        Delphiosaaja kirjoitti:

        begin-end 3 näppäilyllä!

        miten muka { } on vähemmän naputtelemista kuin b ctrl-J enter ?

        molemmissa tasan 3 näppäilyä !

        ks. aiemmin ketjussa:
        "begin/end on HELPPO kirjoittaa"

        SEKÄ "Täsmennys"

        Delphin väsänneet häiskät ei varmaan tarkottanu tätä, tai sitten teki tahallaan :), mut useasti tullut mieleeen, et onko tää jotain c-kielien boikotointii yms vai huumorii, kun käännät joskus c- yms sukuisia kieliä delphille, niin ovat suoraan kommentoituna delphissä, {}- aaltosulkeilla :D


      • Vain kuvitelmaa
        d vuodesta luumu kirjoitti:

        Delphin väsänneet häiskät ei varmaan tarkottanu tätä, tai sitten teki tahallaan :), mut useasti tullut mieleeen, et onko tää jotain c-kielien boikotointii yms vai huumorii, kun käännät joskus c- yms sukuisia kieliä delphille, niin ovat suoraan kommentoituna delphissä, {}- aaltosulkeilla :D

        Delphin edeltäjä oli Turbo Pascal (Taustalla sama Pascal kieli ja sama firma).
        Ennen Turbo Pascalia oli monia Pascal kääntäjiä mm MicroSoft:llakin oli omansa.
        Ennen Apple omaa Pascal-kääntäjää oli USCD-Pascal. Pascal syntyi 1970 kun taas C syntyi 1972. C:n edeltäjä oli BCPL. Noi ensimmäiset Pascal:t pohjautuivat Algol-kieleen.


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

    Luetuimmat keskustelut

    1. Naiset miltä kiihottuminen teissä tuntuu

      Kun miehellä tulee seisokki ja ja sellainen kihmelöinti sinne niin mitä naisessa köy? :)
      Sinkut
      114
      8534
    2. Olet sä kyllä

      ihme nainen. Mikä on tuo sun viehätysvoiman salaisuus?
      Ikävä
      40
      2585
    3. Teuvo Hakkaraisesta tulee eurovaalien ääniharava

      Persuissa harmitellaan omaa tyhmyyttä
      Maailman menoa
      124
      2313
    4. Hiljaiset hyvästit?

      Vai mikä on :( oonko sanonut jotain vai mitä?
      Ikävä
      23
      1966
    5. Miksi kohtelit minua kuin tyhmää koiraa?

      Rakastin sinua mutta kohtelit huonosti. Tuntuu ala-arvoiselta. Miksi kuvittelin että joku kohtelisi minua reilusti. Hais
      Särkynyt sydän
      15
      1704
    6. Turha mun on yrittää saada yhteyttä

      Oot mikä oot ja se siitä
      Suhteet
      11
      1519
    7. Kyllä poisto toimii

      Esitin illan suussa kysymyksen, joka koska palstalla riehuvaa häirikköä ja tiedustelin, eikö sitä saa julistettua pannaa
      80 plus
      16
      1472
    8. "Joka miekkaan tarttuu, se siihen hukkuu"..

      "Joka miekkaan tarttuu, se siihen hukkuu".. Näin puhui jo aikoinaan Jeesus, kun yksi hänen opetuslapsistaan löi miekalla
      Yhteiskunta
      14
      1409
    9. Näkymätöntä porukkaa vai ei

      Mon asuu yksin. Mitas mieltä ootte ?
      Ikävä
      15
      1282
    10. Kristityt "pyhät"

      Painukaa helvettiin, mä tulen sinne kans. Luetaan sitten raamattua niin Saatanallisesti. Ehkä Piru osaa opetta?!.
      Kristinusko
      13
      1203
    Aihe