![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
bool d[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1};
sizeof (d)? тут токо битовые поля помогут -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| vickr |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.5.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
ShowMessage выводит 0 и правильно делает. Это 1-й элемент массива. А тебя что не устроило? --------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:) |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
=32 и что дальше? sizeof дает размерность массива, а не число байт которые он занимает. Тебя же не удивляет, что оператор [] возвращает верный результат, а не байт с 8 элементами? Проблемы, связанные с тем что bool это в сущности бит возникаеют при использовании vector<bool>, но это уже другая песня.... |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
товарищи, а вы через асм всавку не хотите сделать с дефайном
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Сначала надо определиться что нужно, а потом уже вставки изобретать |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
вопрос человек поставлен в принциае коректно, он даже пример дал для 16 системы, что тут определяться
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Нет в С использование двоичных констант принципе не возможно.
Числовые константы могут быть в десятичном, шестнадцатиричном (начинаться с 0x) и восмиричном виде (начинатся с 0). -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
А вот и ничего подобного! sizeof дает число занимаемых байт! А кол-во элементов вычисляется так: sizeof (b)/sizeof(b[0]) -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Тут опять не совсем верно... 0 это хоть и первый элемент массива, но дело не в этом... bool d[32]={0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1}; Если так написать, то чего выведет? Прально, 256, потому как берется 4 первых байта из массива при приведении к int'у. -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| vickr |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.5.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
Согласен, допустил неточность, приведение имени массива (bool*) к (int*) дает нам действительно первых 4 байта, а не 1 ( интересный результат дает попытка пройтись по массиву используя арифметику указателей - g++ несколько раз Так что меня удивила формулировка вопроса "Почему это не работает?". Сам, правда, стараюсь не делать таких "зависящих от реализации" (по Страуструпу) преобразований. --------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:) |
|||
|
||||
| HexoGenus |
|
|||
![]() Шустрый ![]() Профиль Группа: Экс. модератор Сообщений: 110 Регистрация: 28.8.2002 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Хммм... ну привожу... я что думаете этого не понимаю? я не понимаю другого... указатель это адрес в памяти ? так. По этому адресу я в виде булов укладываю нолики и единички побитово... потом то что хранится по этому адресу я принудительно считаю массивом интовским и 32 бита должны стать как раз одним интовским числом... .... так почему это не работает? может к примеру адрес буловских указателей длиннее? или преобразование указателей можно как-то по особому выполнить... в конце концов это адрес в памяти или все же какое то смещение которое у интовского и булевого типа идут из разных точек? Кто знает? --------------------
Когда невозможно уже работать напряженнее, начни работать умнее. |
|||
|
||||
| vickr |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.5.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
Так вот в чем проблема! Ты бы сразу написал, что там "не работает" еще раз спорный фрагмент:
Итак, что здесь происходит: 1 строка: объявление массива из 32 bool с инициализацией: в памяти выделяется 32 байта (а не бита), т.е. каждый 0 или 1 занимают по 1 байту. Что касается d, то это, фактически, 4-байтный указатель на первый элемент массива (который, в свою очередь, имеет тип bool и занимает, таким образом 1 байт). 2 и 3 строка: Такому же 4-байтному указателю g присваивается адрес первого элемента массива, на первый взгляд, но (важный момент) - если ты прочитаешь значение, записанное по адресу g (int c = *g), то обнаружишь, что ты прочитал превые 4 элемента. Это происходит потому, что b и g - типизированные указателт. В общем, я увлекся. Baa до меня написал о том же, только короче. Короче, по адресу d хранится 00000000, 00000000, ..., 00000001 - всего 32 байта. Ты же ожидаешь там увидеть 00000000000000000000000000000111, т.е. значение типа int, 32 бита (причем старший разряд - знаковый). Вот вроде и все. Прошу прощения за некоторую косноязычность --------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:) |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |