Nil/fi
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
русский (ru) │
中文(中国大陆) (zh_CN) │
Varattu sana nil
edustaa osoittimen muuttujan erityistä vakio arvoa, joka ei osoita mihinkään erityiseen (muuttujaan).
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 Pascal-ohjelmoijien keskuudessa.
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.
Yhteensopivuus
nil
voidaan tietysti liittää osoittimen muuttujaan, mutta myös muihin tyyppeihin, jotka ovat itse asiassa viitteitä, mutta niiden käyttö on helpompaa.
Esimerkiksi dynaamiset taulukot tai luokat (Class):
program nilDemo(input, output, stderr);
var
loc: pointer;
chk: array of boolean;
msg: PChar;
prc: TProcedure;
obj: TObject;
begin
// osoitaa "ei minkään"
loc := nil;
// tyhjentää dynaamisen taulukon
chk := nil;
// tyhjä merkkijono
msg := nil;
// aliohjelmamuuttuja ei osoita mihinkään aliohjelmaan
prc := nil;
// kadottaa viittauksen olioon
obj := nil;
end.
Huomaa, että nil
määrittäminen dynaamiselle taulukolle on käytännöllisesti katsoen samanlainen kuin 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.
Käyttö sovelluksissa
Pascalissa ei yleensä kirjoiteta ilmaisuja, kuten pointerVariable = nil
, vaan käytetään enemmän selittäviä tunnisteita. Funktio system.assigned
korvaa täsmälleen saman lausekkeen, mutta piilottaa sen, että muuttuja on (toteutettu) osoittajana. Joten sen käyttö on valinnainen.
Rutiini 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.
Katso myös
^
system.returnNilIfGrowHeapFails
{$objectChecks on}
- Tyhjennettävät tyypit (nullable types)