Показать полную графическую версию : опять этот Делфи
Надо написать на Делфи процедуру, которой передается указатель на какой то массив и она его каким то образом обрабатывает. Т.е. процедура в другом юните и ей пофиг какой массив.
На паскале все получилось просто:
какой то массив-
.................
arr:Array[0..n] of Byte = (1,2,3,4,5...n);
.................
в теле процедуры-
.................
value[i]:=byte(ptr(Seg(arr),Ofs(arr))^);
.................
Как такое закрутить на Делфи, привык блин к сегментно-оффсетной адресации под досом.
Заранее всем спасибо.
shurikan
29-10-2003, 05:00
Kuper
Как такое закрутить на Делфи, привык блин к сегментно-оффсетной адресации под досом.
Нет такого под виндой. Модель памяти - плоская, т.е. про сегменты можно как бы и забыть (в том смысле, что селекторы не меняются в контексте процесса).
Насколько я понял один из формальных параметров процедуры - что-то типа ..., p: Pointer, .... Тогда он принимает адрес какого-то массива. Ну, а доступ:
value := Type(p^);
:)
Я как всегда не сказал самого главного
правильнее будет
value[i]:=byte(ptr(Seg(arr),Ofs(arr)+[i])^);
т.е. я не могу организовать доступ к элементам.
В процедуре
value:=Byte(p^);
где p это @arr который передается в качестве параметра, тут все чисто, но как организовать доступ к любому элементу не догоню.
Исправлено: Kuper, 22:50 29-10-2003
shurikan
29-10-2003, 19:56
Kuper
Описать тип указателя на байт, преобразовать p к этому типу, плюс индекс и разыменовать.:)
shurikan плиз код :confused:
shurikan
30-10-2003, 16:36
Kuper
type
* PByte: Pointer to Byte; {кажется так описывается тип}
...
value:=(PByte(p)+12)^;
PByte - указатель на Byte. Извлекается 13-й элемент байтового массива. Что (как бы) эквивалентно этому:
var
*p: Array [0..20] of Byte;
*...
value := p[12];
:)
type PByte: Pointer to Byte; {кажется так описывается тип} ... value:=(PByte(p)+12)^;
Впервые такое вижу :), shurikan, ты че-то напутал, когда свой тип объявляешь, ставится "=" и к тому-же такой конструкции как "Pointer to Тип" нет может ты имел в виду:
var
Pbyte:^Byte;
В общем нифига у меня не выходит, руки кривые блин. Народ расчитываю на вашу помощь.
shurikan
31-10-2003, 12:38
Kuper
var * *Pbyte:^Byte;
Именно это я и имел ввиду!!! Извини, синтаксис подзабыл. :( В основном я пишу на C и на ассемблере. *:)
Добавлено:
О, госсподи! Не var. Надо ввести новый тип!!!
Можно написать так: (???)
type
*PByte = ^Byte;
По моему это получится. Тогда этим типом можно воспользоваться для приведения любого указателя к указателю на байт. Например, если p есть указатель на слово, то PByte(b) - уже указатель на байт. Если указатель сложить с константой (PByte(p) + 12), то это тоже указатель. Только он указывает на 12 байт дальше. Следовательно, если его разыменовать, то получишь значение байта, лежащего на 12-м месте, считая от p.
Alekssej
31-10-2003, 14:36
Kuper
а ты то можешь мне растолковать все ПАСКАЛевские команды, а?
:confused:
:oszone:
Alekssej
Мне надо написать процедуру, которой бы в качестве параметра передавался
указатель на массив, для его дальнейшей обработки. Эта процедура должна содержаться
в отдельном модуле.
Вот код для TP
.....
type
PByte = Pointer;
const
n=5;
var
arr:Array[1..n] of Byte;
.....
//вызов процедуры
имя_процедуры(@arr,n);
.....
//сама процедура
procedure имя_процедуры(p:PByte;n:Byte);
begin
.....
value:=byte(ptr(Seg(p^),Ofs(p^) + i)^);
.....
end;
.....
ptr преобразует адрес в виде сегмент плюс смещение в указатель;
Seg, Ofs - возвращают соответственно сегмент и смещение чего-нибудь;
Byte - переопределяет тип той величины которую хотим считать, может быть от
Byte до Extended (1-10 байт).
Мне важно как раз смещение, т.к. я могу получить доступ к любому элементу массива.
Как это сделать на Делфи ума не приложу. В модуле System среди "pointer and address routines"
есть только Addr и Ptr. Неужели никто не знает как такое забадяжить?
shurikan
02-11-2003, 02:17
Kuper
См. выше.
Не
type
*PByte = Pointer;
.....
type
* *PByte = ^Byte;
const
* *n=5;
var
* *arr:Array[1..n] of Byte;
.....
//вызов процедуры
*имя_процедуры(@arr,n);
.....
//сама процедура
procedure имя_процедуры(p:PByte;n:Byte);
begin
.....
* *value:=(PByte(Integer(p) + i))^;
.....
end;
.....
Только что в Delphi откомпилил - оно пашет, зуб даю... :)
shurikan
Огромное программерское спасибо! :up:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC