атегор≥њ

≤нш≥ сайти по VB

ћасиви в Visual Basic

text-indent

ћасив - це наб≥р елемент≥в певного типу, кожен з ¤ких маЇ св≥й пор¤дковий номер, званий ≥ндексом. –озр≥зн¤ють статичн≥ ≥ динам≥чн≥ масиви.

ћеж≥ статичного масиву встановлюютьс¤ на етап≥ розробки ≥ можуть зм≥нюватис¤ т≥льки в нов≥й верс≥њ програми.

ƒинам≥чн≥ масиви зм≥нюють своњ меж≥ в ход≥ виконанн¤ програми. « њх допомогою можна динам≥чно задавати розм≥р масиву в≥дпов≥дно до конкретних умов. ѕроте сл≥д врахувати, що робота з динам≥чними масивами вимагаЇ додаткових витрат на програмуванн¤.

—татичн≥ масиви

ƒл¤ цього можна просто визначити ≥ використовувати 150 р≥зних зм≥нних типу String. јле вс≥ мови програмуванн¤ високого р≥вн¤ пропонують краще р≥шенн¤ - масиви (arrays).

«ам≥сть оголошенн¤ 150 р≥зних зм≥нних (типу namel, name2, name3, пате4 ...) можна просто оголосити один масив, що м≥стить 150 однотипних елемент≥в.

ƒл¤ оголошенн¤ масиву використовуЇтьс¤ оператор Dim з вказ≥вкою в круглих дужках п≥сл¤ ≥мен≥ масиву його максимального ≥ндексу;

Dim aname(150) As String

¬ цьому випадку елементи зм≥нноњ aname розр≥зн¤ють не по ≥мен≥, а по ≥ндексу:

aname(4)= "≤ванов" Print aname(4)

ќбласть визначенн¤

“е, що вже мовилос¤ про час житт¤ ≥ област≥ визначенн¤ зм≥нних, в≥дноситьс¤ переважно ≥ до масив≥в. ѕроте статичн≥ масиви не можна визначити локально усередин≥ процедури, а т≥льки глобально або дл¤ контейнера:

[Static | Public | Dim] ≤м`¤ _ зм≥нноњ (¬ерхн¤_границ¤) [As “ип_данних]

≤ндексуванн¤ з нул¤

ѕри використанн≥ масив≥в не сл≥д забувати, що в Visual Basic ≥ндексуванн¤ завжди починаЇтьс¤ з нул¤, тобто ≥ндекс 0 позначаЇ перший елемент масиву, ≥ндекс 1 - другий ≥ так дал≥

Option Base

ќператор Option Base дозвол¤Ї задати ≥ндексац≥ю масиву з 1:

'(General)(Declarations) Option Base 1

÷ей оператор повинен знаходитис¤ в секц≥њ General Declarations контейнера (форми, модул¤, класу).

ƒопустимими значенн¤ми дл¤ Option Base Ї т≥льки 0 ≥ 1. ÷ей оператор служить дл¤ того, щоб забезпечити сум≥сн≥сть Visual Basic з ≥ншими д≥алектами Basic, ≥ндексац≥¤ в ¤ких починаЇтьс¤ з 1.

ƒл¤ установки ≥нших меж масиву необх≥дно використовувати наступний синтаксис:

[Static | Public | Dim] ≤м`¤_перем≥нноњ (Ќижн.границ¤ “е] ¬ерхн. границ¤)

¬каз≥вкою верхньоњ ≥ нижньоњ меж можна задати будь-¤к≥ д≥апазони ≥ндексу. ÷е зручно, ¤кщо ≥ндекс несе також певне смислове навантаженн¤ (дата, номер замовленн¤, в≥к ≥ тому под≥бне):

Dim abirthdate(1980 “е 2050)

Ѕагатовим≥рн≥ масиви

Visual Basic дозвол¤Ї також створювати багатовим≥рн≥ масиви. ѕри оголошенн≥ багатовим≥рного масиву верхн≥ меж≥ кожноњ розм≥рност≥ розд≥л¤ютьс¤ комами:

Dim aname(10, 25) As String

ћасив з ≥м'¤м aname може м≥стити 286 р≥зних значень (11*26 =286).

