ПредишенСледващото

New Page 1

√ Масив е подреден набор от данни. Като правило, броят на елементите в масива е ограничен. Delphi среда с помощта на обекти Паскал език синтаксис, а според последните масивите са декларирани като това:

Къде index1 и indexN принадлежат към един подреден вид, които варират, както е записано в документацията за Delphi 6 е по-малко от 2 ГБ. BaseType √ тип масив елементи.

Обявихме масив My_Array, състоящ се от 100 елементи от тип реален. Решетките могат да бъдат едномерни, двумерни и п-размерите. На теория, ограниченията за размерите на масива не са, на практика, размера е ограничен от наличната памет.

Всичко това се отнася и за статични масиви. Въпреки това, статични масиви имат значителен недостатък. В повечето случаи, ние не знаем нашия масив ще се състои от колко много елементи. Ето защо е необходимо да се резервна памет "в резерв": толкова по-добре ще си запазваме повече памет за десетте елементи на масива от един елемент на масива би било излишно. Така например, при четене на данни от файл, ние не знаем колко елемента можем да прочетем: едно, две, десет или сто. Обикновено за такива задачи се прилага динамични списъци на LIFO (Last първа изходяща, комин) или FIFO (първа подадена, опашката).

Delphi разработчиците в най-новата версия (5.6) на продукта, прилагани достатъчно гъвкав механизъм за динамични масиви. Ние вече не е необходимо за създаване на динамични списъци, ние никога няма да забравя да се сложи знак "^", когато се отнася до един елемент от списъка и за определен период от време, да забравите за новия процедури, марката и да се разпорежда.

Забележка. В предишни версии (например, 3) на такъв механизъм не съществува.

Както можете да видите, ние просто се каже, Delphi, ние се нуждаем от едномерен масив от тип Real, и на неговия размер, ние казваме, просто забрави.

След повикване тази процедура ще памет за масив от 100 елементи, които ще бъдат индексирани 0-99 (обърнете внимание, че индексиращото е нулева база, а не един!).

√ динамични масиви е косвени указатели и се обслужват от един и същ механизъм, който се използва, за да се справят с дълги низове (дълги стрингове). За освобождаване на паметта, заета от динамичен масив, избран променлива, която се отнася до набор, Нил стойност: A: = нула.

Суха теория √ без практика не е нищо друго, следователно, за по-добро усвояване на материала, имайте в предвид следното програмата:

След това отворете прозореца на списъка за наблюдение, като натиснете клавишната комбинация Ctrl + Alt + W и да остане на режим Top прозорец (Team остане на върха ще се появи в падащото меню при щракване с десния бутон някъде в прозореца) до прозореца извън полезрението когато стартирате програмата .В обява 1 в близост до всеки ред имам стойностите на променливите а и Б, след като линията минава. Както можете да видите, аз съм преброил само редовете, които съдържат твърдения, които променят променливи А и Б.

Ред 1: за променливите А и В памет не се разпределя. Изводът за SetLength извикване на процедура не може да работи с множество. През втората паметта линия се разпределят само за масив А. От А √ глобална променлива, стойностите на масивите са нулеви. Ако променливата А е местен, той наложи извършване на елементите на масив. Местните променливи не са нулеви и, като правило, съдържа случайна стойност (боклук), взети от паметта, в която се намира на променливата.

В третия ред присвояваме масив масив А. Б не е необходимо да разпредели памет за масив B с SetLength Преди тази операция. При определяне на елемент Б [0] е назначен [0] елемент, В [1] √ А [1], и т.н. Обърнете внимание на линия 4: ние определя нови стойности на масив А и автоматично (масиви √ същите указатели) елементи масив В за присвояване точно същите стойности, и обратно заместник: трябва да се промени и да е елемент на масива В, промените масив елемент със съответния индекс ,

Сега започва забавно. При промяна на дължината на масив А (линия 5) се наблюдава поради разликата между масиви. Този феномен показва линията 6, съдържащ множество задачи. Първо, ние зададете стойностите на масив елементи от А: 2, 4, 5. След това се опитайте да промените стойността на елемента A [0], задаване на елемента B [0] до 1. Но както видяхме, комуникацията между масивите не съществува и след промяна на стойността на елемента B [0], стойността на елемента А [0] не са променени. Друг важен момент: при смяна на дължината на масива е просто добавя нов елемент, без никаква загуба на съществуващите стойности на пикселите (линия 5). Дължината B свързани масив остава непроменена.

В съответствие 7, ние освободи паметта разпределени за масив А. Array B остава там до края на програмата. Решетките съдържат нулева стойност дължина нула.

Необходимо е да се каже няколко думи за сравняване на масиви:

Когато опитвате сравнение A = B и B = A получаваме вярно: масиви са равни. Но в такава ситуация, сравнението стигнем невярно:

Когато се опитате да се придаде стойност на елемент статичен масив, чиито индекс е извън границите на масива, ние получаваме съответната грешка: Постоянно израз нарушава subrange граници (нарушение обсег ограничения). Когато се работи с динамични масиви, вие няма да видите тази грешка. От една страна е добре, а от друга √ лошото. Можете да прекарате много време, за да разбера защо не можете да се придаде стойност на елемент на масив с индекса 4, докато не се установи, че в началото на програмата, да се разпределят само три елемента. Сега, тази ситуация изглежда нелепо, но това се случва по-често, отколкото си мислите. SetLength функция генерира EOutOfMemory грешка, ако има достатъчно памет за разпределяне масив.

Да не се използва оператора "*" на променливата на динамичен масив. Също така, не мине променлива масив New или процедура Изхвърлете за разпределение или deallocation.

След динамичния масив е бил разпределен, можете да мине масив от стандартните функции Дължина, висока и ниска. Дължина връща броя елементи в масива, High връща масив от най-индекс (т.е. дължина √ 1), ниско връща 0. В случай на масив с дължина нула има парадоксален ситуация: висока възвращаемост -1 и ниска √ 0, се оказва, че висока

Как можем да използвате функциите, високо и ниско с най-голяма полза? За това ние считаме процес първоначален и функция сумата на. Първият от тези инициализира масив (нулира стойностите на елементите) и втората √ изчислява сумата на елементите на масива:

Не е ясно едно: Възможно ли е да се използва с много измерения динамични масиви? Да, ние можем. Установи двуизмерен масив може да бъде, както следва:

За да се разпредели памет е необходимо да се обадите на процедура SetLength с два параметъра, например,

Работа с двумерен динамичен масив може да бъде същата като на статиката:

Можете да създадете не-правоъгълни масиви. За да направите това, първо да декларира масива:

След това създайте н редове, но без колони, например,

Сега можете да създадете колони с различна дължина:

Забележка. Ако сте работили с по-ранни версии на Delphi, вие вероятно знаете, че SetLength функция се използва за да се променя динамично дължината на низа. Най-вероятно не сте го използвате, тъй като дължината на низ променя автоматично по време на една задача.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!