Muuttujien alustus?

Anonyymi-ap

Olen aina kuvitellut (Delphissä ainakin), että kun procedureen/funktioon tullaan, että siinä alussa määritetty muuttuja saa oletusarvon

procedure Joku.Abc;
var
I: Integer;
B: Boolean;
^

Että I = 0 ja B = False

Lazaruksessa huomasin, ettei näin olekaan, vaan muuttujassa voi jäädä edellisellä kerralla muodostunut arvo, esim B = True

Näissä alustuksissa liene varminta antaa oletusarvot, jo tuolla var-määrityksissä?

25

647

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Noillataidoilla ei kannataisi koodata yhtään mitään!

      • Anonyymi

        Ahaa, no kiitos vinkistä, minäpä lopetan sitten.


      • Anonyymi

        Katkeruus ei kannata, paitsi että elämä ja siten kärsimykset lyhenevät


      • Anonyymi

        KUOLEMA UKRAINALLE
        KUOLEMA ZELENSKYILLE


      • Anonyymi

        Peruϟϟuomalais ♿ k_o_l _l_ i_m_a_a_t_t_o_r_i !

        Joka ilta kollirunkkari kumartaa purran kuvaa! ja heittää Ukrainan natsitervehdyksen.


    • Anonyymi

      Tuossahan tuo lukee, no hyvä tietää tämäkin, Delphistä on jo sen verran aikaa etten muista oliko siinä myös näin?

      https://www.freepascal.org/docs-html/ref/refse24.html

      Toki olis hyvä jos tähän olis joku vipu, joka päällä osaisi alustaa nuo aina oletusarvoilla.

      - Aloittaja

      • Anonyymi

        seuraavalla sivulla muuten kerrotaan default funktiosta ts. jos kirjoittaa koodiin:
        B := Default ( Boolean );
        Pitäisi alustua false:ksi? Tuon pitäisi toimia kaikilla tyypeillä ja jos oikein luin luokat alustuu globaalissa skoopissa nil:liksi ja objektit ei.
        Oikeastaan tuo on loogista, että pitää alustaa itse: funktion var-määrittelyt varataan paikallisesta muistista(ts. pinosta) eikä alusteta, koska se on usein turha operaatio kun ei tiedetä, mihin pitäisi alustaa.
        Heap:sta varataan sen sijaan olioita varten tilaa ja ne alustetaan?


      • Anonyymi
        Anonyymi kirjoitti:

        seuraavalla sivulla muuten kerrotaan default funktiosta ts. jos kirjoittaa koodiin:
        B := Default ( Boolean );
        Pitäisi alustua false:ksi? Tuon pitäisi toimia kaikilla tyypeillä ja jos oikein luin luokat alustuu globaalissa skoopissa nil:liksi ja objektit ei.
        Oikeastaan tuo on loogista, että pitää alustaa itse: funktion var-määrittelyt varataan paikallisesta muistista(ts. pinosta) eikä alusteta, koska se on usein turha operaatio kun ei tiedetä, mihin pitäisi alustaa.
        Heap:sta varataan sen sijaan olioita varten tilaa ja ne alustetaan?

        Jep, samapa tuo kun nyt hoksaa nuo alustaa oletuksena ja yleensä näin on tullut tehtyäkin, mutta yhdessä toiminnallisuudessa tämä alustus jäi tekemättä ja ihmettelin vaihtelevaa toimintaa.

        Viimeiset 11v tullut koodailtua lähinnä php- & javascript työkseen, jossa ei tämmöistä ongelmaa ole ja/tai herjailut tulee huomattua helpommin. D-kielellä (ei siis Delphi) tullut koodailtua myös viimeiset 6v oman projektin osalta ja vaikka se on C/C kaltainen kieli, siinä muuttujat alustuu automaagisesti oletusarvoilla, eli riittää määritys vaikka int i; jonka arvo on 0


      • Anonyymi
        Anonyymi kirjoitti:

        Jep, samapa tuo kun nyt hoksaa nuo alustaa oletuksena ja yleensä näin on tullut tehtyäkin, mutta yhdessä toiminnallisuudessa tämä alustus jäi tekemättä ja ihmettelin vaihtelevaa toimintaa.

        Viimeiset 11v tullut koodailtua lähinnä php- & javascript työkseen, jossa ei tämmöistä ongelmaa ole ja/tai herjailut tulee huomattua helpommin. D-kielellä (ei siis Delphi) tullut koodailtua myös viimeiset 6v oman projektin osalta ja vaikka se on C/C kaltainen kieli, siinä muuttujat alustuu automaagisesti oletusarvoilla, eli riittää määritys vaikka int i; jonka arvo on 0

        Millä tavalla tämä on joku ongelma?


      • Anonyymi
        Anonyymi kirjoitti:

        Millä tavalla tämä on joku ongelma?

        Ilmeisesti ollut pascalissa alusta asti tuo ettei alustuksia tehdä paikallisille muuttujille. Se, että var-osiossa pystyy alustamaan ylipäätään muuttujan "var i: integer = 0" - yksi riviä kohti - on yllättävän uusi ominaisuus ja vanhemmat kääntäjät ei tuota hyväksy sillä vakioiden alustus on varattu const-osiolle koodissa. Muuttujat alustetaan begin/end-ohjelmalohkossa
        Mietin tuota, miten nuo saisi alustettua ja tuli mieleen tällainen kikkailu: {$STACKFRAMES ON} määrittely saa jokaisen funktiokutsun tekemään oman pinon ja tämä tulee kernelin muistivaraukselta nollilla täytettynä virtuaalisena muistisivuna. JOS kääntäjä ei uudelleenkäytä noita stack-kehyksiä, pitäisi sen olla alustettu. Näin ollen varatut muuttujat olisi nollia.. no, kokeilin tuota ja tein fun1 ja fun2:n samoilla(eri nimisillä) muuttujilla - ja muuttujat näkyi funktiokutsujen läpi toisilleen: Eli stack uudelleenkäytetään. Sen sijaan alunperin kerneliltä saatu stack on nollilla ennen käyttöä. Enpä kyllä osaa sanoa, kuinka käyttöjärjestelmäriippuvaista tuo sitten on?


      • Anonyymi
        Anonyymi kirjoitti:

        Ilmeisesti ollut pascalissa alusta asti tuo ettei alustuksia tehdä paikallisille muuttujille. Se, että var-osiossa pystyy alustamaan ylipäätään muuttujan "var i: integer = 0" - yksi riviä kohti - on yllättävän uusi ominaisuus ja vanhemmat kääntäjät ei tuota hyväksy sillä vakioiden alustus on varattu const-osiolle koodissa. Muuttujat alustetaan begin/end-ohjelmalohkossa
        Mietin tuota, miten nuo saisi alustettua ja tuli mieleen tällainen kikkailu: {$STACKFRAMES ON} määrittely saa jokaisen funktiokutsun tekemään oman pinon ja tämä tulee kernelin muistivaraukselta nollilla täytettynä virtuaalisena muistisivuna. JOS kääntäjä ei uudelleenkäytä noita stack-kehyksiä, pitäisi sen olla alustettu. Näin ollen varatut muuttujat olisi nollia.. no, kokeilin tuota ja tein fun1 ja fun2:n samoilla(eri nimisillä) muuttujilla - ja muuttujat näkyi funktiokutsujen läpi toisilleen: Eli stack uudelleenkäytetään. Sen sijaan alunperin kerneliltä saatu stack on nollilla ennen käyttöä. Enpä kyllä osaa sanoa, kuinka käyttöjärjestelmäriippuvaista tuo sitten on?

        procedure TForm1.Button1Click(Sender: TObject);
        Var i:integer=3; j:integer=2;
        begin

        end;

        Tämä on ihan syntaksin mukainen muuttujan alustaminen. Mikä ongelma sinulla on siinä?


      • Anonyymi
        Anonyymi kirjoitti:

        Ilmeisesti ollut pascalissa alusta asti tuo ettei alustuksia tehdä paikallisille muuttujille. Se, että var-osiossa pystyy alustamaan ylipäätään muuttujan "var i: integer = 0" - yksi riviä kohti - on yllättävän uusi ominaisuus ja vanhemmat kääntäjät ei tuota hyväksy sillä vakioiden alustus on varattu const-osiolle koodissa. Muuttujat alustetaan begin/end-ohjelmalohkossa
        Mietin tuota, miten nuo saisi alustettua ja tuli mieleen tällainen kikkailu: {$STACKFRAMES ON} määrittely saa jokaisen funktiokutsun tekemään oman pinon ja tämä tulee kernelin muistivaraukselta nollilla täytettynä virtuaalisena muistisivuna. JOS kääntäjä ei uudelleenkäytä noita stack-kehyksiä, pitäisi sen olla alustettu. Näin ollen varatut muuttujat olisi nollia.. no, kokeilin tuota ja tein fun1 ja fun2:n samoilla(eri nimisillä) muuttujilla - ja muuttujat näkyi funktiokutsujen läpi toisilleen: Eli stack uudelleenkäytetään. Sen sijaan alunperin kerneliltä saatu stack on nollilla ennen käyttöä. Enpä kyllä osaa sanoa, kuinka käyttöjärjestelmäriippuvaista tuo sitten on?

        "Muuttujat alustetaan begin/end-ohjelmalohkossa"

        Onko siinä jokin ongelma, että muuttuja saa sisältöä siellä missä sitä käytetään.


      • Anonyymi
        Anonyymi kirjoitti:

        Millä tavalla tämä on joku ongelma?

        No on se sillä tavalla "ongelma" kun ei ole pitkään aikaan Pascalilla tullut koodailtua, että jää helposti tottumuksesta tämmöinen alustus oletuksella huomaamatta?

        ap.


      • Anonyymi
        Anonyymi kirjoitti:

        No on se sillä tavalla "ongelma" kun ei ole pitkään aikaan Pascalilla tullut koodailtua, että jää helposti tottumuksesta tämmöinen alustus oletuksella huomaamatta?

        ap.

        Ehkäpä sillä Pascalilla ei kannattaisi muutenkaan tehdä mitään kun käytännössä aina löytyy sopivampia välineitä.


      • Anonyymi
        Anonyymi kirjoitti:

        Ehkäpä sillä Pascalilla ei kannattaisi muutenkaan tehdä mitään kun käytännössä aina löytyy sopivampia välineitä.

        Jotkut käyttä tennismailaa ja majavaleikkejä, kollilla on kauha!


      • Anonyymi
        Anonyymi kirjoitti:

        Ilmeisesti ollut pascalissa alusta asti tuo ettei alustuksia tehdä paikallisille muuttujille. Se, että var-osiossa pystyy alustamaan ylipäätään muuttujan "var i: integer = 0" - yksi riviä kohti - on yllättävän uusi ominaisuus ja vanhemmat kääntäjät ei tuota hyväksy sillä vakioiden alustus on varattu const-osiolle koodissa. Muuttujat alustetaan begin/end-ohjelmalohkossa
        Mietin tuota, miten nuo saisi alustettua ja tuli mieleen tällainen kikkailu: {$STACKFRAMES ON} määrittely saa jokaisen funktiokutsun tekemään oman pinon ja tämä tulee kernelin muistivaraukselta nollilla täytettynä virtuaalisena muistisivuna. JOS kääntäjä ei uudelleenkäytä noita stack-kehyksiä, pitäisi sen olla alustettu. Näin ollen varatut muuttujat olisi nollia.. no, kokeilin tuota ja tein fun1 ja fun2:n samoilla(eri nimisillä) muuttujilla - ja muuttujat näkyi funktiokutsujen läpi toisilleen: Eli stack uudelleenkäytetään. Sen sijaan alunperin kerneliltä saatu stack on nollilla ennen käyttöä. Enpä kyllä osaa sanoa, kuinka käyttöjärjestelmäriippuvaista tuo sitten on?

        Paavo Väyrysen sai kutsun pyllymajaan!


      • Anonyymi
        Anonyymi kirjoitti:

        Ilmeisesti ollut pascalissa alusta asti tuo ettei alustuksia tehdä paikallisille muuttujille. Se, että var-osiossa pystyy alustamaan ylipäätään muuttujan "var i: integer = 0" - yksi riviä kohti - on yllättävän uusi ominaisuus ja vanhemmat kääntäjät ei tuota hyväksy sillä vakioiden alustus on varattu const-osiolle koodissa. Muuttujat alustetaan begin/end-ohjelmalohkossa
        Mietin tuota, miten nuo saisi alustettua ja tuli mieleen tällainen kikkailu: {$STACKFRAMES ON} määrittely saa jokaisen funktiokutsun tekemään oman pinon ja tämä tulee kernelin muistivaraukselta nollilla täytettynä virtuaalisena muistisivuna. JOS kääntäjä ei uudelleenkäytä noita stack-kehyksiä, pitäisi sen olla alustettu. Näin ollen varatut muuttujat olisi nollia.. no, kokeilin tuota ja tein fun1 ja fun2:n samoilla(eri nimisillä) muuttujilla - ja muuttujat näkyi funktiokutsujen läpi toisilleen: Eli stack uudelleenkäytetään. Sen sijaan alunperin kerneliltä saatu stack on nollilla ennen käyttöä. Enpä kyllä osaa sanoa, kuinka käyttöjärjestelmäriippuvaista tuo sitten on?

        Väärää tietoa!

        {$STACKFRAMES ON}

        tuo EI varaa jokaiselle funktiolle omaa pinoa eikä nollaa pinomuistin tavuja!

        Vaan se, mitä tuo tekee, on varmistaa, että jokaiselle funktiolle luodaan oma pinon rakenne, eli on tarpeen tiettyjä debuggaustapoja varten.

        Ilman tuota debuggerin "View/Debug Windpows/Call Stack" -ominaisuus ei välttämättä toimi oikein / lainkaan.

        Debuggauksen ajaksi kannattaa laittaa myös Unit:in alkuun:

        {$O-}

        tai

        {$OPTIMIZATION OFF}

        Tuo hidastaa koodia jonkin verran, mutta tuon ansiosta debuggaus toimii paljon paremmin.

        Ilman tuota, koodi on nopeampaa, mutta kun yrität tarkastella debuggerilla jonkin muuttujan arvoa, niin debuggeri valittaa, ettei ko. muuttujan arvo ole saatavilla optimoinnin takia.


      • Anonyymi
        Anonyymi kirjoitti:

        Ehkäpä sillä Pascalilla ei kannattaisi muutenkaan tehdä mitään kun käytännössä aina löytyy sopivampia välineitä.

        Muiden kielten kuin Pascalin / ObjectPascalin käyttäjät saavat yleensä aikaiseksi kaiken maailman virheitä, joita monet ohjelmistot ovat täynnä, kun niitä ei ole koodattu Delphillä.

        Delphin käyttäjät tekevät yleensä huolellista työtä, ja siksi Delphi -ohjelmissa moiset bugit ovat harvinaisuus.

        Omaa koodia kirjoitettaessa kannattaa laitta vielä {$R+}

        Tosin, jos koodi on suoraan C -kielisestä koodista Delphille käännetty, niin monessa kohdassa ei voi käyttää {$R+}
        koska C:n yleinen koodaustyyli olettaa, ettei muuttujien muistirajoja tarvitse kunnioittaa.

        Delphiksi käännettäessä, siellä missä voi, kannattaa käyttää dynaamisia taulukoita ja SetLength -proseduuria.


    • Anonyymi

      Globaalit muuttujat saavat alkuarvon 0 (joka esim. Boolean tyyppinä vastaa FALSE).

      Paikalliset muuttujat aliohjelmissa EIVÄT ole alustettuja, vaan niissä on mikä tahansa arvo, mikä kyseessä olevassa muistiosoitteessa on viimeksi ollut.

      Sitten taas objektien (luokkien) kentät alustetaan arvolla 0.

      Jos objektiviittaus on paikallinen muuttuja, niin aliohjelman lopussa Obj.Free; riittää.

      Muussa tapauksessa suositellaan: FreeAndNil(Obj);

      Pelkkä Obj.Free silloin, kun kyseessä ei ole tilanne, jossa aliohjelman lopuksi vapautetaab objekti, ja sitten aliohjelma jo loppuukin, niin tällöin pelkkä Free ei riitä, koska syntyisi tilanne, jossa objekti on vapautettu, mutta viittaus siihen edelleen viittaa objektin vanhaan sijaintiin - tämä on ohjelmointivirhe, ja siitä ikävä, että johtaa herkästi muistin ylikirjoittamiseen !

      HUOM: JOS samaan objektiin viittaa useampi viittaus, tällöin FreeAndNil on oikeansuuntainen, mutta SILTI riittämätön toimenpide - se nollaa yksittäisen viitteen kylläkin, mutta ei tee mitään sen hyväksi, että muut viitteet samaan objektiin nollattaisiin myös!

      JOS tuollainen tilanne tulee vastaan, suositellaan: interfaces pelkkien objektien sijasta. Niissä on automaattinen "reference count" ja vapautus automaattisesti, kun tuo "reference count" putoaa 1 -> 0.

    • Anonyymi

      "Näissä alustuksissa liene varminta antaa oletusarvot, jo tuolla var-määrityksissä?"

      Varminta on kirjoittaa funktiot niin, että siellä ei ole missään sijoituslausetta.

      • Anonyymi

        Mainittakoon toki se, että joissakin kielissä voi pino vuotaa, että tarvitsee erittäin huolellisesti kirjoittaa funktiot ilman rekursiota ja siinä sitten sitä sijoitusta tarvitaan. Toki se voidaan rajata siihen scopeen missä tarvitaan ja oletus on että ei ole alkuarvoa ellei sitä anna.


      • Anonyymi
        Anonyymi kirjoitti:

        Mainittakoon toki se, että joissakin kielissä voi pino vuotaa, että tarvitsee erittäin huolellisesti kirjoittaa funktiot ilman rekursiota ja siinä sitten sitä sijoitusta tarvitaan. Toki se voidaan rajata siihen scopeen missä tarvitaan ja oletus on että ei ole alkuarvoa ellei sitä anna.

        Mikäli pino vuotaa sisäänpäin ja samalla aaltoilee sekä liplattaa, on alkuarvoa silloin tarkasteltava epätavallisenkin tarkasti, vaikka muut ohjelmiston osat hinattaessa eivät sitä ollenkaan ennen jäidenlähtöä sallisi.


      • Anonyymi
        Anonyymi kirjoitti:

        Mikäli pino vuotaa sisäänpäin ja samalla aaltoilee sekä liplattaa, on alkuarvoa silloin tarkasteltava epätavallisenkin tarkasti, vaikka muut ohjelmiston osat hinattaessa eivät sitä ollenkaan ennen jäidenlähtöä sallisi.

        ECHO ON ja spinonarvo fast 14, vol 65.


    • Anonyymi

      Väittämäsi ovat valhetta. et ole perehtynyt asiaan ollenkaan.
      Kummallakin muuttujatyypillä on oletusarvo, eikä se miksikään muutu jos ohjelmassasi saman tyyppinen ja saman niminen muuttuja on käytössä näkyvyysalueensa ulkopuolella.

    • Anonyymi

      Delphissä:

      Globaalit muuttujat alustetaan niin, että niiden muistialueen jokainen tavu on 0, eli silloin esim. Boolean -muuttuja = False, ja merkkijonot tyhjiä.

      Mutta paikalliset muuttujat - niitä ei pääsääntöisesti automaattisesti alusteta, poikkeuksena manageroidut tyypit (kuten String).

      Eli niiden arvona on mitä tahansa pinomuistissa tuossa kohdassa sattuu olemaan.

      Pino-osoitinhan on [SP | ESP | RSP] riippuen siitä, onko kyseessä [16 | 32 | 64] -bittinen sovellus.

      esim.

      function GetStackPointer:Pointer;
      asm
      mov EAX, ESP // Esimerkki on 32 -bittinen, muuta tähän RAX/RSP tai AX,SP, [16|64] -bit
      end;

      huom:
      Toimii sellaisenaan Delphissä.

      Jos FreePascal, niin alkuu vielä:

      {$MODE DELPHI}
      {$ASMMODE INTEL}

      Joku urpo on mennyt laittamaan oletukseksi perkeleellisen AT&T -syntaksin.
      Miksi joku puhelinyhtiö saisi päättää assemblerkielen syntaksista ?

      Ihan sama kuin jos Suomessa olisi jokin dna- tai Elisa -syntaksi !
      Käyttäisitkö, jos olisi ?
      Minä EN käyttäisi.

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

    Luetuimmat keskustelut

    1. IL - PerSut tykittää - Vaaralliset tappajat vankilaan jopa loppuelämäksi!!

      Entistä rajumpi elinkautinen tulee – Vaaralliset tappajat vankilaan jopa loppuelämäksi Henkirikosten uusijat voidaan ja
      Maailman menoa
      161
      22104
    2. Some kuhisee Sanna Marinista: "Wau"

      Sanna Marinia hehkutetaan. Muun muassa Jodelissa kommentoidaan The Sunday Timesin julkaisemaa kuvaa Marinista. Hän ant
      Maailman menoa
      59
      8519
    3. Äärioikeistopurran nukke Petteri Lapanen paniikissa

      Kun Suomen historian paras pääministeri antoi vankan lausunnon, kuinka "keskustelu politiikassa on käpertynyt lähinnä va
      Maailman menoa
      55
      6155
    4. SIELTÄ SE TULI: Kepu-Kurvinen: "Emme enää lähde punavihreään hallitukseen"

      Nyt muuten nauretaan loppuviikko, että tähänkö kaatui Lindtmanin pääministerihaaveet. "Antti Kurvisen mukaan puolue ei
      Maailman menoa
      178
      5782
    5. Onko rajojen kiinnipitäminen ihmisoikeuksien vastaista?

      Maahanmuutosta puhutaan usein niin kuin kyse olisi vain numeroista ja rajoista. Kyse on kumminkin ihmisistä, jotka halua
      Maahanmuutto
      314
      5122
    6. Täysi ryöpytys Sanna Marinille ulkomailla.

      https://www.iltalehti.fi/ulkomaat/a/f699d84f-fa53-4dba-8718-2c395017fc55 Sanna Marinin kirja saa todella tylyn vastaanot
      Maailman menoa
      29
      4806
    7. HS - Sanna Marinin kirja on priimaluokan vedätys!

      Kirja-arvio|Toivo on tekoja tulisi ensisijaisesti nähdä maineen rahallisen hyödyntämisen voimaannuttavana merkkipaaluna.
      Maailman menoa
      78
      4411
    8. Minja Koskelan "istumista" kertovassa uutisessa ei sanottu persuista mitään

      eli jälleen kerran äärivasemmistolainen valehtelee, hän kun väittää että juuri persut ovat lähetelleet Koskelalle vähemm
      Maailman menoa
      78
      4207
    9. "Rauhanomainen" miekkari hesassa: "Eläköön aseellinen vastarinta" - lakana

      Kyseessä on Suomen Palestiinalaisten yhdistyksen viime perjantaina järjestämä ”Hiljainen kynttiläkulkue Palestiinalaiste
      Maailman menoa
      115
      3750
    10. Huomenta naiselle

      Toivottavasti tiedät, etten ole koskaan tuntenut ketään kohtaan näin voimakkaasti. Olen tietenkin meistä epävarma silti.
      Ikävä
      107
      1633
    Aihe