информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медПортрет посетителяАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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
<"чистая" ссылка> <обсуждение закрыто>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach