Главная страница
    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.46 MB
Время: 0.007 c
3-5450
_BasiL_
2003-02-13 13:15
2003.03.03
DBGrid без BDE


8-5667
pasha676
2002-11-21 11:00
2003.03.03
DirectShow DSPack 2.0 вопросы.


14-5744
LazorenkoX
2003-02-12 13:49
2003.03.03
Программы для программы


3-5424
V_Pavel
2003-02-12 11:08
2003.03.03
Миграция данных с Interbase в MsSQL


7-5882
Safonov
2002-12-30 11:50
2003.03.03
проблема с таймером





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский