Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.02;
Скачать: CL | DM;

Вниз

Перевод C++ исходников на Delphi   Найти похожие ветки 

 
Pre_AlFa   (2003-09-19 09:09) [0]

Кто-нибудь из присутствующих занимался сим странным занятием? Интересует следующее: есть ли какой-либо стандартный грамотный метод перевода си-шной арифметики указателей на Дельфи? Задача: API-шная функция возвращает указатель на большой неоднородый массив данных в виде DWord*. Потом си-шный код этот указатель всячески умножает и прибавляет, попутно приводя к самым различным типам (что-то вроде (Byte*)ptr, (Word*)ptr и т.д.). Как это наиболее эффективно перевести на Дельфи?


 
Alex Konshin ©   (2003-09-19 09:14) [1]

Кто тебе мешает сделать то же самое на Delphi?


 
Pre_AlFa   (2003-09-19 09:18) [2]

> Кто тебе мешает сделать то же самое на Delphi?

Что сделать? Указатель сложить-вычесть? Вроде нет такой поддержки. Или я не в курсе?


 
Владислав ©   (2003-09-19 09:45) [3]

Приводи указатели к типу Cardinal (DWORD) и "делай" с ними арифметику.


 
KSergey ©   (2003-09-19 09:46) [4]

Такая поддержка есть
В принципе дельфи практически так же позволяет работать с указателями, разве что синтаксис в Си лично мне более понятный (а может привычный). Но по возможностям - полная эквивалентность.


 
Pre_AlFa   (2003-09-19 10:08) [5]

2Владислав ©:

Спасибо за совет. А можно на конкретном примере продемонстрировать? Он небольшой:


DWORD* GetObj( DWORD* pObjData, DWORD dwObj )
{
for( DWORD i=0; i<dwObj; i++ )
pObjData += (*pObjData) + 1;

return pObjData;
}


Суть: pObjData - указатель на массив массивов ( array of DWord), который лежит в памяти одним большим куском. Функция должна вернуть из него i-ый подмассив (тоже array of DWord, параметр dwObj - номер подмассива). Данный код просто смещает указатель от начального положения на требуемый подмассив и возвращает его, нагло используя тот факт, что в Си массивы и указатели - суть близнецы-братья. Мне же нужно, чтобы эта функция вернула массив в смысле Дельфи, т.е. чтобы потом с ним можно было работать как с обычным (пусть и динамическим) array"ем.

Вразумите...


 
Verg ©   (2003-09-19 10:09) [6]


> Но по возможностям - полная эквивалентность.


Ну уж!

struct {...} *p;

p+=1 или p++ - увеличит поинтер на размер структуры

а в Delphi

cardinal(p):=cardinal(p)+1 - на 1 байт, и плевать она хотела на что именно ссылается p;

Свободная арифметика применима только к pchar, поэтому я пердпочитаю: pcahr(p):=pchar(p)+sizeof(p^)


 
Pre_AlFa   (2003-09-19 10:11) [7]

2KSergey ©:

> Такая поддержка есть
> по возможностям - полная эквивалентность.

Пример кода, если нетрудно. Си и его аналог на Дельфи.


 
Verg ©   (2003-09-19 10:16) [8]

function GetObj(pObjData : PDWORD; dwObj : DWORD): PDWORD;
var i : DWORD;
begin
result:=pObjData;
for i:=0 to dwObj-1 do
pchar(result) :=pchar(result)+(result^+1)*sizeof(result^);
end;


 
Кабан   (2003-09-19 10:20) [9]

2 Verg
а кто мешает
P := Ptr( LongWord(P) + Sizeof(Struct) );


 
Verg ©   (2003-09-19 10:30) [10]


> Кабан (19.09.03 10:20) [9]


Никто не мешает :)

> P := Ptr( LongWord(P) + Sizeof(Struct) );


Делая это ты предпологаешь (догадываешься :), что адрес на данном типе процессора - есть линейная 32-х битная величина. Этим самым "знанием" ты берешь на себя как бы ответственность за преобазования арифметики с числами к арифметике с указателями.
А в случае с pchar эту ответственность берет на себя компилятор :) И вся разница.


 
MBo ©   (2003-09-19 10:32) [11]

>Verg
Inc(Типизированный пойнтер)
сдвинет на размер базового типа


 
Владислав ©   (2003-09-19 10:43) [12]

> Verg © (19.09.03 10:09) [6]

Инкремент спасает.

cardinal(p):=cardinal(p)+1

Аналог на С добавит тот же байт. И ему тоже плевать будет.
Смотри MBo © (19.09.03 10:32) [11].

> Verg © (19.09.03 10:16) [8]

"... Мне же нужно, чтобы эта функция вернула массив в смысле Дельфи..."

Как то пример с требованиями не согласуется.

> Verg © (19.09.03 10:30) [10]

Ну не без этого. Пока, слава богу (или интэлу), 32 ;-)

