Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Приложение «Про... 61622
Организация зап... 61324
Invision Power ... 60977
Оператор выбора... 60288
Подключение Mic... 59111
Модуль Forms 58952
Создание отчето... 58526
ТЕХНОЛОГИИ ДОСТ... 54760
Программируемая... 53490
Пример работы с... 51477
Имитационное мо... 50185
21 ошибка прогр... 45150
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

Пользователей: 13,054
новичок: Prom
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование работы участка термической обработки шестерен на GPSS + По...
Метод конечных разностей для интерполяции/экстраполяции на Delphi
Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Изменение размеров массивов
Delphi до версии 4.0 (Хотя, начиная с четвертой версии, Delphi поддерживает динамические массивы, вставка и удале-
ние элементов в середине такого массива иногда выполняется довольно долго, так как приходиться
переносить множество элементов, чтобы занять появившуюся пустую ячейку. Использование указа-
телей зачастую решает проблему низкой скорости алгоритма.)
не позволяет изменять размеры массивов. После объяв-
ления размер массива остается постоянным. Однако с помощью указателей мож-
но создавать массивы с изменяемым размером - динамические массивы.
Сначала с помощью инструкции type следует определить тип массива с мак-
симальным размером. Чтобы индексы массива начинались с единицы, нужно уста-
новить его размер от 1 до 1 000 000, затем определить тип, который является указа-
телем на этот массив.
Для выделения памяти под массив используйте функцию GetMem. Ее второй
параметр указывает размер массива в байтах. Это значение должно быть равно
числу элементов массива, умноженному на размер каждого элемента. Определить
размер каждого элемента можно при помощи функции SizeOf.
Для освобождения памяти, выделенной под массив, необходимо использовать
процедуру FreeMem.
Программа SizeArr может служить примером изменения размеров массива. Вве-
дите количество элементов массива и нажмите кнопку Resize (Изменить размер).
Программа изменит размер массива. В следующем фрагменте кода представлены
наиболее интересные части программы.
type
// Определение типа массива.
.TIntArray = array [1.. 1000000] of Integer;
// Определение указателя на тип массив.
Pint Array = ATInt Array;
// <часть кода пропущена>. . .
// Изменение размера массива.
procedure TSizeArrForm.CmdResizeClick(Sender : TObject) ;
var
Numltems : Integer; // Количество элементов массива.
Items : PIntArray; // Массив элементов.
I : Integer;
Txt : String;
begin
// Выделение памяти для массива.
Txt : =
Numltems := StrToInt (NumltemsText .Text) ;
GetMem(Items,NumItems*SizeOf (Integer) ) ;
// Заполнение массива значениями.
for i : = 1 to Numltems do
begin
Txt := txt+IntToStr(ItemsA[i] ) + ' ' ;
end;
ItemsLabel. Caption := txt;
// Освобождение массива.
FreeMemf Items) ;
end;



Изменение размеров массива — мощная, но несколько опасная методика. Ра-
ботая с массивом, Delphi не определяет его размер. В программе SizeArr Delphi
воспринимает массив как указатель, содержащий миллион ячеек. Если программа
фактически выделила память только для 10 элементов, Delphi не определит по-
пытку доступа к 1 00-му элементу как ошибку. Вместо того чтобы выдать при компи-
ляции сообщение о том, что индекс массива вышел за пределы, во время выполне-
ния программа будет пытаться сделать запись в 100-ю позицию массива. В лучшем
случае обращение к этой ячейке памяти просто остановит работу программы. В худ-
шем это вызовет неявный сбой, который будет очень сложно найти.
Подобная проблема возникает, если программа использует неверно заданную
нижнюю границу массива. Предположим, что тип массива определен так, как опи-
сано в следующем фрагменте кода:
TIntArray = array [1.. 1000000] of Integer;



Подобную ошибку допустить очень просто. Неприятности начнутся, когда
программа попробует обратиться к элементу массива в нулевой позиции.
При объявлении в процедуре нового массива, такого как PIntArray, его гра-
ницы не указываются. Необходимо помнить, какой тип массива вы определили да-
лее в программе.
Программа освобождает выделенную для обычного массива память, когда он
выходит из области видимости. Например, массив, объявленный в пределах про-
цедуры, автоматически освобождается, когда процедура заканчивается.
С другой стороны, память, выделенная с помощью процедуры GetMem, остает-
ся таковой до тех пор, пока не освободится с помощью процедуры FreeMem. Пока
программа не будет завершена, доступа к памяти не будет. При этом неоднократ-
ный вызов процедуры занимает много системной памяти.
Наконец, существенную проблему создает обращение к памяти, освобожден-
ной процедурой FreeMem. Если программа освобождает память массива и затем
обращается к этому массиву, то следствием может быть либо ее остановка, либо
неявный сбой. Можно сократить вероятность возникновения такого эффекта,
сбрасывая указатель массива на нуль после освобождения памяти. В этом случае
вместо неявного сбоя попытка обращения к массиву вызовет ошибку нарушения
доступа.
Несмотря на подстерегающие опасности изменение размеров массива - очень
мощная методика. При работе со списками, меняющими свой размер, она позволя-
ет достигать очень высокой производительности.
Delphi, начиная с версии 4.0, поддерживает встроенный механизм изменяемых
массивов. По своему синтаксису работа со встроенными динамическими массива-
ми очень похожа на работу с обычными массивами языка Pascal.
Сначала следует объявить переменную массива, не указывая при этом его гра-
ниц. Изменение его размера производится с помощью процедуры SetLength. Так
как заранее длина массива не известна, потребуются еще три функции: Length,
возвращающая количество элементов массива, Low, возвращающая индекс перво-
го элемента (обычно 0) и High, возвращающая индекс последнего элемента.

// Изменение размера массива.
procedure TSizeArrForm.CmdResizeClick(Sender : TObject);
var
Numltems : Integer; // Количество элементов массива.
Items : Array Of Integer; // Массив элементов.
I : Integer;
Txt : String;
begin
// Инициализация массива.
NumIt ems : = S t rToInt(NumIt emsText.Text);
SetLength(Items,Numltems);
// Заполнение массива значениями.
Txt : =
for i := Low(Items) to High(Items) do
begin
Items[i] := i;
Txt := txt + IntToStr(Items[i]) + '' ;
end;
1 ItemsLabel.Caption := Txt;
// Освобождение массива.
SetLength(Items,0);
end;




Опубликовал Kest September 13 2009 01:54:21 · 0 Комментариев · 8681 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Delphi 7: Для про...
DCMintry
XPButtons
В.Понамарев - COM...
Counter [Исходник...
Handles
Task Shedule
Ильдар Хабибуллин...
DragMe [Исходник ...
Разработка клиент...
Delphi 6. Учебный...
Электронный магаз...
Binary2XMLDemo (Р...
PHP5. Профессиона...
Программирование ...
Применение жадног...
CoolControls v3.0...
Cтатьи Королевств...
Ehlib
Bitmap [для кнопок]

Топ загрузок
Приложение Клие... 100356
Delphi 7 Enterp... 81303
Converter AMR<-... 20037
Borland C++Buil... 10906
GPSS World Stud... 10004
Borland Delphi ... 7962
Turbo Pascal fo... 6939
Visual Studio 2... 4946
Калькулятор [Ис... 4194
FreeSMS v1.3.1 3500
Случайные статьи
4. Закрытый ключ в...
Денежные слоты
Секреты: принцип р...
Язык С и С ++: ука...
6.8. Равенство
6.2. Выполнение и...
Работайте для дост...
Спецификации MPEG-4
Canon: как выбрать...
Запись и чтение те...
Основы
Правила транспорта
Как получить много...
Файл HelloAndroidA...
Они могли произойт...
Процедуры и функци...
Вход в SQL*PLUS. ...
Точки останова в с...
Первый раз эта фра...
10.2. Приведение ...
Выдача информации ...
Вызов функции conn...
Перечисление детал...
Ввод строк
Реализация вызова ...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?