Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по C++/CLI 
:(
    Опции темы
jfx
Дата 12.1.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я тут смотрел одну сборку Reflector-ом, и меня сбили с толку вот такие записи:
Код

(num2 * 2)[((int) pBuf)] = num8;

Это что значит? Я чего-то не понимаю или Reflector глючит???
Спасибо.
PM MAIL   Вверх
Vyacheslav
Дата 12.1.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну вообщето ничего странного нет, за исключением того, что выбрана такая запись smile
В переводе на обычный язык это
Код

pBuf[num2 * 2] = num8


Ради интереса возьмите любой комплятор С++ и попробуйте отранслировать нечто подобное
Код

 int buf[10];
 
(0)[buf] = 5;
cout << buf[0] << endl;   




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
jfx
Дата 12.1.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо. Я забыл добавить, что сам в C++ полный ноль (только C#), поэтому и возникают подобные вопросы. А что значит последняя строка?
Код

cout << buf[0] << endl;

Я такие записи тоже встречал, и если чнстно думал что это сдвиг... А на самом деле?
PM MAIL   Вверх
Vyacheslav
Дата 12.1.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



вывод на консоль.

А почему такая своеобразная запись проскакивает могу объяснить
запись
Код

buf[ 1 ] = 5 ;


эквивалента записи
Код

*(buf +  1 ) = 5 ;


А так как от перемены мест слагаемых сумма не изменяется то мы вправе записать
Код

*(1 + buf ) = 5 ;

А теперь сжимаем обратно
Код

1[buf] = 5 ;



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 13.1.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(Vyacheslav @ 12.1.2006, 14:22 Найти цитируемый пост)
А так как от перемены мест слагаемых сумма не изменяется то мы вправе записать

Код

*(1 + buf ) = 5 ;

А теперь сжимаем обратно

Код

1[buf] = 5 ;


"Незачот. Вы, батенька, пропустили занятия по С++ в этом семестре, придётся вам прийти на пересдачу в свободное время" (с). smile

К указателю можно прибавить смещение N. Получим указатель, отстоящий от исходного на N элементов (не байт). Указатель можно разименовать как с пом. оператора "звёздочка", так и с пом. квадратных скобок. Во втором случае, целочисленное значение в квадратных скобках определяет смещение от исходного указателя до элемента, который мы получим в результате.

Разименовать числовую константу с пом. квадратных скобок невозможно - данная операция не имеет смысла.


--------------------
user posted image
PM MAIL WWW   Вверх
Vyacheslav
Дата 13.1.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mr.DUDA @ 13.1.2006, 08:37)
Цитата(Vyacheslav @  12.1.2006,  14:22 Найти цитируемый пост)
А так как от перемены мест слагаемых сумма не изменяется то мы вправе записать

Код

*(1 + buf ) = 5 ;

А теперь сжимаем обратно

Код

1[buf] = 5 ;


"Незачот. Вы, батенька, пропустили занятия по С++ в этом семестре, придётся вам прийти на пересдачу в свободное время" (с). smile

К указателю можно прибавить смещение N. Получим указатель, отстоящий от исходного на N элементов (не байт). Указатель можно разименовать как с пом. оператора "звёздочка", так и с пом. квадратных скобок. Во втором случае, целочисленное значение в квадратных скобках определяет смещение от исходного указателя до элемента, который мы получим в результате.

Разименовать числовую константу с пом. квадратных скобок невозможно - данная операция не имеет смысла.

Ответный незачет, уважаемый.
Возмите любой компилятор, и проделайте подобную операцию.
И любой компилятор, поодерживающий ANSI C++ вот это
Код


int main(int argc, char* argv[])
{
    int buf[3];
    0[buf] = 1;
    1[buf] = 2;
    2[buf] = 3;  
    cout << buf[0] << endl;
    cout << buf[1] << endl;
    cout << buf[2] << endl;
    return 0;
}


спокойно проглотит.
Это не открытие, а фича, известная всем тем, кто достаточно серьезно пишет на С++.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 13.1.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Мдя... в самом деле...

+1


--------------------
user posted image
PM MAIL WWW   Вверх
Дрон
Дата 13.1.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Vyacheslav
Фигасе... Чувствую, что ещё пара таких приколов и я к С++ больше никогда не подойду.


--------------------
Да. Именно так.
PM   Вверх
mr.DUDA
Дата 14.1.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Во-во !

Вначале кажется, что это кто-то ошибся smile

Потом - что это ошибка компилятора smile

Затем - что это просто снится... smile

Наконец, начинаешь понимать что не всё знаешь о предмете. Хорошо всё-таки иногда повышать свой кругозор... smile


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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