Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизArray of byte, Подскажите. Как лучше сделать? Найти похожие ветки
← →
Gek1 (2004-12-08 11:48) [0]Мастера, ситуация такова! я работаю с "цепочкой byte" Вопрос как лучше обьявить ету переменную? Дело в том что длинна array of byte может колебаться от 10 байт и до 10к байт! В процессе программы переменные такого типа создаються, обрабатываються и уничтожаються! Я могу пойти в лоб и обьявить MyVar : array[0..10000] of byte! Но в процессе работы программы - такие переменные могут накапливать для дальнейшей работы, и получиться, что мой метод в лоб приведет к раздуванию программы в памяти. Как лучше обьявить такой тип?
P.S. я работаю с указателем на етот тип, где по указателю я попадаю на 1-й байт массива! Такое условие мне надо сохранить!
← →
TUser © (2004-12-08 11:53) [1]Сделать его динамическим массивом. Почитай справку про Dynamic arrays
← →
Gek1 (2004-12-08 11:57) [2]
> TUser
Честно говоря я не совсем понял как, в случае динамического массива получиться указатель на его первый байт данных!
← →
TUser © (2004-12-08 12:08) [3]
> Честно говоря я не совсем понял как, в случае динамического
> массива получиться указатель на его первый байт данных!
операцией @, но лучше пусть об этом заботится delphi
← →
Digitman © (2004-12-08 12:09) [4]
> Честно говоря я не совсем понял как, в случае динамического
> массива получиться указатель на его первый байт данных!
var
ba: array of Byte;
..
указатель_на_первый_байт := PByte(@ba[0]);
← →
TUser © (2004-12-08 12:14) [5]
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;
← →
Gek1 (2004-12-08 12:22) [6]Большое спасибо.
← →
Gek1 (2004-12-08 12:28) [7]А еще такой вопрос:
Независимо от длинны масива - он будет всегда находиться в памяти с адресса PByte(@ba[0]) и до PByte(@ba[0])+длинна? Фрагментироваться или еще чего-то с ним в памяти может происходить?
← →
Amoeba © (2004-12-08 12:32) [8]
> Gek1 (08.12.04 12:28) [7]
Да, он будет располагаться в памяти непрерывно.
← →
Digitman © (2004-12-08 12:36) [9]
> он будет всегда находиться в памяти с адресса PByte(@ba[0])
> и до PByte(@ba[0])+длинна?
если дин.массив имеет длину > 0, то диапазон адресов памяти, занимаемой эл-тами этого массива, равен
@ba[0] .. @ba[0] + длина_массива*размер_элемента - 1
> Фрагментироваться или еще чего-то с ним в памяти может происходить?
не может.
все элементы массива лежат в непрерывном блоке памяти в вышеупомянутом диапазоне адресов
← →
Gek1 (2004-12-08 13:01) [10]а если я увеличиваю длинну массива? а например за ним уже лежит чтото? что произодет с массивом? он целиком с новой длинной переместиться в новое свободное место?
← →
Digitman © (2004-12-08 13:09) [11]да.
будет распределен новый (больший по размеру) блок памяти, в него скопировано содержимое старого блока. после чего старый блок будет освобожден
← →
Anatoly Podgoretsky © (2004-12-08 13:12) [12]Переместится, но тебя это не должно волновать если не будешь делать глупых шагов типа pb:=@ar[i];
← →
MBo © (2004-12-08 13:13) [13]а если прочитать справку SetLength procedure, то не нужно будет все спрашивать
← →
DiamondShark © (2004-12-08 13:17) [14]Если всё самому читать, то вообще ничего спрашивать не останется.
Так не интересно.
← →
TUser © (2004-12-08 13:19) [15]
> Переместится, но тебя это не должно волновать если не будешь
> делать глупых шагов типа pb:=@ar[i];
Анатолий, он попросил пример - как получить указатель на элемент массива. Он его получил. Зачем оно ему надо - я не знаю. Почему этот шаг глупый?
← →
Gek1 (2004-12-08 13:20) [16]
> Anatoly Podgoretsky
а почему глупо? мне просто как раз и нужен способ типа [5].
← →
Anatoly Podgoretsky © (2004-12-08 13:44) [17]Gek1 (08.12.04 13:20) [16]
А то что это динамический массив, и его адрес меняется, а в PB будет неактуальный адрес, ну это первое, а второе нет ни какой необходисмости иметь еще одну переменную, к тому му же вероятно не актуальную, динамический массив это и есть адрес, а не сами данные.
TUser © (08.12.04 13:19) [15]
Правильно, но только в правой части, взятие адреса, но не в левой - использования переменной с этим адресом для дальнейших операций. Вместо этого b:=pb^; есть нормальная рабочая конструкция b := ar[i];
← →
TUser © (2004-12-08 13:47) [18]Переменная ведь используется сразу, SetLength между взятием адреса и использованием не указан. Вроде бы адрес поменяться не должен, или я не прав?
А что касается ar[i] - ну, конечно. Но вопрос был про указатели - ответ тоже, это просто демонстрационный пример.
← →
Anatoly Podgoretsky © (2004-12-08 13:49) [19]TUser © (08.12.04 13:47) [18]
Частный случай
← →
Gek1 (2004-12-08 15:54) [20]
> Anatoly Podgoretsky
мне просто потом в ф-цию из dll надо будет передать указатель на первый байт данных и длину:
procedure Compress(p : pointer; Len : integer);cdecl; external "mydll.dll";
Т.е я смогу вызвать функцию из Dll например так:
Buf : array of byte;
.............
SetLength(Buf,Len);
........................
Compress(@Buf[Low(Buf)], Length(Buf);
← →
begin...end © (2004-12-08 16:40) [21]> [20] Gek1 (08.12.04 15:54)
> Compress(@Buf[Low(Buf)], Length(Buf);
Не уверен, но если Buf - динамический массив, вроде можно просто написать Pointer(Buf).
← →
Amoeba © (2004-12-08 16:47) [22]
> procedure Compress(p : pointer; Len : integer);cdecl; external "mydll.dll";
Интересно, а можно ли при таком объявлении (cdecl) передавать динамические массивы?
← →
SergP © (2004-12-08 20:01) [23]
> Gek1 (08.12.04 11:48)
> Как лучше обьявить такой тип?
А не удобнее было бы вместо array of byte использовать string ?
← →
Anatoly Podgoretsky © (2004-12-08 20:11) [24]Amoeba © (08.12.04 16:47) [22]
А никакой динамический массив и не передается, а передается указатель на первый байт непрерывной байтовой последовательности.
← →
begin...end © (2004-12-08 21:13) [25]> [24] Anatoly Podgoretsky © (08.12.04 20:11)
> а передается указатель на первый байт непрерывной байтовой
> последовательности
Успокойте меня: @Buf[0] и Pointer(Buf) - это одно и то же (если Buf - динамический массив)? Я сейчас их сравнил в Delphi 7 - равны, но, может быть, это не всегда (было) так?
← →
Anatoly Podgoretsky © (2004-12-08 21:23) [26]Для динамических массивов не проверял, а для строк разное, зависит от того пустая строка или нет. Правда там надо учитывать следующую форму PChar(S).
Возможно, что обращение к элементу 0 чревато AV, но подробности надо смотреть в исходниках.
Pointer(Buf) честно вернет содержимое переменной, а вот обращение к Buf[0] будет делаться через функцию.
← →
Gek1 (2004-12-09 09:37) [27]Мастера, я так честно говоря и не понял как лучше мне записать?
@Buf[Low(Buf)] или Pointer(Buf)?
← →
TUser © (2004-12-09 10:27) [28]
> я так честно говоря и не понял как лучше мне записать?
Лучше обращаться по индексу, а работу с адресами оставить компилитору. ИМХО, здесь это не нужно.
← →
Gek1 (2004-12-09 10:40) [29]
> TUser
Dll которую я использую написана на Си! Мне, вызывая функции из нее надо передать начальный адресс блока данных и его длинну!
Поэтому я поднял этот вопрос. Мастера, так как всетаки лучше в этой ситуации?
← →
TUser © (2004-12-09 11:14) [30]А не все ли равно. @ и Pointer вернут одно и то же.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c