Навигация
Главная
Поиск
Форум
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
Приложение «Про... 64233
Организация зап... 62819
Оператор выбора... 62675
Invision Power ... 62219
Подключение Mic... 61038
Модуль Forms 59935
Создание отчето... 59864
ТЕХНОЛОГИИ ДОСТ... 56078
Программируемая... 55600
Пример работы с... 53188
Имитационное мо... 51450
21 ошибка прогр... 46440
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...
Поиск пути в графе заданном списками инцедентности на Turbo Pascal

Реклама



Подписывайся на 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 00:54:21 · 0 Комментариев · 8747 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
ADVstatusbar
Apollovcl61
Программирование ...
PDJPack
Tag Игра "Пятнашк...
Самоучитель PHP 4
Разработка Web-пр...
С. Г. Горнаков - ...
Delphi 2005 Учимс...
Delphi 6 программ...
Удаление своего EXE
DeleteEdit
Основы программир...
Dnavigator
Распознавание тек...
Delphi 2005 для .NET
Illusion
Как программирова...
Песочные часы
Mass Photo Upload

Топ загрузок
Приложение Клие... 100366
Delphi 7 Enterp... 82180
Converter AMR<-... 20046
Borland C++Buil... 11050
GPSS World Stud... 10421
Borland Delphi ... 8035
Turbo Pascal fo... 6959
Visual Studio 2... 4961
Калькулятор [Ис... 4259
FreeSMS v1.3.1 3508
Случайные статьи
Обратные сортировк...
Ajax - об этом дол...
от его имени
Можно ли найти уда...
собственно создани...
1.3.1. Объект Conn...
Современная реализ...
Проект VirtualSOMA
Определение шаблон...
Разработка любител...
Комбинаторы с типами
Идеальная структур...
Записи Android-при...
reconsult(X)
Идеализация процессов
групповой политики
Поддержка модема
Моделирование случ...
Совместимость язык...
Изменение значений...
Этап 1 - исключени...
Аккуратно работаем...
Query Builder.
Тестирование
Интервенция
Статистика



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


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