Вопросы по С/С++ (СИ)
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
боже ж мой, ну сколько можно... все бы вам готовенькое...
ну вот, например, поищите книгу Алена Голуба "Веревка достаточной длины, чтобы выстрелить себе в ногу"
но кроме этой есть и другие - ищите по ключевым словам "качественный код", "искусство написания программ" и т.п. - то есть ищите то, к чему хотите стремиться (если хотите, конечно)
ну вот, например, поищите книгу Алена Голуба "Веревка достаточной длины, чтобы выстрелить себе в ногу"
но кроме этой есть и другие - ищите по ключевым словам "качественный код", "искусство написания программ" и т.п. - то есть ищите то, к чему хотите стремиться (если хотите, конечно)
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопросы по С/С++ (СИ)
Добрый день.
подскажите пож. как поделить переменную unsigned int на байты для передачи по RS232?
и как собрать эти 2 байта в unsigned int после приема?
--
спасибо
подскажите пож. как поделить переменную unsigned int на байты для передачи по RS232?
и как собрать эти 2 байта в unsigned int после приема?
--
спасибо
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Вопросы по С/С++ (СИ)
Вариантов куча, например так:
Код: Выделить всё
int var;
char byte1, byte2;
byte1 = var >> 8;
byte2 = var;
Обратно:
var = (byte1 << 8) + byte2;- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Мастер Ломастер писал(а):перечисление для чисел от -12 до 130 хотя и можно при помощи enum-а, но, согласитесь, очень трудоемко.
А в чем собственно трудоемкость будет заключаться? Есть более простые методы? )
А в чем отличие енумов для Си(99) и Си++?
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
C++ я знаю очень плохо, но вроде как там есть возможность задавать типы-перечислители в таком виде типа -12...130, что в Си не возможно... хотя я могу быть и не прав.
ну а трудоемкость - это набить сотню-другую констант вручную
ну а трудоемкость - это набить сотню-другую констант вручную
битва с дураками проиграна, победители торжествуют. слава победителям!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Вопросы по С/С++ (СИ)
Как пользоваться перечислением, заданным в виде -12..130, как имена-то будут выглядеть в этом случае? не встречал такого, все ручками забивается.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
BerZerK-ku писал(а):Как пользоваться перечислением, заданным в виде -12..130, как имена-то будут выглядеть в этом случае? не встречал такого, все ручками забивается.
тем хуже для С++
битва с дураками проиграна, победители торжествуют. слава победителям!
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Мы вроде говорим о чем-то разном 
Для перечисления в любом случае надо задавать имена. Или Паскаль умеет читать мысли и сам придумывает имена константам?)
Для перечисления в любом случае надо задавать имена. Или Паскаль умеет читать мысли и сам придумывает имена константам?)
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Дык как бы перечисления с Паскале (а точнее множества, эти ваши -12..130) и Си++ реализованы для разных целей. В паскале это массив бит, каждый из которых описывает включённость в это множество какого либо объекта. В Си++ это, если можно так сказать, средство инкапсуляции: типу перечисления можно задать ряд предопределённых, обычно осмысленных, значений, но при компиляции это всё всё равно преобразуется к целому типу, которому присваиваются целые значения, соответствующие автоматически по порядку выбранным для осмысленнозаданных.
А множеств в Си++ вроде нету... Хотя, что стоит написать библиотеку для работы с ними? Всё равно, с последних версиях C++ даже тип int - класс со своим конструктором.
А множеств в Си++ вроде нету... Хотя, что стоит написать библиотеку для работы с ними? Всё равно, с последних версиях C++ даже тип int - класс со своим конструктором.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
я говорю о ТИПЕ данных, а вы о чем? в частности, я в Си использую перечисления в том числе и так:BCluster писал(а):Мы вроде говорим о чем-то разном
Код: Выделить всё
typedef enum{
VALUE1 = 0,
VALUE2 = 22,
VALUE3
} enum_type;
enum_type my_var;если прочтете антологию вопроса, то обнаружите, что перечисления я припомнил в контексте контроля типов для параметров функций, вариантов switch и т.п. вещей, помогающих избежать ошибок. конечно, это, по сравнению с паскалевскими типами, костыль, но лучше, чем совсем ничего...
сами по себе перечисления в виде набора констант никому не нужны - с этим успешно справляются дефайны.
битва с дураками проиграна, победители торжествуют. слава победителям!
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Мастер Ломастер писал(а):я говорю о ТИПЕ данных, а вы о чем? в частности, я в Си использую перечисления в том числе и так:
Я говорю о перечислениях как о перечислениях
Как типы данных мне они неинтересны как раз сейчас. Может когда-то и пригодятся, но вряд ли
В паскале эта фигня называется "множества" если мне не изменяет память ) Но сейчас обсуждать чем паскаль хуже си и чем лучше думаю не стоит )
Мастер Ломастер писал(а):сами по себе перечисления в виде набора констант никому не нужны - с этим успешно справляются дефайны.
Ну вам может и справляются, а мне как то удобнее с енумами. Если учесть что у меня их сотни в проекте, дефайнов были бы тысячи, никак не систематизированных, ужс
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
скажите, чем таким положительным отличаетсяот?
как второй вариант облегчает вам жизнь? где тут структуризация, систематизация и т.п. вещи, которые чем-то помогают? разве что у вас IDE с автосворачиванием блоков {} - но извините, это совершенно не то
обычные дефайны, размещенные по логически разделенным заголовочным файлам ничуть не хуже систематизированы 
а вот чем хорош мой подход. допустим, я объявил типя планирую использовать переменные и т.п. вещи этого типа для работы с кодами кнопок - это следует из наименования типа. теперь я пишу така затем где-то в недрахи вот тут - СМОТРИТЕ!!! - происходит WARNING компилятора, звучащий в "переводе" так: "эй, программист! ты в switch-е не все возможные варианты значений функции перебрал!!!" скажите, без использования ТИПА-ПЕРЕЧИСЛЕНИЯ можно получить такое напоминание? согласитесь, что если вы пишите программу, где в перечислении имеется хотя бы десяток вариантов - совсем не лишним будет получить такой варнинг в случае, если что-то забыли, не так ли? аналогичные варнинги я буду получать и с указателями на этот тип, и с параметрами функций и т.п. - все это страхует от ошибок.
самые трудноуловимые ошибки (после работы с НЕТИПИЗОВАННЫМИ указателями) в Си связаны именно с тем фактом, что по стандарту этот язык прощает любые вольности с типами переменных! а мой подход хоть на капельку уменьшает эту неприятность
жалко лишь, что в упомянутой функции ничто не запретит вернуть, например, 12, и никакой варнинг при этом не всплывет
но это Си...
Код: Выделить всё
#define CONST1 1
#define CONST2 2
#define CONST3 3Код: Выделить всё
enum{
CONST1 = 1,
CONST2 = 2,
CONST3 = 3
}как второй вариант облегчает вам жизнь? где тут структуризация, систематизация и т.п. вещи, которые чем-то помогают? разве что у вас IDE с автосворачиванием блоков {} - но извините, это совершенно не то
а вот чем хорош мой подход. допустим, я объявил тип
Код: Выделить всё
typedef enum{
KEY_1 = 1,
KEY_2 = 2,
KEY_3 = 3
} KEYCODES;Код: Выделить всё
KEYCODES get_key(void);Код: Выделить всё
switch(get_key()){
case KEY_1:
// что-то там
break;
case KEY_2:
// другое что-то там
break;
}самые трудноуловимые ошибки (после работы с НЕТИПИЗОВАННЫМИ указателями) в Си связаны именно с тем фактом, что по стандарту этот язык прощает любые вольности с типами переменных! а мой подход хоть на капельку уменьшает эту неприятность
жалко лишь, что в упомянутой функции ничто не запретит вернуть, например, 12, и никакой варнинг при этом не всплывет
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Вопросы по С/С++ (СИ)
Попробуй так:
Пропал ворнинг?
Код: Выделить всё
switch(get_key()){
case KEY_1:
// что-то там
break;
case KEY_2:
// другое что-то там
break;
//.............................................
//скоко надо другого чего-то там и напоследок самое вкусное:
default:
//unexpected key
break;
}Пропал ворнинг?

