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

Вниз

Указатель типа Pointer - читаем и записываем байты…   Найти похожие ветки 

 
Drex   (2005-10-24 19:50) [0]

Коллеги! Есть указатель типа Pointer на некоторую область в памяти. Как прочитать/записать байт по определенному адресу в этой памяти? Т.е. необходимо реализовать две функции типа ReadByte и WriteByte.


 
begin...end ©   (2005-10-24 19:54) [1]

var
 P: Pointer;
 B: Byte;
begin
 // Чтение
 B := PByteArray(P)[смещение_байта];
 // Запись
 PByteArray(P)[смещение_байта] := B
end.

Если значение смещение_байта может выходить из диапазона 0..32767, опишите свой тип наподобие PByteArray или просто используйте адресную арифметику.


 
umbra ©   (2005-10-24 19:57) [2]

В модуле Classes есть класс TMemoryStream, предназначенный для чего-то подобного


 
Drex   (2005-10-24 22:02) [3]

Нет господа, что-то не то. Возможно я не так объяснил…  Попробую подробнее: использую файл, отображенный в память (до 10 Мб). Получаю на него указатель Pointer и хочу работать с файлом как с одномерным массивом… Использовать что то типа result:=PByteArray(P)[adr]; на мой, сугубо субъективный взгляд – решение не очень… т.к. заранее неизвестно какого размера буду обрабатывать файл, а ограничивать себя – это не выход. Хочется какой ни будь универсальный подход… или другого выхода нет?


 
begin...end ©   (2005-10-24 22:12) [4]

> Drex   (24.10.05 22:02) [3]

Я же написал в [1] -- если не устраивает это ограничение, объявите свой тип. Ограничьте себя двумя гигабайтами, например. Разве этого недостаточно? Объявление типа ведь не занимает никакой памяти.

type
 PBArray = ^TBArray;
 TBArray = array [0..MaxInt - 1] of Byte;

и далее по тексту (см. пример в [1]).

Либо (и об этом тоже сказано в [1]) явно производите арифметические операции над указателями:

var
 P: Pointer;
 B: Byte;
begin
 // запись байта
 PByte(Cardinal(P) + смещение_байта)^ := B;
 // чтение байта
 B := PByte(Cardinal(P) + смещение_байта)^
end.


 
Игорь Шевченко ©   (2005-10-24 22:51) [5]

begin...end ©   (24.10.05 22:12) [4]


> Объявление типа ведь не занимает никакой памяти.


Давай объявим так:

THugeByteArray = array[0..$7FFFFFFF] of Byte;
PHugeByteArray = ^THugeByteArray;

и попробуем откомпилировать.

Удивимся.


 
Prohodil Mimo ©   (2005-10-24 23:28) [6]

begin...end ©   (24.10.05 22:12) [4]

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


 
palva ©   (2005-10-25 00:14) [7]

> то же самое, но размер чутка поменьше задать
Ну да, если процитировать код begin...end, то
TBArray = array [0..MaxInt - 1] of Byte;
и компиляция пройдет.


 
Alex Konshin ©   (2005-10-25 03:07) [8]

var
P: Pointer;
B: Byte;
begin
// запись байта
PByte(Cardinal(P) + смещение_байта)^ := B;
// чтение байта
B := PByte(Cardinal(P) + смещение_байта)^
end.


PByte(PChar(P)+смещение_байта) is better.


 
begin...end ©   (2005-10-25 08:19) [9]

> Игорь Шевченко ©   (24.10.05 22:51) [5]

Вы это к чему?
Ваш код не компилируется, мой код компилируется. Это связано с ограничением размера типа в 2 ГБ.

> Удивимся.

Честно говоря, не нашёл причин для удивления.


 
Игорь Шевченко ©   (2005-10-25 10:10) [10]

begin...end ©   (25.10.05 08:19) [9]


> Вы это к чему?
> Ваш код не компилируется, мой код компилируется. Это связано
> с ограничением размера типа в 2 ГБ.


Вот и я к этому. К тому, что объявление типа места не занимает :) Однако, ограничение на размер все-таки есть.



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
14-1129974768
pazitron_brain
2005-10-22 13:52
2005.11.13
Снова про окна.


1-1129705116
Skunk
2005-10-19 10:58
2005.11.13
Каким компонентом сделать бегущую строку?


3-1128394079
npr2
2005-10-04 06:47
2005.11.13
Запись картинки с Image в БД Access


14-1129621622
Ищущий
2005-10-18 11:47
2005.11.13
DJVU


2-1130078972
muzik@NT!
2005-10-23 18:49
2005.11.13
TCanvas глючит или я?