Array/fi
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
Bahasa Indonesia (id) │
日本語 (ja) │
русский (ru) │
中文(中国大陆) (zh_CN) │
Taulukko on rakenteellisen data tyypin käsite.Se ryhmittelee saman tyyppisiä elementtejä. Ryhmä tarjoaa satunnaisen pääsyn jokaiseen sen elementtiin tai komponenttiin, lineaarisella indeksillä.
Taulukkoa tarkoittava sana array
on varattu sana.
Sana array on varattu sana. Se esiintyy aina yhdessä sanan of
kanssa.
Käsite
Taulukko eli array
on rajoitettu ja järjestetty elementtiyhdistelmä, joilla kaikilla on sama tietotyyppi, jota kutsutaan "perustyypiksi".
Sillä on ainakin yksi erillinen, rajattu ulottuvuus, jossa luetellaan peräkkäin kaikki sen elementit.
Kukin elementti voidaan yksilöidä yksilöllisesti yhdellä tai useammalla skalaariarvolla, joita kutsutaan indekseiksi, näiden ulottuvuuksien mukaisesti.
Yksiulotteinen taulukko (array
) muistuttaa n-tuplea, kuten matematiikasta tiedetään, mutta sillä on rajoitus olla homogeeninen (kaikki elementit pitää olla saman tyyppisiä).
Kaikkien mahdollisten arvojen, joita tällainen ryhmä voi sisältää, on valikoima homogeeninen peruskartaninen tuote, joka on perustyyppi.
Kaksiulotteinen taulukko muistuttaa matemaattista konseptia nimeltä matriisi, paitsi homogeenisuusrajoituksella.
Käyttö
Pituus
Alun perin Pascal:ssa oli vain kiinteän pituuden mukainen taulukko (Standard Pascal). Kuinka monesta elementistä taulukko koostui, oli tiedettävä käännösaikana. Koska tämä osoittautui suureksi rajoitukseksi ja puhumattakaan muutoksista tietokoneiden laitteistoissa, sen jälkeen on perusteltua ottaa askel eteenpäin, vaihtelevan pituinen taulukko esiteltiin.
Extended Pascal määritteli tähän käsitteen "schemata". Delphi esitteli “dynamic arrays”. Vuonna 2018 FPC tukee viimeksi mainittuja vain pituudeltaan vaihtelevia taulukkoja, kun taas "schemata" -tuki on vasta suunnitteluvaiheessa.
Riippuen siitä, onko taulukon tarkoitus pystyä muuttamaan sen kokoa, sen määritelmä vaihtelee, mutta vain marginaalisesti. Yksiulotteinen staattinen taulukko tyypin määritelmä näyttää tältä:
array[indexType] of baseType
Dynaamisen taulukkotyypin määritelmä on yksinkertaisesti vapautettu ulottuvuuden määrityksestä:
array of baseType
Staattinen taulukko
Staattisissa taulukoissa kaikki mitta-alueet tunnetaan etukäteen. Kaikkien ulottuvuuksien on oltava peräkkäisiä. Seuraava koodi näyttää voimassa olevat taulukon määritykset, jotka kaikki ovat staattisia.
program staticArrayDemo(input, output, stderr);
type
// specifying ordinal types as index directly
/// allows selection of a character
/// based on a Boolean value
characterChoice = array[boolean] of UCS4char;
// enumerations
/// enumerates Cartesian axes
spaceAxis = (xAxis, yAxis, zAxis);
/// a point in three-dimensional Euclidean space
locus = array[spaceAxis] of valReal;
/// a point in a two-dimensional Euclidean plane
point = array[xAxis..yAxis] of valReal;
// integer subranges
level = array[-24..24] of longint;
box = array[-1..1, -1..1, -1..1] of boolean;
transformationMatrix = array[0..1, 0..1] of valReal;
begin
end.
Koska kaikkien taulukon elementtien täytyy olla osoitettavissa, on olemassa elementtien maksimiraja, jota taulukko voi pitää. Jokaisen taulukon koon (sizeOf
) on oltava pienempi kuin ptrInt
n maksimiarvo.
Dynaamiset taulukot
Dynaaminen taulukko on lähestymistapa, jolla voittaa etukäteen kaikkien ulottuvuuksien tuntemisen rajoitukset. Katso lisätietoja sen omilta sivuilta.
Elementtien osoittaminen
Taulukon yksittäinen elementti on osoitettu nimeämällä taulukon muuttujan tunniste seuraten kelvoitelukujen sisältämää kelvollista indeksiä joka on hakasulkujen sisällä.
program arrayAddressDemo(input, output, stderr);
var
msg: array[0..2] of char;
begin
msg[0] := 'H';
msg[1] := 'i';
msg[2] := '!';
writeLn(msg);
end.
Moniulotteisten taulukoiden elementtejä voidaan käsitellä kahdella tavalla: joko pilkulla erotettavilla indekseillä:
arrayVariable[firstDimensionIndex, secondDimensionIndex, thirdDimensionIndex]
Tai sijoittamalla indeksejä omiin hakasulkeisiin:
arrayVariable[firstDimensionIndex][secondDimensionIndex][thirdDimensionIndex]
Kolmas syntaksellisesti kelvollinen vaihtoehto olisi sekoittaa molemmat tyylit, mutta sitä pidetään huonona tyylinä, ehkä jos ei ole merkkejä ryhmähakemistoille (esim. x
, y
ja z
-koordinaatit verrattuna muihin indekseihin) on OK. Siitä huolimatta vain ensimmäinen mainittu merkintä on voimassa, kun määritetään taulukon tyyppejä.
Huomaa, että on erittäin tärkeää määritellä indeksejä määritetyssä järjestyksessä kunkin ulottuvuuden alueella. Mieti seuraavaa ohjelmaa. Se kääntyy, mutta epäonnistuu ajon aikana
{$rangeChecks on}
:
program arrayAddressOrderDemo(input, output, stderr);
{$rangeChecks on}
var
i: integer;
f: array[0..1, 0..3] of boolean;
begin
for i := 0 to 7 do
begin
f[0, i] := true;
end;
end.
Vaikka ohjelma todellakin iteroidaan jokaisen taulukon elementin yli, se ei tee sitä suunnitellulla tavalla, mutta hyödyntää sitä, että taulukon sisäinen muistin rakenne, on vain jatkuva muistilohko. Tämä on huonoa tyyliä. Korkean tason kielen ohjelmoijan ei tarvitse huolehtia tietyistä muistin asetteluista. Luola: Tällä tavoin voidaan muokata muita muuttujia. Joka tapauksessa esiintyy ajonaikainen virhe, nimittäin ”RTE 216 general protection fault”, jos yritetään päästä muistiin, joka ei kuulu ohjelmoijan toimivaltaan.
Kun taulukoiden arvoja luetaan niin ettei tarvita sen indeksiä niin voidaan for … in
luupilla (silmukalla) käydä taulukko läpi.
Sovellukset
Katso esimerkiksi:
- array sort
- 15.peli tai Peg:n pelilaudan tilat tallennetaan taulukkona
Oletus RTL: n system käännösyksikön funktio system.slice
palauttaa taulukon alkuosan,
joka on samanlainen kuin Rubyn notation aarrayVariable[0, n]
. Lisäksi on system.arrayStringToPPchar
.
Useimmat RTL:n matematiikkayksikön tilastolliset rutiinit hyväksyvät taulukon parametreiksi niinkuin jotkut muutkin rutiinit.
Katso myös
- Type information
- Opas: 1-dimensional arrays
- Opas: multidimensional arrays
- example: multidimensional dynamic array
- Why Pascal is not my favorite programming language § “the size of an array is part of its type”
- defensive programming techniques
- vectorization
matrix
unit
Yksinkertaiset datatyypit |
|
---|---|
Monimutkaiset datatyypit |