Форум: "Основная";
Текущий архив: 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