![]() |
| ||
|
|
Новости |
Поиск |
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-й байт массива! Такое условие мне надо сохранить!
TUser (2004-12-09 11:14:00) [1]А не все ли равно. @ и Pointer вернут одно и то же.
Gek1 (2004-12-09 10:40:00) [2]
> TUser
Dll которую я использую написана на Си! Мне, вызывая функции из нее надо передать начальный адресс блока данных и его длинну!
Поэтому я поднял этот вопрос. Мастера, так как всетаки лучше в этой ситуации?
TUser (2004-12-09 10:27:00) [3]
> я так честно говоря и не понял как лучше мне записать?
Лучше обращаться по индексу, а работу с адресами оставить компилитору. ИМХО, здесь это не нужно.
Gek1 (2004-12-09 09:37:00) [4]Мастера, я так честно говоря и не понял как лучше мне записать?
@Buf[Low(Buf)] или Pointer(Buf)?
Anatoly Podgoretsky (2004-12-08 21:23:00) [5]Для динамических массивов не проверял, а для строк разное, зависит от того пустая строка или нет. Правда там надо учитывать следующую форму PChar(S).
Возможно, что обращение к элементу 0 чревато AV, но подробности надо смотреть в исходниках.
Pointer(Buf) честно вернет содержимое переменной, а вот обращение к Buf[0] будет делаться через функцию.
begin...end (2004-12-08 21:13:00) [6]> [24] Anatoly Podgoretsky © (08.12.04 20:11)
> а передается указатель на первый байт непрерывной байтовой
> последовательности
Успокойте меня: @Buf[0] и Pointer(Buf) - это одно и то же (если Buf - динамический массив)? Я сейчас их сравнил в Delphi 7 - равны, но, может быть, это не всегда (было) так?
Anatoly Podgoretsky (2004-12-08 20:11:00) [7]Amoeba © (08.12.04 16:47) [22]
А никакой динамический массив и не передается, а передается указатель на первый байт непрерывной байтовой последовательности.
SergP (2004-12-08 20:01:00) [8]
> Gek1 (08.12.04 11:48)
> Как лучше обьявить такой тип?
А не удобнее было бы вместо array of byte использовать string ?
Amoeba (2004-12-08 16:47:00) [9]
> procedure Compress(p : pointer; Len : integer); cdecl; external 'mydll.dll';
Интересно, а можно ли при таком объявлении (cdecl) передавать динамические массивы?
begin...end (2004-12-08 16:40:00) [10]> [20] Gek1 (08.12.04 15:54)
> Compress( @Buf[Low(Buf)], Length(Buf);
Не уверен, но если Buf - динамический массив, вроде можно просто написать Pointer(Buf).
Gek1 (2004-12-08 15:54:00) [11]
> 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);
Anatoly Podgoretsky (2004-12-08 13:49:00) [12]TUser © (08.12.04 13:47) [18]
Частный случай
TUser (2004-12-08 13:47:00) [13]Переменная ведь используется сразу, SetLength между взятием адреса и использованием не указан. Вроде бы адрес поменяться не должен, или я не прав?
А что касается ar[i] - ну, конечно. Но вопрос был про указатели - ответ тоже, это просто демонстрационный пример.
Anatoly Podgoretsky (2004-12-08 13:44:00) [14]Gek1 (08.12.04 13:20) [16]
А то что это динамический массив, и его адрес меняется, а в PB будет неактуальный адрес, ну это первое, а второе нет ни какой необходисмости иметь еще одну переменную, к тому му же вероятно не актуальную, динамический массив это и есть адрес, а не сами данные.
TUser © (08.12.04 13:19) [15]
Правильно, но только в правой части, взятие адреса, но не в левой - использования переменной с этим адресом для дальнейших операций. Вместо этого b:=pb^;есть нормальная рабочая конструкция b := ar[i];
Gek1 (2004-12-08 13:20:00) [15]
> Anatoly Podgoretsky
а почему глупо? мне просто как раз и нужен способ типа [5].
TUser (2004-12-08 13:19:00) [16]
> Переместится, но тебя это не должно волновать если не будешь
> делать глупых шагов типа pb:=@ar[i];
Анатолий, он попросил пример - как получить указатель на элемент массива. Он его получил. Зачем оно ему надо - я не знаю. Почему этот шаг глупый?
DiamondShark (2004-12-08 13:17:00) [17]Если всё самому читать, то вообще ничего спрашивать не останется.
Так не интересно.
MBo (2004-12-08 13:13:00) [18]а если прочитать справку SetLength procedure, то не нужно будет все спрашивать
Anatoly Podgoretsky (2004-12-08 13:12:00) [19]Переместится, но тебя это не должно волновать если не будешь делать глупых шагов типа pb:=@ar[i];
Digitman (2004-12-08 13:09:00) [20]да.
будет распределен новый (больший по размеру) блок памяти, в него скопировано содержимое старого блока. после чего старый блок будет освобожден