Private Sub Command1_click() aname(1, 3)= "X" End Sub

–озм≥рн≥сть масиву може бути ≥ б≥льше. Ќаприклад, ви складаЇте список учн≥в п'¤ти р≥зних шк≥л, в кожн≥й з ¤ких по дес¤ть клас≥в, а в кожному клас≥ максимум 30 учн≥в.

¬ цьому випадку можна використовувати тривим≥рний масив, де перше вим≥рюванн¤ в≥дноситьс¤ до школи, друге - до класу, а третЇ - до номера учн¤:

Dim astudent(5, 10, 30) astudent(3, 5, 17)= "≤ванов"

” даному приклад≥ "≤ванов" - це пр≥звище п≥д номером 17 учн¤ 5-го класу школи номер 3.

јле тривим≥рний масив ще не межа - в Visual Basic значенн¤ розм≥рност≥ масив≥в можуть дос¤гати 60.

ƒл¤ окремих значень розм≥р≥в можуть указуватис¤ д≥апазони ≥ндекс≥в:

Dim aarray(10, 80 “е 120, 40 “е 45, 1 “е 256, 3, 1997 “е 2050)

ƒинам≥чн≥ масиви

≤нод≥ при оголошенн≥ масиву його розм≥р не в≥домий. ¬ цьому випадку сл≥д оголошувати динам≥чний масив, що дозвол¤Ї зм≥нювати його розм≥р або розм≥рн≥сть п≥д час виконанн¤ застосуванн¤.

ƒинам≥чний масив створюЇтьс¤ в два етапи. —початку масив визначають в секц≥њ General Declarations контейнера (форми, модул¤, класу) без вказ≥вки розм≥ру:

Dim aarray() As Variant

ѕот≥м за допомогою оператора Redim встановлюють фактичний розм≥р масиву:

Dim aarray() As Variant Private Sub Command1_click() Redim aarray(50, 10) ' од End Sub

—интаксис оператора Redim:

