реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Переменная типа bool, Как правильно создать
Wiener
сообщение Sep 1 2008, 12:47
Сообщение #1


Участник
*

Группа: Почетный участник
Сообщений: 42
Регистрация: 30-01-06
Из: Москва
Пользователь №: 13 758



Всем доброго времени суток.
Пишу на C под CW6.1 и столкнулся с отсутствием типа bool как таковой.
Вернее тип есть, если подключить библиотеку, но при этом по факту переменная получается int и соответственно занимает 2 байта (1 байт если беззнаковый).
Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.
Заранее благодарен.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 1 2008, 13:10
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Wiener @ Sep 1 2008, 15:47) *
Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.


Тип bool практически всегда занимает столько же места, сколько и int. Если вам нужен именно бит, копайте в сторону bitfields. Если ваш компилятор позволяет, их можно объединить в анонимную структуру. Если нет - придется структуру обозвать.

P.S. что-то цитирование поломалось...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 1 2008, 13:13
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В Standard C (ANSI C) типа bool вообще нету. Его ввели только в C99. По стандарту C99 макрос bool разворачивается в константу типа _Bool, которая имеет размерность integer и принимает значения true = 1 или false = 0. Определение типа bool находится в хедере stdbool.h.
Цитата
ISO/IEC 9899:1999 (E) ©ISO/IEC
7.16 Boolean type and values <stdbool.h>
1. The header <stdbool.h> defines four macros.
2. The macro
bool
expands to _Bool.
3. The remaining three macros are suitable for use in #if preprocessing directives. They
are
true
which expands to the integer constant 1,
false
which expands to the integer constant 0, and
_ _bool_true_false_are_defined
which expands to the integer constant 1.
Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then
redefine the macros bool, true, and false.
213)


Угу. Какая-то беда с цитированием приключилась. sad.gif
Go to the top of the page
 
+Quote Post
one_man_show
сообщение Sep 1 2008, 13:45
Сообщение #4


Помогу, чем смогу
******

Группа: Админы
Сообщений: 2 786
Регистрация: 28-05-04
Из: Москва
Пользователь №: 25



Прошу прощения за отступление от темы, вынужден проверить возможности цитрования по запросу пользователя

Цитата(Wiener @ Sep 1 2008, 15:47) *
Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.


Все заработало, слегка поправил настройки


--------------------
С уважением,
Ваган Саруханов
Проекты|Форум|Facebook|Linkedin
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 1 2008, 16:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(rezident @ Sep 1 2008, 17:13) *
По стандарту C99 макрос bool разворачивается в константу типа _Bool, которая имеет размерность integer...

Я не совсем понял, что значит "_Bool ... имеет размерность integer". Если это значит, что переменная типа _Bool будет занимать столько же байт, что и переменная типа int, то это неверно. В стандарте C99 это нигде не сказано. К тому же, например, компилятор Си для ColdFire от фирмы Green Hills выделяет под переменные типа _Bool 1 байт, в то время как int занимает 4 байта. На мой взгляд, Green Hills знает толк в компиляторах, по крайней мере код генерится отличный.
Однако, не стоит ожидать, что _Bool сможет занимать один бит, кроме как в битовых полях. Это связано с тем, что язык Си позволяет делать такие вещи, как опрелелять массивы _Bool, члены структур _Bool, выполнять адресную арифметику с переменными типа _Bool. Всё вышеперечисленное было бы очень трудно реализовать, если бы _Bool занимал только 1 бит.
Некоторые компиляторы определяют нестандартный тип для однобитовых переменных (скажем, bit). Можно заменить стандартный stdbool.h на свой, где будет "#define bool bit". Только при это не получится сделать массив типа bool, член структуры типа bool и т.д. (см. выше).
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 1 2008, 16:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Дык никто и не запрещает переопределить типы данных и пользоваться своими (одинаковыми) типами на различных платформах. Вот только с битовым типом bool я бы не рискнул связываться. В крайнем случае сделать его 8-ми битовым типом unsigned char.
Go to the top of the page
 
+Quote Post
Wiener
сообщение Sep 11 2008, 10:46
Сообщение #7


Участник
*

Группа: Почетный участник
Сообщений: 42
Регистрация: 30-01-06
Из: Москва
Пользователь №: 13 758



Решение найдено.
Код
typedef struct {
char b0:1;
...
char b7:1;
} bit1byte;

bit1byte Status;

if (Status.b0 = 0x1) { // BRSET
...
}

Status:b0 = 0x1; // BSET

При этом можно использовать и больше одного байта для флагов.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 11 2008, 11:09
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Wiener @ Sep 11 2008, 13:46) *
Решение найдено.
Ваше решение называется bitfields. Я вам о нем написал в первом же ответе.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 15 2008, 07:04
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Sep 11 2008, 15:09) *
... Я вам о нем написал в первом же ответе.

Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-)
Go to the top of the page
 
+Quote Post
Wiener
сообщение Sep 15 2008, 10:07
Сообщение #10


Участник
*

Группа: Почетный участник
Сообщений: 42
Регистрация: 30-01-06
Из: Москва
Пользователь №: 13 758



Цитата(scifi @ Sep 15 2008, 11:04) *
Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-)

Я читал все ответы, просто для остальных интересующихся данным вопросом привёл рабочий пример, дабы полностью закрыть вопрос.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th April 2024 - 06:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016