Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Array of byte, Подскажите. Как лучше сделать?


Страницы:   1 2

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]

да.
будет распределен новый (больший по размеру) блок памяти, в него скопировано содержимое старого блока. после чего старый блок будет освобожден


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо