Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параметры метода, зависящие от шаблона 
V
    Опции темы
MAKCim
Дата 18.9.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Earnest @  18.9.2007,  07:37 Найти цитируемый пост)
В C++ при желании можно обойти любые ограничения.

не все, но большинство  smile 
хотя тут от компилятора зависит

Это сообщение отредактировал(а) MAKCim - 18.9.2007, 08:43


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 18.9.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  18.9.2007,  08:43 Найти цитируемый пост)
не все, но большинство  smile 

ну кроме совсем встроенных, типа конкретности количества шаблонных параметров...

а насчет типов reinterpret_cast бьёт всё smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Skladnoy
Дата 18.9.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Цитата(zkv @ 18.9.2007,  01:26)
Цитата(Skladnoy @  18.9.2007,  00:47 Найти цитируемый пост)
В С нет ссылок (только в С++) 

а шаблоны есть?  smile 
Это я к названию темы, если что...

Да там вообще ничего нет.  Ну, почти... Просто ковыряюсь в последнее время именно с С. 

Кстати, если реально нужны массивы фиксированной длины можно использовать что-то вроде.
Код

template<class T, int N>
class Array {
public:
    T data[N];
    T& operator[] { ... }

    И т.д.

PM MAIL   Вверх
zkv
Дата 18.9.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(JackYF @  18.9.2007,  14:39 Найти цитируемый пост)
а насчет типов reinterpret_cast бьёт всё

под VC++8.0
Код

    const char *constPtr = "xexe";
    char *volPtr = reinterpret_cast<char *>( constPtr );

Цитата

error C2440: 'reinterpret_cast' : cannot convert from 'const char *' to 'char *'
        Conversion loses qualifiers

 так что не так уж он всемогущ smile 
PM MAIL   Вверх
JackYF
Дата 18.9.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(zkv @  18.9.2007,  20:34 Найти цитируемый пост)
так что не так уж он всемогущ smile  

согласен... хорошо, const_cast + reinterpret_cast бьют всё smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 18.9.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(JackYF @  18.9.2007,  21:25 Найти цитируемый пост)
согласен... хорошо, const_cast + reinterpret_cast бьют всё 

не все
Код

const int count = 0;

int main() {
    *const_cast<int*>(&count) = 1;
    return 0;
}

в runtime будет Segmentation Fault (по крайнй мере на нормальной системе с нормальным компилятором)

Добавлено через 2 минуты и 37 секунд
да, вот еще
Код

class some {
    int variable;
};

int main() {
    some a;
    int b = reinterpret_cast<some>(a);
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 18.9.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  18.9.2007,  21:40 Найти цитируемый пост)
по крайнй мере на нормальной системе с нормальным компилятором

ну в случае попытке записи в область, помеченную как неизменяемую - да smile


Цитата(MAKCim @  18.9.2007,  21:40 Найти цитируемый пост)
int b = reinterpret_cast<some>(a);

не, ну тут решается

Код

int b = *(reinterpret_cast<int*>(some));



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Earnest
Дата 19.9.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Что-то вы увлеклись <cast>... А про убойную силу приведения в стиле C забыли? Ему что const, что не-const... Конечно, никто не гарантирует, что программа не упадет (2MAKCim), но речь ведь шла о том, чтобы надуть компилятор.  
Т.е. сначала речь была о том, как написать безопасный код. А потом плавно перешли на то, как эту безопасность обойти...
smile  smile  smile 


--------------------
...
PM   Вверх
JackYF
Дата 19.9.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Earnest @  19.9.2007,  10:52 Найти цитируемый пост)
А потом плавно перешли на то, как эту безопасность обойти...

ну правильно, врага надо знать в лицо smile
чтобы создать еще больше трудностей по обходу нашего "безопасного" кода

Цитата(Earnest @  19.9.2007,  10:52 Найти цитируемый пост)
А про убойную силу приведения в стиле C забыли?

да, подзабыли  smile 


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 19.9.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



JackYF, 
Цитата(JackYF @  18.9.2007,  23:06 Найти цитируемый пост)
не, ну тут решается
int b = *(reinterpret_cast<int*>(some));

сам посуди, что ты написал
если мы some приведем к указателю, то мы по сути переменной b присвоим значение, которое лежит по адресу some.variable, а не саму variable

Добавлено через 1 минуту и 44 секунды
Цитата(Earnest @  19.9.2007,  10:52 Найти цитируемый пост)
А про убойную силу приведения в стиле C забыли? Ему что const, что не-const... 

имхо, как раз reinterpret_cast<> соответствует приведению в стиле С


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 19.9.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  19.9.2007,  14:56 Найти цитируемый пост)
соответствует приведению в стиле С 

нет, я проверил... ему действительно пофиг: const char* к char* приведёт за милую душу, в отличие от reinterpret_cast

Цитата(MAKCim @  19.9.2007,  14:56 Найти цитируемый пост)
мы по сути переменной b присвоим значение, которое лежит по адресу some.variable

ну да. А ты что хотел сделать?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 19.9.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(JackYF @  19.9.2007,  22:15 Найти цитируемый пост)
ну да. А ты что хотел сделать?

присвоить b значение some.variable


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 20.9.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  19.9.2007,  23:21 Найти цитируемый пост)
присвоить b значение some.variable

Цитата(MAKCim @  19.9.2007,  14:56 Найти цитируемый пост)
то мы по сути переменной b присвоим значение, которое лежит по адресу some.variable

не понял различия...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 20.9.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



JackYF, 
тут
Код

b = *reinterpret_cast<int*>(some);

объект some (занимает 4 байта) приводится к указателю, т. е some.variable становится адресом
значение по этому адресу присваивается переменной b
тут же
Код

b = reinterpret_cast<int>(some);

значение some.variable становится значением b
вот различие на ассемблере
1.
Код

; [ebp - 8] - переменная b, [ebp - 4] - объект some
    mov    eax, dword ptr [ebp - 4]
    mov    eax, dword ptr [eax]
    mov    dword ptr [ebp - 8], eax

2.
Код

; [ebp - 8] - переменная b, [ebp - 4] - объект some
    mov    eax, dword ptr [ebp - 4]
    mov    dword ptr [ebp - 8], eax



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 20.9.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Блин, минут 10 пытался въехать, что у меня неправильно smile

Конечно же, я имел ввиду с самого начала
Код

b = *(reinterpret_cast<int*>(&some));



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0725 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.