| | | | |
Глава 2. Основы языка Delphi. Часть V. | Полный текст материала
Другие публикации автора: Кирилл Сурков
Цитата или краткий комментарий: «... Записи; файлы; динамические массивы; указатели; ассемблер в Delphi. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[Записи, типизированные файлы ] [Указатели, работа с памятью] [Динамические массивы]
Отслеживать это обсуждение
Всего сообщений: 1103-07-2007 07:36Алексею Позднякову:
А где, извините, в вашем коде инициализация первых десяти элементов mas? В FormCreate вы создаёте массив, а потом в цикле выводите значение счётчика цикла, а элементы массива так и остаютося неинициализированными.
И, кстати, циклы надо делать не до Length(mas), а до High(mas), потому что динамические массивы индексируются с нуля. Соответственно, чтобы проинициализировать добавленные в Button1Click элементы, цикл должен быть от 10 до High(mas), а не от 11 до Length(mas). |
|
03-07-2007 06:33
SetLength(DynArray, 50); // Выделить память для 50 элементов
Изменение размера динамического массива производится этой же процедурой:
SetLength(DynArray, 100); // Теперь размер массива 100 элементов
При изменении размера массива значения всех его элементов сохраняются.
НАписал простенький тест:
procedure TForm1.FormCreate(Sender: TObject);
var
I:Smallint;
begin
SetLength(mas,10);
for I := 0 to Length(mas) do Memo1.Lines.Add(IntToStr(I));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I:Smallint;
begin
SetLength(mas,15);
for I := 11 to Length(mas) do mas[I]:=I*2;
for I := 0 to Length(mas) do Memo2.Lines.Add(IntToStr(mas[I]));
end;
Сначала задаем массиву размер 10 и заполняем его. Потом по нажатию кнопки увеличиваем размер до 15 и заполняем оставшиеся 5 позиций. И вывожу это все в Мемо2.
Получаю 11 нулей и 5 запоненных значений.
Т.е. выходит, что утверждение "При изменении размера массива значения всех его элементов сохраняются" не верно? |
|
30-11-2005 03:42сообщение от автора материала >>> Может быть в данном цикле статей как раз и нехватает разбора таких типичных задачек. Повторюсь-на форуме таких примеров масса.
Спасибо, обязательно это учтем, когда будем дорабатывать книгу. |
|
29-11-2005 13:47При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
Может все-таки не стоит давать начинающим такие тонкости, как Packed Record. Материал все-таки для начинающих, и как подсказывает мой личный опыт, для преподования самое главное "не вспугнуть" обучающегося. А тонкости им приходят с опытом. Столкнется вплотную начинающий программист со скоростью работы своего приложения - задумается и о скорости, и об экономии памяти. А вот типичные ошибки, причины их появления и т.п. - это очень важно. Как там говорится - "Умные учатся на ощибках других, а мудрые научились на своих". В подобных статьях очень важно понять логику начинающего и попытаться подать материал на его уровне. В математике огромное применение находят так называемые "решебники", в которых кроме теоретического материала приводятся решения задач, и разбор типичных ошибок. Эти книги очень популярны. Может быть в данном цикле статей как раз и нехватает разбора таких типичных задачек. Повторюсь-на форуме таких примеров масса. |
|
29-11-2005 12:392 Johny B.>>> да, и что такое Packed Record ...
Да, это нужно объяснять подробно. Если в записи первое поле имеет тип данных Byte, а второе - Word, то поле с типом данных Word оказывается расположенным по нечетному адресу. Это отрицательно сказывается на производительности. Чтобы повысить производительность, поля выравниваются компилятором (2-байтовые - на 2-байтовой границе, 4-байтовые - на 4-байтовой, 8-байтовые - на 8-байтовой). Однако в таком случае увеличивается размер записи в памяти, размер которой превышает суммарный размер всех полей. Слово packed заставляет компилятор отказаться от выравнивания. И хотя такого же эффекта можно достичь благодаря изменению последовательности полей в записи, следует помнить, что это не одно и то же. Кроме того, на платформе .NET (если не указано слово packed) физическую последовательность полей в записи выбирает динамический компилятор (например, при загрузке программы в память).
Сообщение не подписано |
|
29-11-2005 11:47Рекомендую авторам просмотреть внимательно этот форум - найдете очень много вопросов по этой теме. Например, как включить в строку апостроф, особенности передачи параметров - динамических массивов в подпрограммы и т.д. Вообщем все то, на чем обжигаются все начинающие программисты. Цены не будет Вашим работам. |
|
29-11-2005 09:38нда, и что такое Packed Record .. |
|
29-11-2005 09:37Записи также бывают с многоуровневым вложением, при этом, поля записи должны определяться перед описанием Case:
TRecord = Record
Field1: Integer;
Field2: Integer;
Case Field3: Integer of
0: (
Field4: Integer;
Field5: Integer;
Case Field8: Intger of
0: (
Field9: Integer;
Field10: Integer;
);
1: (
)
);
1: (
Field6: Integer;
Field7: Integer;
);
end; |
|
29-11-2005 05:40сообщение от автора материала Спасибо, хороший вопрос, постараемся включить его в книгу. |
|
29-11-2005 05:09to icWasya
.....
Rewrite(F, 1 );
S:='Hello, World!';
BlockWrite(F,S,Length(S));
Сообщение не подписано |
|
24-11-2005 02:49Очень мало информации про бестиповые файлы.
И хорошо бы явно прописать ответ на часто встречающийся вопрос - Я пишу так
...
var
S:String;
F:File;
...
S:='Hello, World!';
BlockWrite(F,S,Length(S));
и что я делаю не правильно?? |
|
|
|