PDA

Показать полную графическую версию : опять этот Делфи


JCooper
28-10-2003, 23:20
Надо написать на Делфи процедуру, которой передается указатель на какой то массив и она его каким то образом обрабатывает. Т.е. процедура в другом юните и ей пофиг какой массив.
На паскале все получилось просто:

какой то массив-

.................
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^);
:)

JCooper
29-10-2003, 17:30
Я как всегда не сказал самого главного
правильнее будет
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 к этому типу, плюс индекс и разыменовать.:)

JCooper
29-10-2003, 21:52
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];
:)

JCooper
30-10-2003, 20:04
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:

JCooper
31-10-2003, 21:38
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 откомпилил - оно пашет, зуб даю... :)

JCooper
05-11-2003, 19:35
shurikan
Огромное программерское спасибо! :up:




© OSzone.net 2001-2012