Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Вниз
Указатель типа 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c