> Verg

И не подумайте, что я придираюсь ;-)

:)))


 
Verg ©   (2003-09-19 10:43) [13]


> MBo © (19.09.03 10:32) [11]


Я знаю.
Я хотел сказать, что


> Владислав © (19.09.03 09:45) [3]
> Приводи указатели к типу Cardinal (DWORD) и "делай" с ними
> арифметику.

- это не совсем верно.


 
Владислав ©   (2003-09-19 10:50) [14]

> Verg © (19.09.03 10:43) [13]

"... - это не совсем верно."

Ну почему же? В чем ошибка то? Чего сделает Inc, если базовый тип не известен? И что сделать тогда, если "это не совсем верно"?


 
Verg ©   (2003-09-19 10:52) [15]

type
PArp = ^TARP;
TArp = array[0..0] of DWORD;

function GetObj(pObjData : PDWORD; dwObj : DWORD): PArp;
var i : DWORD;
begin
for i:=0 to dwObj-1 do
pchar(pObjData) :=pchar(pObjData)+(pObjData^+1)*sizeof(pObjData^);
Result:=PArp(pObjData);
end;

Далее
GetObj(....)[i]


 
Verg ©   (2003-09-19 10:58) [16]


> Чего сделает Inc, если базовый тип не известен?


Ты имеешь ввиду тип pointer?
Тогда Inc просто не странслируется. а sizeof(P^) - даcт 0;

void* p <-> p:pointer;

p++ -тоже даст ошибку компиляции.


 
Pre_AlFa   (2003-09-19 10:59) [17]

Благодарности всем откликнувшимся. Узнал много нового. :) Сам сделал как в последнем примере by Verg. Просто хотел уточнить, как надо делать на самом деле... :)


 
Verg ©   (2003-09-19 11:00) [18]

тем временем
P:pointer

pchar(p) = pchar(p) + <сколько надо> - будет нормально работать


 
KSergey ©   (2003-09-19 11:01) [19]

type
PCardinal = ^Cardinal;

function GetObj( pObjData: PCardinal; dwObj: Cardinal ): PCardinal;
var
i: Cardinal;
begin
for i := 0 to dwObj-1 do
Inc(pObjData, pObjData^ + 1);
Result := pObjData;
end;


Проверил, точно работает.

PS
К стати, пока делал - на интересную вещь наткнулся (знал, понятно, но не задумывался): в Си {} - это тело ф-ции, а в дельфи - комментарий ;)


 
Verg ©   (2003-09-19 11:11) [20]


> Ну не без этого. Пока, слава богу (или интэлу), 32 ;-)


Если б это говорил программист на ассемблере..... :))
Да чего уж греха таить - сам иногда пишу 4 вместо sizeof(pointer) :)


 
Владислав ©   (2003-09-19 11:20) [21]

> Verg © (19.09.03 10:52) [15]

Уже лучше. :)

> Verg © (19.09.03 10:58) [16]

Во-первых, я имею ввиду паскаль таки :)

sizeof(P^)

Чегой то сдесь лишнее, как мне кажется... Может "очепятка"?..

> Verg © (19.09.03 11:00) [18]

Во, во. А "<сколько надо>" я, как разработчик и сам могу узнать ;-)

Блин, я, вообще то, и вправду не придираюсь :-)

> KSergey © (19.09.03 11:01) [19]

Чего то здесь не так... Только вот что?.. Такой риторический вопрос...


 
KSergey ©   (2003-09-19 11:55) [22]

> [21] Владислав © (19.09.03 11:20)
> > KSergey © (19.09.03 11:01) [19]
>
> Чего то здесь не так... Только вот что?.. Такой риторический
> вопрос...

Я не понял: вопрос именно риторический, т.е. не требует ответа, или все же что-то не то? ;)

Я написал свой пост [19] после [7] Pre_AlFa. Других на тот момент не было.
Я просто буквально перевел Си-шный код. Один в один.
Я проверил его в дельфи, он точно работает. Оттуда его букватьно и скопировал.
Возможно, он идет в разрез с новыми пожеланиями автора, высказанными уже после [7].
Ну и конечно же, я далеко не первый ;)


 
KSergey ©   (2003-09-19 12:00) [23]

Ага, посмотрел как опубликовалось - ну разве что Result:=... напрасно сдвинулось так далеко.
Ну и возмножно указатель на Cardinal и так где-то объявлен, но мне не попалось...



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

Текущий архив: 2003.10.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
14-4105
Knight
2003-09-13 21:06
2003.10.02
& n b s p ; и другие...


14-4065
Igorek
2003-09-12 11:07
2003.10.02
Что такое ЛЕНЬ?


8-4002
Оля
2003-06-05 11:49
2003.10.02
тип HDC


4-4170
XAMLO
2003-07-31 00:19
2003.10.02
Showmessage на чистом API?


1-3976
SergeyM
2003-09-19 15:28
2003.10.02
Массивы