Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.125 c
3-1101284913
Sens
2004-11-24 11:28
2004.12.26
Помогите создать запрос


1-1102974763
Kolan
2004-12-14 00:52
2004.12.26
Как измерить скорость алгоритма.Знаю что было но не нашел.


3-1101880008
_sulent
2004-12-01 08:46
2004.12.26
Про связи БД


1-1102685183
liver
2004-12-10 16:26
2004.12.26
MDI


1-1102503043
mefisto
2004-12-08 13:50
2004.12.26
Как передать сообщение своей программе с коммандной строки?