Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.03.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
14-5729
SPeller
2003-02-14 13:47
2003.03.03
Включить Overlay ?


1-5618
Альф
2003-02-20 09:38
2003.03.03
Почему не удается послать сообщение LB_SETTABSTOPS ???


1-5609
revise
2003-02-19 10:52
2003.03.03
Работа с TMemo (запрет копирования)


9-5364
Ibrik
2002-09-29 15:20
2003.03.03
DelphiX


14-5754
Pat
2003-02-15 20:08
2003.03.03
Скорость создания отчета в MSWord97





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский