Вниз
Скачать: CL | DM;

Чтение из середины   Найти похожие ветки 

← →
Dib@zol   (2007-06-21 15:07) [0]

Привет всем. Подскажите, как реализовать алгоритм, всё утро бился :((

Есть пойнтер, указывающий на блок данных, размер которого известен. Дано смещение, в байтах, относительно начала блока. Дана структура, в которую нужно прочитать [размер_структуры] байт, начиная с байта смещения. Как это сделать?


← →
tesseract ©   (2007-06-21 15:12) [1]


> начиная с байта смещения. Как это сделать?


mypointer:=Pointer(cardinal(oldpointer)+смещение) мож получиться.


← →
Однокамушкин   (2007-06-21 15:13) [2]

Если P - указатель, D - смещение, а S - переменная нужной структуры, то так:
Move((PChar(P) + D)^, S, SizeOf(S));


← →
Dib@zol   (2007-06-21 15:20) [3]

ПАСИБА!!!!! Вопрос закрыт :)


← →
Однокамушкин   (2007-06-21 15:23) [4]


> Dib@zol   (21.06.07 15:20) [3]
> Вопрос закрыт :)

Не, ещё не закрыт! :))) Вот когда придёт модератор, тогда вопрос действительно будет закрыт как не относящийся к тематике WinAPI :))))


← →
Dimaxx ©   (2007-06-21 16:58) [5]

Можно эффективнее. Допустим, есть переменная-запись MyRec, содержимое которой и нужно получить. Адрес буфера в переменной P типа pointer. Смещение равно к примеру $AC.

var
 A: PByte;
 MyRec: TMyRec;
 P: pointer;
...
 A:=P;
 Inc(A,$AC);
...


и все. Теперь даже не копируя никуда структуру из буфера можем обращаться к ее полям через TMyRec(A^).


← →
SpellCaster   (2007-06-22 11:02) [6]

> [5] Dimaxx ©   (21.06.07 16:58)

А вот так еще лучше:

var
p,p1: PMyRec;
...
p1:=P;
Inc(p1,sizeof(TmyRec));
...
p1^.somefield:=...


← →
KSergey ©   (2007-06-22 13:26) [7]

> SpellCaster   (22.06.07 11:02) [6]
> var
> p,p1: PMyRec;
> ...
> p1:=P;
> Inc(p1,sizeof(TmyRec));
> ...
> p1^.somefield:=...

Нет, вы пытаетесь обмануть.
Если сделать Inc(p1,sizeof(TmyRec)) - то сместимся на sizeof(TmyRec)*sizeof(TmyRec) байт. Что явно не то, что мы хотели.
Да и "крышечка" в p1^.somefield для дельфей - не обязательна.


← →
SpellCaster   (2007-06-26 10:36) [8]

> [7] KSergey ©   (22.06.07 13:26)

Да, пардон.
Конечно же, просто Inc(p1);


← →
Однокамушкин   (2007-06-26 10:45) [9]


> KSergey ©   (22.06.07 13:26) [7]
> Нет, вы пытаетесь обмануть.

Нет, там другая ошибка... нигде не сказано, что смещение от p должно быть равно или кратно размеру структуры... если p указывает не на массив TMyRec, а менее регулярную структуру, то смещение может оказаться любым...



Страницы: 1 вся ветка

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



Память: 0.47 MB
Время: 0.02 c
15-1182833764
pavel_guzhanov
2007-06-26 08:56
2007.07.22
Есть тут спецы по php и iis?


9-1142786016
Mortem
2006-03-19 19:33
2007.07.22
Конкурсы по программированию игр на Delphi продолжаются


2-1183202167
ssss
2007-06-30 15:16
2007.07.22
Как поместить картинку в ListBox?


2-1182965649
mc0808
2007-06-27 21:34
2007.07.22
Программа не запускается на машине без Дельфи


15-1182332219
GeLLeR
2007-06-20 13:36
2007.07.22
Голосовое общение по сети




   Наверх