interval.cz

Pole ve Visual Basic skriptu

14. 08. 2000 | Ondřej Kopp | ASP | Komentáře: 0

Pole? Co to vlastně je? A k čemu je to dobré? Pokud neznáte odpověď na tyto otázky - nevadí, po přečtení tohoto článku určitě budete vědět, co odpovědět.

Pole? Co to vlastně je? A k čemu je to dobré? Pokud neznáte odpověď na tyto otázky, nevadí, po přečtení tohoto článku určitě budete vědět, co na ně odpovědět. K čemu je pole dobré? Výrazně šetří práci při programování a vede k úspoře napsaného kódu, zpřehledňuje vlastní program. Vezměme si například tento kód, který je napsán bez použití polí a dělá to, že vypisuje název aktuálního měsíce.


Dim leden,unor,brezen,duben,kveten,cerven,cervenec,srpen,zari,rijen,listopad,prosinec
leden="Leden"
unor="Únor"
brezen="Březen"
duben="Duben"
kveten="Květen"
cerven="Červen"
cervenec="Červenec"
srpen="Srpen"
zari="Září"
rijen="Říjen"
listopad="Listopad"
prosinec="Prosinec"
select case month(date)
  case 1:
    Response.Write (leden)
  case 2:
    Response.Write (unor)
  case 3:
    Response.Write (brezen)
  case 4:
    Response.Write (duben)
  case 5:
    Response.Write (kveten)
  case 6:
    Response.Write (cerven)
  case 7:
    Response.Write (cervenec)
  case 8:
    Response.Write (srpen)
  case 9:
    Response.Write (zari)
  case 10:
    Response.Write (rijen)
  case 11:
    Response.Write (listopad)   case 12:
    Response.Write (prosinec)
end select

A zde je druhý kód, který dělá úplně to samé, ale používá pole:


dim mesice(11)
mesice(0)="Leden"
mesice(1)="Únor"
mesice(2)="Březen"
mesice(3)="Duben"
mesice(4)="Květen"
mesice(5)="Červen"
mesice(6)="Červenec"
mesice(7)="Srpen"
mesice(8)="Září"
mesice(9)="Říjen"
mesice(10)="Listopad"
mesice(11)="Prosinec"
Response.Write (mesice(month(date))-1)

Jak sami jistě uznáte, použitím polí se náš krátký příklad zjednodušil a dá se říci, že i zpřehlednil.

Druhý příklad je nejen kratší co do délky použitého kódu a přehlednější, ale i rychlejší. V druhém příkladě rovnou definujeme jméno pole a řekneme poli, že má dvanáct prvků a tyto prvky rovnou naplníme řetězci, kdežto v prvním jsme museli nejdříve deklarovat 12 proměnných a poté každou z nich zvlášť naplnit řetězcem.

V druhém příkladě si navíc ušetříme procházení konstrukce case a zpracujeme odpovídající číslo prvku pole jediným řádkem kódu.

Pokud budete pátrat po tom co vlastně pole je, pravděpodobně najdete definici podobnou této. "Pole je strukturovaný datový objekt tvořený konečným počtem složek se stejnými atributy; každá z těchto složek je jednoznačně určena indexy." (ČSN 36 9001/15-1987). Že vám tato definice nic neříká? Pokusím se to vysvětlit jednodušeji.

Jakou naprosto jednoduchý příklad pole vezměme hrací pole pro šachy. Jak jistě všichni víte, šachovnice je deska, na které je namalována tabulka o 8 řádcích a 8 sloupcích. Každá buňka (úmyslně nechci použít termín pole) hrací plochy je jednoznačně identifikována číslem a písmenem (indexem).

Pokud tento jednoduchý příklad převedeme do řeči VBS, můžeme říci, že šachovnice je dvojrozměrné pole.

Zmínil jsem se o dvourozměrném poli a zvídavý čtenář jistě už má na jazyku otázku. "Existuji také jednorozměrná a třeba třírozměrná pole". Odpověď zní ano. Jednorozměrné pole je vlastně jeden řádek tabulky (např. jednorozměrným polem se dá nazvat postavení "pěšáků" jedné barvy před zahájením hry). Tří a vícerozměrná pole lze sice ve VBS použít, ale praktický příklad a použití vícerozměrných polí mně nenapadá.

Při práci s poli se jistě setkáte s termínem vektor a matice. Co tyto dva tajemné termíny znamenají? Vektor je jednorozměrné pole a matice je pole dvourozměrné.

Deklarace polí
Před vlastním použitím pole je nutné pole deklarovat - to provedeme pomocí příkazu Dim, kde za název pole uvedeme požadovaný rozměr pole. Ukážeme si to opět na příkladu ze hry šachy. Deklarujeme si dvojrozměrné pole (matici) šachovnice a jednorozměrné pole (vektor) pěšáci.


Dim Sachovnice(7,7)
Dim Pesaci(7)

Pozorný čtenář si jistě hned zeptá, proč je použita při deklaraci proměnných 7, když šachovnice má 8x8 políček. Je to proto, že index pole začíná od 0 a tudíž máme k dispozici index 0-7 což je 8 hodnot.

Dynamická a statická pole
Statické pole je takové pole, u kterého definujeme rozměr předem (při psaní programu víme, jak bude pole velké) a tento rozměr již nemůžeme v průběhu činnosti programu změnit. Typický příkladem statického pole jsou například měsíce v roce.

Dynamické pole je takové pole, u kterého při psaní programu nejsme schopni říci, jak velké pole bude. Velikost pole vyplyne, až při běhu programu. Typický případem pro použití dynamického pole je výpis adresářové struktury disku, kde předem nevíme, kolik adresářů a souborů máme na disku.

Pokud definujeme pole pomocí příkazu Dim pole(9), máme k dispozici statické pole proměnných i s indexem 0-9 a do tohoto pole můžeme uložit maximálně 10 položek. Co si ale počneme v případě, že potřebujeme do pole uložit předem neznámý počet prvků (například adresářovou strukturu na disku)? V tomto případě použijeme dynamické pole. Dynamické pole definujeme tak, že v příkazu Dim neuvedeme do závorek maximální index pole.


Dim Pole()

O této chvíle máme k dispozici pole, jehož maximální index můžeme v průběhu skriptu měnit podle potřeby. Ale pozor, po příkazu Dim Pole() nelze do tohoto pole ještě zapisovat. Musíme určit jeho rozměr (změnit jeho velikost na nenulovou hodnotu). Změna velikosti pole se provádí pomocí příkazu ReDim:


ReDim Pole(maximalni index)

Ale pozor - při použití příkazu ReDim je obsah stávajícího pole vymazán. Pokud chceme stávají obsah zachovat, použijeme drobnou modifikaci příkazu ReDim a to sice příkaz ReDim Preserve:


ReDim Preserve Pole(maximalniindex)

Možná, že někoho z vás napadla myšlenka použít příkaz ve scriptu tento kód:


maximalniindex=10
Dim Pole(maximalniindex)

Tento příkaz je zcela chybný a vede k chybě skriptu při kompilaci (ostatně, zkuste si to). Důvodem této chyby je, že je očekávána celočíselná hodnota jako velikost pole (to je údaj, který je v závorkách za jménem pole) a ta v době průběhu skriptu ještě není známa. K vykonání přiřazení maximální index=10 dojde teprve až při běhu programu.

Správné řešení tohoto úseku kódu je toto:


maximalniindex=10
Dim Pole()
ReDim Pole(maximalniindex)

Co vlastně touto posloupností příkazů dostaneme? Obdržíme pole, do kterého je možné zapsat maximálně 10 prvků, ale narozdíl od pole definovaného staticky můžeme velikost tohoto pole kdykoliv změnit .

A jak se do pole zapisuje? A jak se z něj hodnoty čtou? S pole se pracuje stejně jako s ostatními proměnnými - pouze s tím rozdílem, že za jméno proměnné se do kulatých závorek udává index. Index je pořadové číslo buňky v poli.

Zjištění maximálního indexu pole
Pro procházení polí pomocí cyklů je velmi důležité znát maximální index pole, což vlastně v případě pole, jehož maximální index je dynamicky měněn, velký problém. Tento problém zcela eliminuje funkce Ubound, která vrací numerickou hodnotu a která určuje maximální použitelný index pole.


maximalniindex=10
Dim Pole()
ReDim Pole(maximalniindex)
For i=0 To Ubound(Pole)
....
Next

Možná, že vás napadne, k čemu je dobré znát maximální index pole. Je to nutné znát pro procházení polí, neboť se nesmíte odkazovat mimo pole.

To je pro dnešek vše. A co nás čeká příště? Po poněkud nudném úvodu do polí nás příště čeká převod proměnných na pole, spojování polí do řetězce a rozdělování řetězců do polí a několik dalších ukázek s maticemi a vektory.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Diskuse (počet komentářů: 0)

Buďte prvním návštěvníkem, který přidá nový komentář.

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena. Hosting zajišťuje CZECHIA.COM. SSL certifikáty pro domény. Powered by WordPress.