Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.025 c
7-5882
Safonov
2002-12-30 11:50
2003.03.03
проблема с таймером


14-5789
Manulo
2003-02-12 19:26
2003.03.03
Эххх...


3-5410
Толян
2003-02-12 16:41
2003.03.03
Как в AppendRecord в поля типа TDateTime, записать пустое значени


1-5646
Silver_
2003-02-19 10:35
2003.03.03
TFrame и не только


14-5732
Думкин
2003-02-14 13:36
2003.03.03
уровень жизни