Nil/fi: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Nil/fi
| Old | New | Line | |
|---|---|---|---|
| 1 | + | [[Reserved word/fi|Varattu sana]] `nil` edustaa osoittimen muuttujan erityistä [[Constant|vakio]] arvoa, joka ei osoita mihinkään erityiseen ([[Variable/fi|muuttujaan]]). [[FPC/fi|FPC]]:ssa se toteutetaan osoittimena `pointer(0)` (numeerinen arvo nolla), mutta ohjelmoijan ei ole tarkoitus käyttää tätä tosiasiaa. Muissa ohjelmointikielissä, esimerkiksi C: ssä, kirjoitetaan null:a. Termejä "nollaosoitin" tai "nil-osoitin" käytetään vaihtelevasti, jopa [[Standard Pascal/fi|Pascal]]-ohjelmoijien keskuudessa. | |
| 2 | + | ||
| 3 | + | Sanan `nil` etymologiota (sanan alkuperän suuntia) on kaksi. Toinen sanoo, että se on lyhennys latinalaiselle sanalle "nihil", joka tarkoittaa "ei mitään". Ja toinen viittaa siihen, että `NIL` on englanninkielinen lyhenne sanoista “not in list” ("ei luettelossa"). Ja koska saksalainen sana „Null“ tarkoittaa numeroa "nolla" joten sekaannuksen välttämiseksi tai käsitteen ja arvon erottamiseksi niin tätäkään sanaa ei valittu. Tämä ei missään tapauksessa vaikuta ohjelmointiin. | |
| 4 | + | ||
| 5 | + | ## Yhteensopivuus | |
| 6 | + | ||
| 7 | + | `nil` voidaan tietysti [[Becomes/fi|liittää]] [[Pointer/fi|osoittimen]] muuttujaan, mutta myös muihin tyyppeihin, jotka ovat itse asiassa viitteitä, mutta niiden käyttö on helpompaa. Esimerkiksi [[Dynamic array/fi|dynaamiset taulukot]] tai [[Class/fi|luokat (Class)]]: | |
| 8 | + | ||
| 9 | + | ``` pascal | |
| 10 | + | program nilDemo(input, output, stderr); | |
| 11 | + | var | |
| 12 | + | loc: pointer; | |
| 13 | + | chk: array of boolean; | |
| 14 | + | msg: PChar; | |
| 15 | + | prc: TProcedure; | |
| 16 | + | obj: TObject; | |
| 17 | + | begin | |
| 18 | + | // osoitaa "ei minkään" | |
| 19 | + | loc := nil; | |
| 20 | + | // tyhjentää dynaamisen taulukon | |
| 21 | + | chk := nil; | |
| 22 | + | // tyhjä merkkijono | |
| 23 | + | msg := nil; | |
| 24 | + | // aliohjelmamuuttuja ei osoita mihinkään aliohjelmaan | |
| 25 | + | prc := nil; | |
| 26 | + | // kadottaa viittauksen olioon | |
| 27 | + | obj := nil; | |
| 28 | + | end. | |
| 29 | + | ``` | |
| 30 | + | ||
| 31 | + | Huomaa, että `nil` määrittäminen dynaamiselle taulukolle on käytännöllisesti katsoen samanlainen kuin [[Procedure/fi|aliohjelma]] kutsu `setLength(dynamicArrayVariable, 0)` Taulukon arvot menetetään, jos `dynamicArrayVariable`:n viitemäärä menee nollaan. Muita tyyppejä varten ei kuitenkaan ole vastaavaa mekanismia, esimerkiksi `nil` määrittäminen luokan tai osoittimen muuttujaan ei vapauta (eli de-allokoi) muistia, jossa viitataan mahdollisesti viitattuun rakenteeseen. | |
| 32 | + | ||
| 33 | + | ## Käyttö sovelluksissa | |
| 34 | + | ||
| 35 | + | Pascalissa ei yleensä kirjoiteta ilmaisuja, kuten `pointerVariable = nil`, vaan käytetään enemmän selittäviä [[Identifier/fi|tunnisteita]]. [[Function/fi|Funktio]] [[Assigned/fi|system.assigned]] korvaa täsmälleen saman lausekkeen, mutta piilottaa sen, että muuttuja on (toteutettu) osoittajana. Joten sen käyttö on valinnainen. | |
| 36 | + | ||
| 37 | + | [[Routine/fi|Rutiini]] [[FreeAndNil/fi|SysUtils.FreeAndNil]] kutsuu luokan `free` rutiinia ja määrittelee `nil` kutsussa olevaan osoittimeen (tyypin `class` muuttuja). Vaikka se on hyvä ajatus, poistaaksesi osoittimet, jotka eivät enää osoita kelvollisia osoittimia, niin tämä voi tehdä virheenkorjauksen vaikeammaksi, koska osoitinta ei ole käytettävissä, osoittaen osoitetta, jossa oli tietty kohde aiemmin. | |
| 38 | + | ||
| 39 | + | ## Katso myös | |
| 40 | + | ||
| 41 | + | - [[^/fi|^]] | |
| 42 | + | - [`system.returnNilIfGrowHeapFails`](https://www.freepascal.org/docs-html/rtl/system/returnnilifgrowheapfails.html) | |
| 43 | + | - `{$objectChecks on}` | |
| 44 | + | - [[Nullable types/fi|Tyhjennettävät tyypit (nullable types)]] | |
| 45 | + | ||
| 46 | + | --- | |
| 47 | + | *From the Free Pascal wiki, page "Nil/fi", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
