Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1102924866
Ольга
2004-12-13 11:01
2004.12.26
Странные символы & в PopupMenu


8-1096200616
maguk
2004-09-26 16:10
2004.12.26
Как воспроизвести аудио-поток?


3-1101884597
ocean
2004-12-01 10:03
2004.12.26
Репликация MS SQL


4-1099941230
FLEA_ZNTU
2004-11-08 22:13
2004.12.26
История запусков приложения


4-1099737740
acsoft
2004-11-06 13:42
2004.12.26
Открывать txt моей программой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский