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ä?
Muuttujien alustus?
20
296
Vastaukset
- 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 0Millä 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
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
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.
Ketjusta on poistettu 4 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Kiitos nainen
Kuitenkin. Olet sitten ajanmerkkinä. Tuskin enää sinua näen ja huomasitko, että olit siinä viimeisen kerran samassa paik185223MTV: Kirkossa saarnan pitänyt Jyrki 69 koki yllätyksen - Paljastaa: "Se mikä oli hyvin erikoista..."
Jyrki Linnankivi alias Jyrki 69 on rokkari ja kirkonmies. Teologiaa opiskeleva Linnankivi piti elämänsä ensimmäisen saar1152714- 102234
Hyväksytkö sinä sen että päättäjämme ei rakenna rauhaa Venäjän kanssa?
Vielä kun sota ehkäpä voitaisiin välttää rauhanponnisteluilla niin millä verukkeella voidaan sanoa että on hyvä asia kun5872006Kirjoita yhdellä sanalla
Joku meihin liittyvä asia, mitä muut ei tiedä. Sen jälkeen laitan sulle wappiviestin1221729Yksi syy nainen miksi sinusta pidän
on se, että tykkään luomusta. Olet luonnollinen, ihana ja kaunis. Ja luonne, no, en ole tavannut vielä sellaista, joka s411299Olet hyvin erilainen
Herkempi, ajattelevaisempi. Toisaalta taas hyvin varma siitä mitä haluat. Et anna yhtään periksi. Osaat myös ilkeillä ja691299Paljastavat kuvat Selviytyjät Suomi kulisseista - 1 päivä vs 36 päivää viidakossa - Katso tästä!
Ohhoh! Yli kuukausi viidakossa voi muuttaa ulkonäköä perusarkeen aika rajusti. Kuka mielestäsi muuttui eniten: Mia Mill31078Hyvää Joulua mies!
Toivottavasti kaikki on hyvin siellä. Anteeksi että olen hieman lisännyt taakkaasi ymmärtämättä kunnolla tilannettasi, o641037Hyödyt Suomelle???
Haluaisin asettaa teille palstalla kirjoittelevat Venäjää puolustelevat ja muut "asiantuntijat" yhden kysymyksen pohditt2211028