![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение из середины [D6, Win95/98, WinXP]
Dib@zol © (2007-06-21 15:07:00)Привет всем. Подскажите, как реализовать алгоритм, всё утро бился :((
Есть пойнтер, указывающий на блок данных, размер которого известен. Дано смещение, в байтах, относительно начала блока. Дана структура, в которую нужно прочитать [размер_структуры] байт, начиная с байта смещения. Как это сделать?
Однокамушкин (2007-06-26 10:45:00) [1]
> KSergey © (22.06.07 13:26) [7]
> Нет, вы пытаетесь обмануть.
Нет, там другая ошибка... нигде не сказано, что смещение от p должно быть равно или кратно размеру структуры... если p указывает не на массив TMyRec, а менее регулярную структуру, то смещение может оказаться любым...
SpellCaster (2007-06-26 10:36:00) [2]> [7] KSergey © (22.06.07 13:26)
Да, пардон.
Конечно же, просто Inc(p1);
KSergey (2007-06-22 13:26:00) [3]> 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-22 11:02:00) [4]> [5] Dimaxx © (21.06.07 16:58)
А вот так еще лучше:
var
p,p1: PMyRec;
...
p1:=P;
Inc(p1,sizeof(TmyRec));
...
p1^.somefield:=...
Dimaxx (2007-06-21 16:58:00) [5]Можно эффективнее. Допустим, есть переменная-запись MyRec, содержимое которой и нужно получить. Адрес буфера в переменной P типа pointer. Смещение равно к примеру $AC.
var
A: PByte;
MyRec: TMyRec;
P: pointer;
...
A:=P;
Inc(A,$AC);
...
и все. Теперь даже не копируя никуда структуру из буфера можем обращаться к ее полям через TMyRec(A^).
Однокамушкин (2007-06-21 15:23:00) [6]
> Dib@zol (21.06.07 15:20) [3]
> Вопрос закрыт :)
Не, ещё не закрыт! :))) Вот когда придёт модератор, тогда вопрос действительно будет закрыт как не относящийся к тематике WinAPI :))))
Dib@zol (2007-06-21 15:20:00) [7]ПАСИБА!!!!! Вопрос закрыт :)
Однокамушкин (2007-06-21 15:13:00) [8]Если P - указатель, D - смещение, а S - переменная нужной структуры, то так:
Move((PChar(P) + D)^, S, SizeOf(S));
tesseract (2007-06-21 15:12:00) [9]
> начиная с байта смещения. Как это сделать?
mypointer:=Pointer(cardinal(oldpointer)+смещение) мож получиться.