Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   опять этот Делфи (http://forum.oszone.net/showthread.php?t=30182)

JCooper 28-10-2003 23:20 207672

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

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

.................
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 207673

Kuper

Цитата:

Как такое закрутить на Делфи, привык блин к сегментно-оффсетной адресации под досом.
Нет такого под виндой. Модель памяти - плоская, т.е. про сегменты можно как бы и забыть (в том смысле, что селекторы не меняются в контексте процесса).

Насколько я понял один из формальных параметров процедуры - что-то типа ..., p: Pointer, .... Тогда он принимает адрес какого-то массива. Ну, а доступ:
value := Type(p^);
:)


JCooper 29-10-2003 17:30 207674

Я как всегда не сказал самого главного
правильнее будет
Код:

value[i]:=byte(ptr(Seg(arr),Ofs(arr)+[i])^);
т.е. я не могу организовать доступ к элементам.
В процедуре
Код:

value:=Byte(p^);
где p это @arr который передается в качестве параметра, тут все чисто, но как организовать доступ к любому элементу не догоню.



[s]Исправлено: Kuper, 22:50 29-10-2003[/s]

shurikan 29-10-2003 19:56 207675

Kuper
Описать тип указателя на байт, преобразовать p к этому типу, плюс индекс и разыменовать.:)

JCooper 29-10-2003 21:52 207676

shurikan плиз код :confused:

shurikan 30-10-2003 16:36 207677

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 207678

Цитата:

type    PByte: Pointer to Byte; {кажется так описывается тип}   ...  value:=(PByte(p)+12)^;
Впервые такое вижу :), shurikan, ты че-то напутал, когда свой тип объявляешь, ставится "=" и к тому-же такой конструкции как "Pointer to Тип" нет может ты имел в виду:
Код:

var
   Pbyte:^Byte;

В общем нифига у меня не выходит, руки кривые блин. Народ расчитываю на вашу помощь.

shurikan 31-10-2003 12:38 207679

Kuper
var * *Pbyte:^Byte;

Именно это я и имел ввиду!!! Извини, синтаксис подзабыл. :( В основном я пишу на C и на ассемблере. *:)


Добавлено:

О, госсподи! Не var. Надо ввести новый тип!!!
Можно написать так: (???)
Код:

type
 *PByte = ^Byte;

По моему это получится. Тогда этим типом можно воспользоваться для приведения любого указателя к указателю на байт. Например, если p есть указатель на слово, то PByte(b) - уже указатель на байт. Если указатель сложить с константой (PByte(p) + 12), то это тоже указатель. Только он указывает на 12 байт дальше. Следовательно, если его разыменовать, то получишь значение байта, лежащего на 12-м месте, считая от p.

Alekssej 31-10-2003 14:36 207680

Kuper

а ты то можешь мне растолковать все ПАСКАЛевские команды, а?
:confused:
:oszone:

JCooper 31-10-2003 21:38 207681

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 207682

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 207683

shurikan
Огромное программерское спасибо! :up:


Время: 11:29.

Время: 11:29.
© OSzone.net 2001-