Программрование для чайников.

Автор Catcatcat, 27-07-2011, 11:02:52

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

Catcatcat

27-07-2011, 11:02:52 Последнее редактирование: 27-07-2011, 11:19:45 от Sasha
В этой теме только вопросы по программированию и их возможное решение.

Catcatcat

27-07-2011, 11:08:14 #1 Последнее редактирование: 27-07-2011, 11:18:29 от Catcatcat
Вопрос у меня есть в программе некая битовая структура.

например

struct {
unsigned    hi : 1;
unsigned    di : 1;
unsigned    lo : 1;
} foo;

Мне необходимо в процессе выполнения программы все биты сбросить в ноль. Возможно ли это сделать одной командой или прийдется каждый бит обнулять в отдельности?

Sasha

27-07-2011, 11:14:56 #2 Последнее редактирование: 27-07-2011, 11:38:29 от Sasha
struct  {
unsigned    hi : 1;
unsigned    di : 1;
unsigned    lo : 1;

void reset()
{
hi = 0;
di = 0;
lo = 0;
}
} foo;


foo.reset();
skype: ab.sasha

Sasha

Не могу вспомнить что означает hi : 1 в с++ ?
skype: ab.sasha

Catcatcat

27-07-2011, 11:24:45 #4 Последнее редактирование: 27-07-2011, 11:27:01 от Catcatcat
Меня интересует вопрос эффективности кода, в этом случае я так понимаю, компилятор все равно (мне так кажется) составит три команды по обнулению битов. Хотя надо проверить. Ассемблером это можно сделать за одну команду. И меня интересует задача как это сказать компилятору, что бы он меня правильно понял.

В общем, протестирую и сообщу, как мой компилятор меня понял.

За ответ Спасибо.

Sasha

И еще объясни плиз что будет если написать unsigned hi, и не указать тип (я думал к примеру unsigned int hi и если без int, то компилятор не съест), что-то я смотрю начал уже порядком подзабывать си...
skype: ab.sasha

Sasha

Ответь на последний вопрос и тогда может еще что-то посоветую.
skype: ab.sasha

Catcatcat

Цитата: Sasha от 27-07-2011, 11:19:16
Не могу вспомнить что означает hi : 1 в с++ ?


в моем вопросе это просто название битов.

Sasha

Переформулирую, что делает оператор : ?
skype: ab.sasha

Sasha

Вобще тема битовых операций в си прошла мимо меня.
Если бы это было с++ я бы взял массив bool переменных, так как они занимают в памяти именно 1 бит, но одним махом все не обнулишь. Для этого можно объявить к примеру переменную типа short или byte(я не помню есть ли такой тип в Си) и работать с его младшими 3 битами. Тогда при обнулении этой переменной обнуляться и все ее биты.
skype: ab.sasha

Catcatcat

В моем примере

struct {
unsigned    bi01 : 1;
unsigned    bi02 : 1;
unsigned    bi03 : 1;
} foo;

это битовая структура

обращаться к ней можно

foo.bi01=1; // устновить бит в 1;
foo.bi02=0; // сбросить бит в 1;


unsigned (то что значение не может быть отрицательным)    bi01 (имя)  : 1 (размерность в битах);

Sasha

Не знаю. Кроме как работать с разрядами одной переменной я других простых вариантов решения твоего условия не вижу.
skype: ab.sasha

Catcatcat

В моем случае компилятор ориентирован для работы со встроенными системами (PIC-контроллеры). В нем свои заморочки. Бит как тип имеется (булевые - нет). И еще приходится бороться оптимизатором (если он всклочен, а он должен быть включен), если он определяет, что бредовый код, просто выкидывает его. Сидишь и лупаешь глазами ???

Catcatcat

Спасибо за ответ. Мне понравилось описание функции сброса. Я считаю оригинальное, попробую, сообщу, как это эффективно или нет.

Sasha

27-07-2011, 11:46:28 #14 Последнее редактирование: 27-07-2011, 11:49:25 от Sasha
Модификатор volatile защищает переменную от оптимизации.
Если не получится, вечером еще один вариант напишу.
skype: ab.sasha