Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];

Вниз

Перевод 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
14-4113
panov
2003-09-13 13:46
2003.10.02
Еще без слов-)


1-3924
Alex21
2003-09-18 11:42
2003.10.02
Ускорение работы Excel при взаимодействии со Stringgrid


3-3770
andrey__
2003-09-11 17:16
2003.10.02
Одно из полей в сумме равно Null


1-3869
Dysan
2003-09-18 17:45
2003.10.02
лист excel на форме


3-3731
erw
2003-09-12 16:06
2003.10.02
Как уменшить I/O cost у большой таблицы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский