Basic Pascal Tutorial/Chapter 5/1-dimensional arrays/bg

From Lazarus wiki
Jump to navigationJump to search

български (bg) English (en) français (fr) 日本語 (ja) 中文(中国大陆) (zh_CN)

 ◄   ▲   ► 

5C - Едноразмерни масиви

(author: Tao Yue, state: unchanged)

Да предположим, че искате да прочетете 5000 цели числа и да направите нещо с тях. Как бихте съхранявали числата?

Може да използвате 5000 променливи, получавайки нещо като:

aa, ab, ac, ad, ... aaa, aab, ... aba, ...

Но това би станало досадно (след като декларирате тези променливи, трябва да прочетете стойности във всяка от тези променливи).

Един масив съдържа няколко места за съхранение, всички от един и същи тип. Вие се отнасяте към всяко отделно място за съхранение с името на масива и с допълнителен индекс. Дефиницията на типа е:

type
  typename = array [enumerated_type] of data_type;

Типът данни data_type може да е всякакъв, в това число и друг масив. За enumerated_type се записва изброим тип, може директно да се зададе в квадратните скоби или да се изпише името на вече дефиниран тип. С други думи:

type
  enum_type = 1..50;
  arraytype = array [enum_type] of integer;

е същото като:

type
  arraytype = array [1..50] of integer;

Бележка: Ето как низовете всъщност се управляват вътрешно - като масиви. Преди съвременните компилатори на Pascal да добавят собствена поддръжка за низове, програмиста е трябвало сам да се справя с това, като декларира:

type
  String = packed array [0..255] of char;

след което да използва някакъв вид символ, за да укаже края на низа. В повечето случаи това е т.н. символ null (числото 0 или ord(0)). Служебната дума packed означава, че масива трябва да се уплътни по такъв начин, че да заема най-малко място в паметта.

Масивите от символи често се наричат буфери. Грешки в обработката на тези буфери в езиците C и C++ могат да доведат до препълването им. Препълване се получава, когато се опитаме да поставим символен низ с дължина 200 в буфер с дължина само от 150 символа. Ако в паметта след буфера е разположена част от кода на програмата, тогава нападателят току-що е успял да инжектира произволен код във вашата система. По този начин работи известния червей Slammer, който вилня в Интернет в продължение на няколко дни. Опитайте го в Pascal и вижте какво ще се случи.

Масивите са полезни когато искате да съхранявате големи количества данни и да ги използвате по-късно в програмата. Те работят изключително удачно с цикли for защото управляващата променлива на цикъла може да се използва и като индекс в масива. Ако предположим следните дефиниции:

type
  arraytype = array[1..50] of integer;
  
var
  myarray : arraytype;

тогава за да прочетете 50 числа може да използвате следния for цикъл:

for count := 1 to 50 do
  read (myarray[count]);

Квадратните скоби [ ] ограждат индекса когато се обръщаме към определен елемент от масива.

myarray[5] := 6;
 ◄   ▲   ►