![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Array of byte, Подскажите. Как лучше сделать?
Gek1 © (2004-12-08 11:48:00)Мастера, ситуация такова! я работаю с "цепочкой byte" Вопрос как лучше обьявить ету переменную? Дело в том что длинна array of byte может колебаться от 10 байт и до 10к байт! В процессе программы переменные такого типа создаються, обрабатываються и уничтожаються! Я могу пойти в лоб и обьявить MyVar : array[0..10000] of byte! Но в процессе работы программы - такие переменные могут накапливать для дальнейшей работы, и получиться, что мой метод в лоб приведет к раздуванию программы в памяти. Как лучше обьявить такой тип?
P.S. я работаю с указателем на етот тип, где по указателю я попадаю на 1-й байт массива! Такое условие мне надо сохранить!
Gek1 (2004-12-08 13:01:00) [21]а если я увеличиваю длинну массива? а например за ним уже лежит чтото? что произодет с массивом? он целиком с новой длинной переместиться в новое свободное место?
Digitman (2004-12-08 12:36:00) [22]
> он будет всегда находиться в памяти с адресса PByte(@ba[0])
> и до PByte(@ba[0])+длинна?
если дин.массив имеет длину > 0, то диапазон адресов памяти, занимаемой эл-тами этого массива, равен
@ba[0] .. @ba[0] + длина_массива*размер_элемента - 1
> Фрагментироваться или еще чего-то с ним в памяти может происходить?
не может.
все элементы массива лежат в непрерывном блоке памяти в вышеупомянутом диапазоне адресов
Amoeba (2004-12-08 12:32:00) [23]
> Gek1 (08.12.04 12:28) [7]
Да, он будет располагаться в памяти непрерывно.
Gek1 (2004-12-08 12:28:00) [24]А еще такой вопрос:
Независимо от длинны масива - он будет всегда находиться в памяти с адресса PByte(@ba[0]) и до PByte(@ba[0])+длинна? Фрагментироваться или еще чего-то с ним в памяти может происходить?
Gek1 (2004-12-08 12:22:00) [25]Большое спасибо.
TUser (2004-12-08 12:14:00) [26]
procedure TForm1.Button1Click(Sender: TObject);
var ar:array of byte;
i:integer;
b:byte;
pb:^byte;
begin
SetLength(ar,100);
for i:=0 to 99 do
ar[i]:=i;
for i:=0 to 99 do begin
pb:=@ar[i];
b:=pb^;
memo1.Lines.Add(inttostr(b));
end;
end;
Digitman (2004-12-08 12:09:00) [27]
> Честно говоря я не совсем понял как, в случае динамического
> массива получиться указатель на его первый байт данных!
var
ba: array of Byte;
..
указатель_на_первый_байт := PByte(@ba[0]);
TUser (2004-12-08 12:08:00) [28]
> Честно говоря я не совсем понял как, в случае динамического
> массива получиться указатель на его первый байт данных!
операцией @, но лучше пусть об этом заботится delphi
Gek1 (2004-12-08 11:57:00) [29]
> TUser
Честно говоря я не совсем понял как, в случае динамического массива получиться указатель на его первый байт данных!
TUser (2004-12-08 11:53:00) [30]Сделать его динамическим массивом. Почитай справку про Dynamic arrays