-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Вопросы по С/С++ (СИ)
Вообще enum лучше записывать по возможности так:Мастер Ломастер писал(а):скажите, чем таким положительным отличается
Код:
#define CONST1 1
#define CONST2 2
#define CONST3 3
от
Код:
enum{
CONST1 = 1,
CONST2 = 2,
CONST3 = 3
}
?
Код: Выделить всё
enum{
CONST1 = 1,
CONST2,
CONST3
...
CONSTN
}-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
phenomen писал(а):Пропал ворнинг?
если вы считаете, что программу надо писать так, чтобы не было ворнингов - вы правы, но только при условии, что ворнингов нет потому, что нет проблем, а не потому, что вы прикостылили заплатку
во-первых, такая запись - довольно редкий частный случай для последовательных констант, а, например, для упомянутого мною случая с кодами кнопок последовательность кодов вовсе не обязательна и скорее всего нерациональна.BerZerK-ku писал(а):Вообще enum лучше записывать по возможности так:Мастер Ломастер писал(а):скажите, чем таким положительным отличается
Код:
#define CONST1 1
#define CONST2 2
#define CONST3 3
от
Код:
enum{
CONST1 = 1,
CONST2 = 2,
CONST3 = 3
}
?В этом случае преимущество сразу же проявляется. Например, вы добавили CONST2_1 между 2 и 3. В дефайнах вам придется перебивать все последующие значения ручками.Код: Выделить всё
enum{
CONST1 = 1,
CONST2,
CONST3
...
CONSTN
}
во-вторых, в чем же преимущество? для последовательных констант совершенно безразлично, куда добавлять новые: МЕЖДУ предыдущими или В КОНЦЕ. очевидно, что продефайнить новую константу В КОНЦЕ ничуть не сложнее, чем в пустом enum.
в третьих, повторяю для упертых: смысл в ТИПЕ данных, а не enum-е, т.к. в С99 есть зачатки контроля типов, но никак не перечислений.
битва с дураками проиграна, победители торжествуют. слава победителям!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Вопросы по С/С++ (СИ)
Если честно, ничего не понял из вашего сообщения. У enum есть не мало достоинств по сравнению с дефайнами, а недостатков вроде бы и нет.
Пример из реальной программы :
1. Согласно данному порядку есть массив параметров. Возникла ситуация, надо добавить пару параметров DELAY_1, DELAY_2 (а это обычное дело). Добавлять их в конец перечисления/массива параметров не есть красиво и наглядно. Соответственно в enum втыкаются пара имен и в массив в том месте добавляются нужные параметры. И не надо ничего переименовывать в enum. По-моему удобно.
2. Присваивая значение элементу перечисления / дефайну можно ошибиться и написать уже имеющееся значение, и никаких предупреждений вы не получите. Если есть возможность застраховаться, то почему бы не сделать этого?
3. Ну и подсказка не последнее в этом деле, даже в убогом редакторе IAR можно отобразить элементы перечисления. Что удобнее чем куча дефайнов.
Пример из реальной программы :
Код: Выделить всё
enum eMENUparamDef
{
PARAM_DEF_TYPE_DEF = 0,
PARAM_DEF_TYPE_LINE,
PARAM_DEF_TIME_NO_MAN,
PARAM_DEF_LINE_DELAY,
PARAM_DEF_PULSE_OVERLAP,
PARAM_DEF_PULSE_OVERLAP_1,
PARAM_DEF_PULSE_OVERLAP_2,
PARAM_DEF_RZ_DECREASE,
PARAM_DEF_CF_DECREASE,
PARAM_DEF_PRD_FREQ,
PARAM_DEF_PRM_FREQ,
PARAM_DEF_END
};2. Присваивая значение элементу перечисления / дефайну можно ошибиться и написать уже имеющееся значение, и никаких предупреждений вы не получите. Если есть возможность застраховаться, то почему бы не сделать этого?
3. Ну и подсказка не последнее в этом деле, даже в убогом редакторе IAR можно отобразить элементы перечисления. Что удобнее чем куча дефайнов.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
ничего, это бывает. прочтите больше одного раза, должно помочьBerZerK-ku писал(а):Если честно, ничего не понял из вашего сообщения.
из вашего последнего поста только второй пункт заслуживает внимания. действительно, дефайны с одинаковыми значениями никак не могут быть проконтролированы. это минус.
все прочее - это попытка натянуть штаны на голову. красиво и наглядно? так я не против - чем typedef enum в данном контектсе хуже? редактор IAR-а что-то там умеет? да какой редактор не умеет?! я, например, группирую имена дефайнов по префиксам, например, команды - CMD_, события - EV_ и т.д., и редактор Eclipse после ввода CMD_ и нажатия Ctrl-Space отлично показывает мне ВСЕ дефайны, начинающиеся с этой последовательности. удачный редактор - не аргумент за достоинства конструкции языка Си. вы что, не понимаете, что я говорю совсем о другом?! я говорю о том, как enum реально помогает избегать ошибок в программах! а вы мне про удобство добавления пунктов... я вам про теплое - вы про мягкое. одно другому не помеха и не конкурент.
битва с дураками проиграна, победители торжествуют. слава победителям!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Вопросы по С/С++ (СИ)
Был вопрос "чем положительным отличается запись и т.д." , я привел положительные стороны enum по сравнению с define. С пользой проверки даже и не думал спорить
к сожалению его редактор не далеко ушел от блокнота, и это не было сказано во славу IAR
Мастер Ломастер писал(а):редактор IAR-а что-то там умеет? да какой редактор не умеет?!
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
достоинств enum-а по сравнению с набором дефайновых констант никто и не оспаривал. вопрос "чем лучше" был задан скорее риторически, потому как достоинства эти очень невелики. постарайтесь вникать в суть проблемы, а не цепляться на косвенных моментах - диалог может быть более продуктивным.
битва с дураками проиграна, победители торжествуют. слава победителям!
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: Вопросы по С/С++ (СИ)
Кто цеплялся?! Не выдавайте желаемое за действительное. Был вопрос, был ответ, чего не так-то
Тем более, что "как второй вариант облегчает вам жизнь? где тут структуризация, систематизация и т.п. вещи, которые чем-то помогают?" ну никак не похоже на риторические вопросы.
Есть не мало ситуаций когда от проверки enum толка нет, а вот другие , пусть и не значительные, достоинства себя проявляют. Почему бы не упомянуть о них?
Тем более, что "как второй вариант облегчает вам жизнь? где тут структуризация, систематизация и т.п. вещи, которые чем-то помогают?" ну никак не похоже на риторические вопросы.Есть не мало ситуаций когда от проверки enum толка нет, а вот другие , пусть и не значительные, достоинства себя проявляют. Почему бы не упомянуть о них?
Последний раз редактировалось BerZerK-ku Вт янв 17, 2012 09:44:36, всего редактировалось 1 раз.
