Выделение бита из байта в С++

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

(c) А поговорить ???
Самое большое в мире счастье - это счастье человеческого общения...
Всем понятно, что тема топика перетерта до дыр...
:)
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

byte - ключевое слово с++, им попытались назвать переменную, потому так и получилось. Это для тех кто в танке и из предыдущего обсуждения не понял (:
Контактная информация:
Реклама
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Сообщение lix »

byte не ключевое слово плюсов. обычно это typedef unsigned char'a.
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Тупедеф. Он самый.
Про предыдущее обсуждение BCluster правильно сказал.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Neekeetos писал(а): ...Проблема в const которую пытаются переопределить...
Это где там попытка переопределить const?
Neekeetos писал(а): unsigned char const - это должно быть таким const unsigned char...
Не путайте uchar const* var (или const uchar* var - что одно и тоже) и uchar* const var...
Neekeetos писал(а): ...вообще говоря в чем смысл такой махинации с конст неясен, в функцию передается указатель на байт, учитывая что этот указатель создается специально для функции никому не важно меняется он или нет, тоже самое касается случая когда аргумент - просто переменная - создается копия до которой никому кроме самой функции нету дела...
Там и нет дела до указателя - он не константа. Константой объявлена переменная, на которую указывает указатель. Стандартный прием, дабы ненароком не повредить данные. Что касается передачи копии - для одного байта выгоды в использовании указателя может и немного, но гораздо чаще приходится передавать значительные объемы данных, когда передача через копии отнимает слишком много памяти. Опять же - привычка...
Neekeetos писал(а): ...Сам код непонятный...
Предельно понятный :) ...
То что у него компилятор не отловил некорректное объявление типа аргумента просто связано с тем что С для пиков это глюкодром, думаю если по нему судить то многие нелегальные по стандарту конструкции кода сработают
Так в чем же некорректность объявления? Или MVS+ 2005 уже не авторитет?... А K&R?

Поправил :)
Последний раз редактировалось Goodefine Ср апр 21, 2010 21:01:55, всего редактировалось 1 раз.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Neekeetos писал(а):
РадиоЛоматель писал(а):Microsoft Visual С++:
...Проблема в const которую пытаются переопределить...
Neekeetos писал(а):
РадиоЛоматель писал(а):Microsoft Visual С++:
unsigned char const - это должно быть таким const unsigned char...
Neekeetos писал(а):
РадиоЛоматель писал(а):Microsoft Visual С++:
...Сам код непонятный...

Интересно, что ни одно из вышеперечисленных высказываний, якобы моих, мне не принадлежит. Это я так, для ясности. Не в обиду :)

Ах да, я целиком соглашаюсь с тем, что можно делать так, как предложил Goodefine.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

Goodefine писал(а):
Neekeetos писал(а): ...Проблема в const которую пытаются переопределить...
Это где там попытка переопределить const?
Проехали, ошибка компилятора это одно конст это другое.
Goodefine писал(а):
Neekeetos писал(а): unsigned char const - это должно быть таким const unsigned char...
Не путайте uchar const* var (или const uchar* var - что одно и тоже) и uchar* const var...
Указатель на константу определяется в единственно возможной форме "const uchar* var" вот так, а вариант с uchar const * var неверный, можно написать uchar * const var это будет константный указатель. Формат использования const такой - const T или Т const, где Т это тип переменной, целиком.
Информация по RLC mini находится >тут<
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18862
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

вот что сказано в стандарте С99:
The type designated as ‘‘float *’’ has type ‘‘pointer to float’’. Its type category is pointer, not a floating type. The const-qualified version of this type is designated as ‘‘float * const’’ whereas the type designated as ‘‘const float *’’ is not a qualified type — its type is ‘‘pointer to const-qualified float’’ and is a pointer to a qualified type.
на сколько я могу перевести, это означает следующее:
Тип, определенный как "float *" есть "указатель на float". Это тип категории "указатель", но не "float". Константный вариант этого типа определяется как "float * const", в то время как "const float *" не является константным указателем - это тип "указатель на константу float".
таким образом, имеем:
a) const uchar * var - указатель на const uchar (var не должна меняться, сам указатель может изменяться)
b) uchar * const var - неизменяемый указатель на uchar (указатель не должен меняться, var - может меняться)

то есть "расшифровка" типа переменной-указателя ведется справа налево

поправьте, если я ошибаюсь.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Давайте тему переименуем в "тонкости С++" :)
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Neekeetos писал(а): Указатель на константу определяется в единственно возможной форме "const uchar* var" вот так, а вариант с uchar const * var неверный...
Вот что по этому поводу пишет Страуструп:
const.gif
(74.72 КБ) 435 скачиваний
Поспорите с автором С++?...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

Goodefine писал(а):Вот что по этому поводу пишет Страуструп:
const.gif
Поспорите с автором С++?...
Про страуструпа могу сказать одно, для своих примеров он использует какую то жутко редкую модификацию компилятора не больно стандартную, собственно некоторые примеры из его книжки не работают в гнутом компиляторе. Сама книжка довольно стара, стандарт си свежее. Я ответил на твой вопрос/упрек?
Информация по RLC mini находится >тут<
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Neekeetos писал(а):...Я ответил на твой вопрос/упрек?
Начнем с того, что я никого не упрекал. Но имею желание узнать - где запрещено объявлять указатель на константу как uchar const* data. Или, хотя бы, предупреждение какого-то ни было мало-мальски приличного компилятора (MVS, GCC...). Пока ни того ни другого не было названо...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

