Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Помогите перекодировать, плз... 26.11.03 10:08
Автор: HandleX <Александр М.> Статус: The Elderman
|
Сейчас сижу вот, пытаюсь кусок кода в Delphi перекинуть...
Итак, что означает вот это на нетленном Це:
template <class T1, class T2> inline
T1* Padd(T1* p, T2 n) { return (T1*)((char *)p + n); }
Заранее всем спасибо.
|
|
[C++] Помогите перекодировать, плз... 26.11.03 11:39
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
> Сейчас сижу вот, пытаюсь кусок кода в Delphi перекинуть... > Итак, что означает вот это на нетленном Це: > > template <class T1, class T2> inline
> T1* Padd(T1* p, T2 n) { return (T1*)((char *)p + n); }
>
> > Заранее всем спасибо. У-у... Это не це, это приплюснутый це... Сильно приплюснутый. Короче, боюсь, что ты попал: насколько я знаю, в Дельфях обобщенное программирование не поддерживается. Максимум что ты можешь сделать - это считать, что T1 * всегда можно привести к void * , а T2 - к long . То есть упростить функцию до
void *Padd(void *p, long n) { return (char *)p + n; }
Правда, пользователям придется добавлять явное приведение к T1 в своих программах, тут уж никуда не денешься.
|
| |
[C++] Я не спорю, пусть «сильно присплюснутый» ;-) Означает ли это, что... 26.11.03 13:00
Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 26.11.03 13:05 Количество правок: 1
|
> > Сейчас сижу вот, пытаюсь кусок кода в Delphi перекинуть... > > Итак, что означает вот это на нетленном Це: > > > > template <class T1, class T2> inline > > T1* Padd(T1* p, T2 n) { return (T1*)((char *)p + n); } > > > > Заранее всем спасибо. > У-у... Это не це, это приплюснутый це... Сильно > приплюснутый. Короче, боюсь, что ты попал: насколько я > знаю, в Дельфях обобщенное программирование не > поддерживается. Максимум что ты можешь сделать - это > считать, что T1 * всегда можно > привести к void * , а > T2 - к > long . То есть упростить функцию до > > void *Padd(void *p, long n) { return (char *)p + n; }
>
> Правда, пользователям придется добавлять явное приведение к > T1 в своих программах, тут уж никуда не денешься. Т.е. упрощённо можно сказать, что функция Padd берёт два параметра: указатель на указатель p и параметр n, после выхода их функции имеем увеличенный на n указатель?
Примерно:
Procedure Padd(Var p: pointer; n: DWORD);
Begin
p := Pointer(DWORD(p) + n);
End;
Оно? Или не оно? ;-)))
|
| | |
[C++] Ну... В данном случае фактически да :))) 26.11.03 13:21
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 26.11.03 13:22 Количество правок: 1
|
> Т.е. упрощённо можно сказать, что функция Padd берёт два > параметра: указатель на указатель p и параметр n, после > выхода их функции имеем увеличенный на n указатель? > Примерно: > > Procedure Padd(Var p: pointer; n: DWORD);
> Begin
> p := Pointer(DWORD(p) + n);
> End;
>
> Оно? Или не оно? ;-))) Оно, оно :) В данном конкретном случае тебе повезло, это не темплейт, а чудо в перьях было, а я сразу не разглядел :) Правда, там допускается некое обобщение, например, в качестве второго аргумента может передаваться вообще какой-нить объект, для которого определена операция сложения с указателем. Но что-то я сомневаюсь, что это твой случай :)
|
| | | |
[C++] Упс... Можно подробнее про объекты? 26.11.03 13:55
Автор: HandleX <Александр М.> Статус: The Elderman
|
> > > > Procedure Padd(Var p: pointer; n: DWORD);
> > Begin
> > p := Pointer(DWORD(p) + n);
> > End;
> >
> > Оно? Или не оно? ;-))) > Оно, оно :) В данном конкретном случае тебе повезло, это не > темплейт, а чудо в перьях было, а я сразу не разглядел :) > Правда, там допускается некое обобщение, например, в > качестве второго аргумента может передаваться вообще > какой-нить объект, для которого определена операция > сложения с указателем. Но что-то я сомневаюсь, что это твой > случай :) Так. Уже подозрительно... Там в коде может толкаться в Padd указатели на структуры. Означает ли это, что тогда указатель p будет увеличен на n умноженное на размер структуры?
|
| | | | |
[C++] Спокойно :) 26.11.03 15:12
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 26.11.03 15:15 Количество правок: 1
|
> > Правда, там допускается некое обобщение, например, в > > качестве второго аргумента может передаваться вообще > > какой-нить объект, для которого определена операция > > сложения с указателем. Но что-то я сомневаюсь, что это твой > > случай :) > Так. Уже подозрительно... Там в коде может толкаться в Padd > указатели на структуры. Означает ли это, что тогда > указатель p будет увеличен на n умноженное на размер > структуры? Я говорил о втором аргументе. С T1 тебе огромную услугу оказывает во-первых, звездочка везде, где используется T1 , и во-вторых, очень милое приведение к char * перед сложением. Приведение к char * автоматически заставляет все арифметические операции с указателем считать, что указываемый объект имеет длину char (то есть, за исключением экстравагантных случаев, 1 байт). А то, что везде используется T1 * , автоматически ограждает тебя от необходимости что-то делать с "умными указателями", например, которые ведут себя как указатели, но являются полноценными объектами. Что же касается второго аргумента, то тут все немного хуже, потому что теоретически (я не знаю вызывающего кода) возможна передача переменной не кардинального типа (short, int, long ), а какого-нибудь класса (my_long , скажем, или pointer_offset ), для которого есть специальная операция для сложения с указателем:
class pointer_offset
{
// ...
};
template <class T1>
T1 *operator+(T1 *, pointer_offset);
---
Трудно сказать, для чего это может быть нужно, но мало ли... Ну короче я повторяю - это наверняка не твой случай :) А с T1 тебя заботливо предохранили от возможного геморроя :)
|
| | | | | |
[C++] Ну всё, как от сердца отлегло ;-) Спасибо огромное! 26.11.03 15:25
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
| | | | | | |
[C++] Не за что :) Тему закрой :) 26.11.03 15:29
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
|
|
|