Redim [Preserve] ≤м`¤_перем≥нноњ (ћеж≥) [As “ип_даних]

Ќа в≥дм≥ну в≥д звичайного Dim, оператор Redim використовуЇтьс¤ т≥льки в процедурах. ѕри цьому тип даних указувати не обов'¤зково, особливо ¤кщо в≥н вже визначений оператором Dim. ¬и можете використовувати оператора Redim дл¤ зм≥ни числа елемент≥в або розм≥рност≥ масиву. ѕроте ви не можете оголосити масив даними одного типу, а пот≥м використовувати Redim дл¤ приведенн¤ масиву до ≥ншого типу, за вин¤тком випадку, ¤кщо масив м≥стить зм≥нн≥ типу Variant. ¬ цьому випадку приведенн¤ масиву до ¤вного типу даних допустимо.

“аким чином, розм≥рн≥сть масиву можна при необх≥дност≥ зм≥нити. јле тод≥ виникаЇ небезпека втратити його вм≥ст, оск≥льки п≥сл¤ зм≥ни розм≥рност≥ елементам масиву привласнюютьс¤ значенн¤ за умовчанн¤м.

ѕроте Visual Basic надаЇ можлив≥сть зм≥нювати розм≥рн≥сть масиву без втрати вм≥сту. ƒл¤ цього сл≥д використовувати Redim разом з ключовим словом Preserve:

Dim aarray() As Variant Private Sub Comroand1_click() Redim Preserve aarray(50, 15) ' од End Sub

¬икористанн¤ з оператором Redim зарезервованого слова preserve дозвол¤Ї зберегти вм≥ст масиву при зм≥н≥ його розм≥ру або розм≥рност≥. јле сл≥д враховувати, що дл¤ багатовим≥рних масив≥в можна зм≥нювати т≥льки останнЇ вим≥рюванн¤:

Dim aarray() As Variant Private Sub Command1_click() Redim aarray(10, 10) Redim Preserve aarray(10, 15) 'д≥Ї Redim Preserve aarray(15, 15) 'помилка End Sub

ѕри зм≥н≥ розм≥рност≥ можна також зм≥нювати верхню ≥ нижню меж≥ ≥ндексу. јле ¤кщо при цьому використовуЇтьс¤ ключове слово Preserve, то дозволено зм≥нювати т≥льки верхню межу:

Dim aarray() As Variant Private Sub Command1_click() Redim aarray(10, 20) Redim Preserve aarray(10, 25) 'д≥Ї Redim Preserve aarray(15, 25) 'помилка End Sub

ќбласть видимост≥ динам≥чних масив≥в (контейнерних, глобальних) визначаЇтьс¤ способом њх оголошенн¤ - ¤кщо за допомогою оператора Public, то масив буде глобальним, ¤кщо за допомогою Dim, то контейнерним.

ѕрисвоЇнн¤ масив≥в

ѕочинаючи з Visual Basic 6.0, ви маЇте можлив≥сть присвоњти вм≥ст одного масиву ≥ншому так само, ¤к ви присвоюЇте значенн¤ одн≥Їњ зм≥нноњ ≥нш≥й. Ќаприклад, вам необх≥дно скоп≥ювати масив байт≥в. ÷е можна зробити, коп≥юючи байт за байтом:

Sub Bytecopy(oldcopy As Byte, newcopy As Byte) Dim i As Integer Redim newcopy(Lbound(oldcopy) To Ubound(oldcopy)) For i = Lbound(oldcopy) To Ubound(oldcopy) newcopy(i)= oldcopy(i) Next i End Sub

ѕроте набагато прост≥ше ≥ приваблив≥ше це вигл¤даЇ, ¤кщо привсвоњти один масив ≥ншому:

Sub Bytecopy(oldcopy As Byte, newcopy As Byte) newcopy = oldcopy End Sub

≤снують певн≥ правила присвоЇнн¤ зм≥нних, ¤к≥ не варто забувати. Ќаприклад, ¤кщо присвоЇнн¤ зм≥нноњ, оголошеноњ ¤к Long, значенн¤ зм≥нноњ типу Integer зд≥йснюЇтьс¤ без вс¤ких проблем, то привласненн¤ значенн¤ зм≥нн≥й типу Long зм≥нноњ типу Integer легко може викликати помилку переповнюванн¤ (overflow). Ќа додаток до правил роботи з типами даних, при привласненн≥ масив≥в необх≥дно враховувати розм≥рност≥ масив≥в, к≥льк≥сть елемент≥в в масивах разних размерностей ≥ тип масиву - статичний або динам≥чний.

—проба присвоЇнн¤ масив≥в р≥зних розмрностей ≥ тип≥в даних може бути усп≥шною або неусп≥шою взалежност≥ в≥д наступних чинник≥в:

типу масиву, використовуваного в л≥в≥й частин≥ оператора привласненн¤ (статичний або динам≥чний);

зб≥ги/несп≥впаданн¤ к≥лькост≥ размерностей масив≥в в л≥в≥й ≥ прав≥й частин≥ оператора привласненн¤;

зб≥ги/несп≥впаданн¤ к≥лькост≥ елемент≥в в кожн≥й розм≥рност≥ масив≥в;

“ип масиву в л≥в≥й частин≥ оператора присвоЇнн¤

—п≥впадають значени¤ розм≥рностей?

—п≥впадаЇ к≥льк≥сть елемент≥в?

–езультат присвоЇнн¤

ƒинам≥чний

Ќ≥

“ак або Ќ≥

”сп≥шно. –озм≥рн≥сть ≥ число елемент≥в масиву в л≥в≥й частин≥ присвоЇнн¤ при необх≥дност≥ зм≥нюЇтьс¤.

ƒинам≥чний

“ак

Ќ≥

”сп≥шно. –озм≥рн≥сть ≥ число елемент≥в масиву в л≥в≥й частин≥ присвоЇнн¤ при необх≥дност≥ зм≥нюЇтьс¤.

ƒинам≥чний

“ак

“ак

”сп≥шно.

—татичний

“ак або Ќ≥

“ак або Ќ≥

Ќеусп≥шно, з помилеою при компил¤ц≥њ.

–езультати присвоЇнн¤ масив≥в

ѕомилки можуть виникнути ¤к при комп≥л¤ц≥њ, так ≥ п≥д час виконанн¤ додатку, тому вам сл≥д поклопотатис¤ про њх обробку.

Ќа головну

Hosted by uCoz