Goodefine писал(а):
Neekeetos писал(а):...Я ответил на твой вопрос/упрек?
Начнем с того, что я никого не упрекал. Но имею желание узнать - где запрещено объявлять указатель на константу как uchar const* data. Или, хотя бы, предупреждение какого-то ни было мало-мальски приличного компилятора (MVS, GCC...). Пока ни того ни другого не было названо...
Тебе ARV привел кусок из актуального стандарта С где нету варианта с конст посреди типа. У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.
Информация по RLC mini находится >тут<
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Neekeetos писал(а):...Тебе ARV привел кусок из актуального стандарта С где нету варианта с конст посреди типа...
Ну и что с того что нет? Много чего можно написать, чего нет в стандарте в качестве примера.. Все что не запрещено - разрешено.
Neekeetos писал(а):... У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.
Да неужели узнаю? Вам, как знатоку ключиков компилятора, наверняка не составит труда на тестовом примере показать ошибку (или предупреждение хотя-бы), которую выдаст компилятор при таком объявлении. Иначе, при всем уважении, разговоры насчет ключиков и стандарта, просто треп...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

Goodefine писал(а):
Neekeetos писал(а):...Тебе ARV привел кусок из актуального стандарта С где нету варианта с конст посреди типа...
Ну и что с того что нет? Много чего можно написать, чего нет в стандарте в качестве примера.. Все что не запрещено - разрешено.
Ну не всегда так - в стандарте часто как раз пишется то, что разрешено.
Но в данном конкретном случае - ARV привёл фрагмент, где разъясняется смысл положения const относительно *, а не перечисляются варианты расположения const относительно, к примеру, float. В этом месте и не обязаны перечислять все варианты. Так что независимо от "разрешено что не запрещено" vs "запрещено что не разрешено" надо лезть по стандарту дальше.
А вот что разрешено - перечисляется в другом месте при помощи формальных описаний. Оно разбросано по тексту стандарта, компактно перечислено ещё и в приложении A. Language syntax summary с указанием разделов, где соответствующая часть описана подробнее.
A.2.2 Declarations
(6.7) declaration:
declaration-specifiers init-declarator-listopt ;
(6.7) declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
Это opt означает, что обозначаемая словом вещь опциональна, может отсутствовать.
Так что после type-qualifier могут отсутствовать эти declaration-specifiers, т.е. квалификатор может быть последним в списке declaration-specifiers
(6.7.2) type-specifier:
void
char
short
int
long
float
double
signed
unsigned
_Bool
_Complex
_Imaginary
struct-or-union-specifier
enum-specifier
typedef-name
Итого short, unsigned, int - равноправные слова, любое из них являетя спецификатором типа, порядок спецификаторов в declaration specifiers неопределён. Ну и до кучи список возможных квалификаторов.
(6.7.3) type-qualifier:
const
restrict
volatile
Исходя из процитированного я смею сдлать вывод, что стандарт C99 явно разрешает такие записи

Код: Выделить всё

volatile i = 1; // int by default
const j = 2; // int by default
int short const unsigned volatile u = 3;

void foo() {
        while( u == 3 );
}
avr-gcc --ansi --pedantic -O2 -S foo.c

Код: Выделить всё

        .text
.global foo
        .type   foo, @function
foo:
/* prologue: function */
/* frame size = 0 */
        lds r24,u
        lds r25,(u)+1
.L2:
        cpi r24,3
        cpc r25,__zero_reg__
        breq .L2
/* epilogue start */
        ret
        .size   foo, .-foo
.global i
        .data
        .type   i, @object
        .size   i, 2
i:
        .word   1
.global j
        .type   j, @object
        .size   j, 2
j:
        .word   2
.global u
        .type   u, @object
        .size   u, 2
u:
        .word   3
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

Neekeetos писал(а):нету варианта с конст посреди типа
Очень удивлюсь, если увижу компилятор, который
const int i;
const char * p;
и
int const i;
char const * p;
воспринимает по разному либо не воспринимает вторую форму вообще.
Neekeetos писал(а):У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.
Ну включил.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

avreal писал(а):
Neekeetos писал(а):У гнутого компилятора есть ключик разрешающий предупреждения если код не подходит под стандарт, включи , узнаешь много нового.
Ну включил.
Ну и что он написал? Все верно типы и модификаторы могут располагаться в произвольном порядке, так что я ошибался утверждая обратное :).
Информация по RLC mini находится >тут<
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

Neekeetos писал(а):Ну и что он написал?
Вся его выдача по --ansi --pedanitc по поводу расставленных произвольно квалификаторов и спецификатров процитирована выше.
Ну предупредил ещё на консоль, что i, j по умолчанию int
Neekeetos писал(а):так что я ошибался утверждая обратное :).
Это была ошибка типа "незнание", которая при желании может быть легко исправлена.
Но вот при этом советовать кому-то включить, не попробовав сначала сделать это самостоятельно - системная ошибка более глубокого уровня, которая может стать фатальной, если будет повторяться :-), и лечится это труднее.
Собственно, где-то там находится граница между чайником и лмером, так что осторожнее :-)


p.s. там ещё -Wall -Wextra было, но это как бы само собой.
--ansi --pedantic я включаю редко, обычно -std=gnu99
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»