![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические массивы - правильно ли я понял help?
Ega23 © (2005-06-01 14:41:00)Никогда не работал с дин.массивами. Хочется узнать - правильно ли я понял, как с ними работать?
Допустим:
var
a:array of Integer;
begin
SetLength(a, 5); // в массиве 5 элементов.
a[0]:=1; a[4]:5; // Индексация в массиве - с 0 до Length(a)-1
SetLength(a, 6); // Сохранились ли предыдущие значения a[0] и a[4]?
SetLength(a, 0) // Опреация по освобождению массива
end;
Так ли это?
evvcom (2005-06-02 10:49:00) [21]
> Достатоточно ли объявить packed array of TRecord, чтобы
> неупакованые записи стали упаковаными в массиве?
Допустим SizeOf(TRecord)=6. Принимая во внимание сказанное (написанное) Юрием, packed array[0..1] будет состоять из 12 байт, а не упакованный из 16. Сами же TRecord как были не упакованными, так и останутся.
Defunct (2005-06-02 10:44:00) [22]> Юрий Зотов
запостил [34] до того как появился Ваш ответ [33]. Но тем не менее если не трудно, можете ответить на [34]?
Defunct (2005-06-02 10:41:00) [23]packed = упакованый.
не обращаясь к справке, только по смыслу этого слова можно допустить, что независимо от компилятора каждое поле упакованой структуры будет размещено байт к байту с другими полями.
Вот собсно в этом вопрос, так ли это.
Достатоточно ли объявитьpacked array of TRecord, чтобы неупакованые записи стали упаковаными в массиве?
Юрий Зотов (2005-06-02 10:39:00) [24]> Defunct © (02.06.05 03:18) [18]
> скорее, не строго говоря, а в тех случаях когда
> тип_элемента - record и не объявлен с ключевым
> с ключевым словом packed либо не кратен 4.
Имеем динамический массив A с типом элемента byte. Есть поток MS класса TMemoryStream размером 12 байт, которые содержат:
$01 $02 $03 $04 $05 $06 $07 $08 $09 $0A $0B $0C
Программа содержит операторы:
SetLength(A, MS.Size);
MS.Position := 0;
MS.ReadBuffer(A[0], Length(A) * SizeOf(byte));
Теперь вопрос (напоминаю, что директива packed имеет значение, если говорить именно строго - то есть, когда отсутствие этой директивы компилятором НЕ игнорируется, как оно и должно быть). Итак:
Как будет заполнен массив A в каждом из двух случаев:
- когда он упакован;
- когда он НЕ упакован.
Ответы:
- упакованный массив будет содержать в себе точную копию тела потока (поэлементно - см. выше).
- говоря строго , неупакованный массив будет содержать в себе следующее (буква M означает элемент массива, содержащий "мусор"):
$01 $05 $09 М M M M M M M M M
(предполагается умалчиваемое выравнивание для 32-битных платформ - на границу двойного слова).
- говоря НЕ строго, неупакованный массив будет содержать в себе то же самое, что и упакованный.
Что же мы видим уже на этом элементарном примере?
1. Заполнение массива зависит от его упакованности именно говоря строго .
2. Никакие record'ы тут ни при чем - различие наблюдается даже на скалярных типах.
Ega23 (2005-06-02 10:34:00) [25]2 Defunct © (02.06.05 10:29) [31]
Насколько я понял, имеется ввиду совместимость структуры на C и рекорда в Delphi. Ну, грубо говоря, как соглашение о вызове у функции.
Я packed использовал только для чтения хитрых бинарников и формировании данных для передачи по сети.
Defunct (2005-06-02 10:29:00) [26]> Игорь Шевченко
> Во-первых, оно обеспечивает совместимость на уровне двоичного кода функций, написанных на разных языках
Напрашивается вопрос.
TRecord = record
F1..FN : Sometype
...
End;
TArray = packed array of TRecord
Будет ли TArray соответствовать вышесказанному?
Игорь Шевченко (2005-06-02 10:10:00) [27]jack128 © (02.06.05 09:57) [27]
> На самом деле если еще более абстрагироваться от конкретных
> платформ, то неупаковонный массив должен обеспечивать наиболее
> быстрый доступ к массиву
Безусловно.
Defunct © (02.06.05 10:03) [29]
> ну для чего-то же все-таки есть ключевое слово packed. не
> может быть чтобы оно было просто бессмысленным
Совершенно не бессмысленное. Во-первых, оно обеспечивает совместимость на уровне двоичного кода функций, написанных на разных языках, во-вторых, не все данные в жизни являются неупакованными, пример - заголовок исполняемого файла
Defunct (2005-06-02 10:03:00) [28]> jack128
> Хотя разговор довольно бессмысленный так как
ну для чего-то же все-таки есть ключевое слово packed. не может быть чтобы оно было просто бессмысленным.
Defunct (2005-06-02 10:01:00) [29]begin...end © (02.06.05 09:55) [25]
Возможены случаи когда не будут.
SizeOf(<Record>) = 31, будут или не будут?
jack128 (2005-06-02 09:57:00) [30]Defunct © (02.06.05 9:44) [21]
там же ж слово packed, остальные будут будут "притиснуты" друг к другу
не на всех платформах SizeOf(Integer) = Size(DWord). Хотя на это можно забить.
Defunct © (02.06.05 3:18) [18]
скорее, не строго говоря, а в тех случаях когда тип_элемента - record и не объявлен с ключевым словом packed либо не кратен 4
На самом деле если еще более абстрагироваться от конкретных платформ, то неупаковонный массив должен обеспечивать наиболее быстрый доступ к массиву. То что сейчас фактический это означает выравнивание на Dword не означает, что так будет в будущем...
Хотя разговор довольно бессмысленный так как
Суслик © (01.06.05 17:25) [17]
на слово packed кладут, как мне показалось все, в том числе и сами разработчики borland. Такое ощущение, что они не собираются реализовывать соответствующую семантику вообще.
evvcom (2005-06-02 09:56:00) [31]
> там же ж слово packed, остальные будут будут "притиснуты"
> друг к другу
Я это знаю. Я говорил о варианте без packed.
begin...end (2005-06-02 09:55:00) [32]> Defunct © (02.06.05 09:54) [24]
А разве без packed перед array записи не будут прижаты друг к другу?
Defunct (2005-06-02 09:54:00) [33]мне все-таки кажется, что хотя бы record к record'у прижмет вплотную.
begin...end (2005-06-02 09:46:00) [34]В смысле, ни на что не повлияет.
begin...end (2005-06-02 09:45:00) [35]> Defunct © (02.06.05 09:44) [21]
> А что вы об это думаете?
Я думаю, что никак.
Defunct (2005-06-02 09:44:00) [36]> begin...end
не знаю. А что вы об это думаете?
> evvcom
там же ж слово packed, остальные будут будут "притиснуты" друг к другу.
evvcom (2005-06-02 09:27:00) [37]
> А вдруг (что маловероятно) первый элемент при этом окажется
> невыровняным на границу Dword
Первый уж точно будет выровнен, вот остальные ...
begin...end (2005-06-02 09:12:00) [38]> Defunct © (02.06.05 03:18) [18]
> скорее, не строго говоря, а в тех случаях когда тип_элемента
> - record и не объявлен с ключевым словом packed либо не
> кратен 4.
И на что в этом случае повлияет слово packed перед array?
Defunct (2005-06-02 03:18:00) [39]Юрий Зотов © (01.06.05 16:54) [15]
> строго говоря, должен быть объявлен так:
> a: packed array of тип_элемента
скорее, не строго говоря, а в тех случаях когдатип_элемента- record и не объявлен с ключевым словом packed либо не кратен 4.
a: packed array of integer
не красиво ;>
А вдруг (что маловероятно) первый элемент при этом окажется невыровняным на границу Dword? тогда работа с таким массивом на некоторых процессорах будет неоправдано медленной.
Суслик (2005-06-01 17:25:00) [40]
> [15] Юрий Зотов © (01.06.05 16:54)
Знаешь, Юрий, на слово packed кладут, как мне показалось все, в том числе и сами разработчики borland. Такое ощущение, что они не собираются реализовывать соответствующую семантику вообще.
Я, кстати, всегда пишу, когда это нужно. Но есть ощущение, что это лишнее.