Текущий архив: 2003.03.03;
Скачать: CL | DM;
ВнизTMemoryStream. Адресное пространство TMemoryStream.Memory Найти похожие ветки
← →
ych_boriss (2003-02-20 15:25) [0]Как узнать адрес указателя, на участок памяти TMemoryStream.Memory с любым смещением
спабибо
← →
Anatoly Podgoretsky (2003-02-20 15:29) [1]Что значит узнать?
← →
ych_boriss (2003-02-20 15:50) [2]Надо получить такой адрес:
var
P : Pointer;
...
begin
...
P := MemStream.Memory;
// P := смещение на X байт от P;
// в этом случае мне нужен адрес P
...
end;
← →
Владислав (2003-02-20 15:55) [3]После этого:
P := MemStream.Memory;
P есть адрес указателя на участок памяти TMemoryStream.Memory
Объясни, что ты хочешь?
← →
ych_boriss (2003-02-20 16:05) [4]нарисую:
[MemoryMap]:
P := TMemoryStream.Memory; // всегда указывает на начало (см рис)
P1 := TMemoryStream.Seek(X, soFromBeginning); //
// мне нужен адрес P1 относительно P
=======================================================
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ... XX ...
^ . . . . . . . . . . . . . . . ... ^ ...
P P1
← →
Anatoly Podgoretsky (2003-02-20 16:07) [5]ych_boriss (20.02.03 15:50)
Еще раз и поподробнее.
← →
ych_boriss (2003-02-20 16:16) [6]В TMemoryStream.Memory, начиная с первого байта, последовательно, один за другим, расположены записи (record"ы):
type
TRec = record
ID : Word;
DataSize : Word;
Data : array of Byte;
end;
---
RECORD_01 : TRec;
RECORD_02 : TRec;
RECORD_03 : TRec;
...
RECORD_XX : TRec;
...
RECORD_N : TRec;
---
записи могут иметь разный размер.
адрес первой записи мне всегда известен, он совпадает с TMemoryStream.Memory, поскольку оно - Pointer.
Как мне найти адреса записей, начиная со 2-го?
← →
Anatoly Podgoretsky (2003-02-20 16:28) [7]ych_boriss (20.02.03 16:05)
Тебе нужен адрес + 12, ну так и сложи их
ych_boriss (20.02.03 16:16)
То же самое, проход по структуре. Насколько я понимаю DataSize : Word это размер чего то, но у тебя все записи фиксированной длины 8 байт, тут на выручку еще можно призвать кроме сложения и умножение.
ЗЫ: счет записей ведется с 0, не спутай с единицей!
← →
Digitman (2003-02-20 16:31) [8]type
TRecArray = array[0..0] of TRec;
PRecArray = ^TRecArray;
...
i := 5; // 6-я запись
PRecArray(MemStream.Memory)[i] := ...
← →
ych_boriss (2003-02-20 16:45) [9]Спасибо ОГРОМНОЕ за помощь, но я это реализовал вот-так (ессно, с Вашей помощью):
...
P := TMemoryStream.Memory;
repeat
PRec := P; // PRec : ^TRecType
RecSize := SizeOf(TRecType); // предопределенный тип
AList.Add(PRec); // AList : TList;
P := Pointer(Longint(P) + RecSize);
until Condition;
← →
Владислав (2003-02-20 16:50) [10]Вот это ни к чему:
RecSize := SizeOf(TRecType); // предопределенный тип
Страницы: 1 вся ветка
Текущий архив: 2003.03.03;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.007 c