Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.012 c
14-5779
Sergey Masloff
2003-02-13 16:16
2003.03.03
Осторожно - грипп!


14-5821
anbezr
2003-02-13 12:14
2003.03.03
Как просмотреть только мои вопросы


14-5785
OxOTHuK
2003-02-12 07:20
2003.03.03
Мысли вслух


6-5682
2Ksion
2003-01-11 19:06
2003.03.03
TWebBrowser


3-5442
AM
2003-02-12 16:20
2003.03.03
Ошибка при Preview, как избавиться от нее




   Наверх