|
Вопрос по си |
|
|
|
Jul 22 2011, 16:12
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Здравствуйте. Вопрос чисто по си. Знаю что писалось уже тысячу раз, но отыскать так и не получилось  есть некоторая переменная char temp нужно условие что старшая тетрада (старшие четыре бита) например равнялись 2 тоесть что-то типа Код if (temp ?? 0x20) {} как сделать? Подскажите пожалуйста. Что старшая тетрада равна 2 Спасибо!
|
|
|
|
|
 |
Ответов
(1 - 63)
|
Jul 26 2011, 17:09
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-05-08
Пользователь №: 37 515

|
Цитата(777777 @ Jul 26 2011, 19:01)  А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Из-за того, что тип char?
|
|
|
|
|
Jul 27 2011, 15:09
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-05-08
Пользователь №: 37 515

|
Цитата(Палыч @ Jul 26 2011, 22:20)  Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа). Ну я это и имел ввиду. Убедиться решил, что правильно думаю
|
|
|
|
|
Jul 27 2011, 16:21
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (777777 @ Jul 26 2011, 18:01)  А таким способом пользоваться не следует. Совершено нормальный способ. Надо смотреть, что эффективнее ложится на систему команд и оптимизируется. Для, например, старших тетрад 32битников подобный вариант предпочтительней. QUOTE Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Проблема ведь не в том, с чем сравнивать, а что сравнивать. Тут со знаком действительно проблема, но скорее всего, автору НУЖНО использовать вместо отданного на откуп компилятору типу char, unsigned тип. Кроме того, сейчас уже char по умолчанию обычно беззнаковый и компилятору можно указать использовать беззнаковый char. Ну или, если уж действительно вдруг нужна работа с signed char или с любым вариантом, то явные преобразования еще никто не отменял. (temp >> 4 ) == (char)0xF0 >> 4; будет работать всегда.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 6 2011, 17:57
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт. То есть есть последовательность байт, например ......0x05 0x51 0x12 0x64 0xC0 0x66 0x41.................................................. И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? Спасибо за внимание.
|
|
|
|
|
Aug 6 2011, 18:19
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(Палыч @ Aug 6 2011, 21:14)  Для такой короткой последовательности наиболее оптимально решение "в лоб": 1. Ищется значение 0x64 2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1 На словах я это представляю... Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь: temp=0; do {temp++;} while ((byte[temp] != 0x64) | (byte[(temp+1)] != 0xC0) | (byte[(temp+2)] != 0x66));
Сообщение отредактировал Павел_Б - Aug 6 2011, 18:20
|
|
|
|
|
Aug 6 2011, 18:27
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(Палыч @ Aug 6 2011, 21:26)  Да, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено. Да, верно, это тоже нужно учесть! Спасибо!
|
|
|
|
|
Aug 6 2011, 18:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Павел_Б @ Aug 6 2011, 20:19)  Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь: А подумать головой совсем нельзя было? QUOTE temp=0; do {temp++;} while ((byte[temp] != 0x64) | (byte[(temp+1)] != 0xC0) | (byte[(temp+2)] != 0x66)); Продолжайте дальше перебирать буквы и цифры, поскольку эти каракули, как минимум, неработоспособны, если массив начинается с искомой последовательности.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 6 2011, 18:53
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(zltigo @ Aug 6 2011, 21:42)  А подумать головой совсем нельзя было?
Продолжайте дальше перебирать буквы и цифры, поскольку эти каракули, как минимум, неработоспособны, если массив начинается с искомой последовательности. Благо что последовательность где-то находится через 7-мь и далее символов... Голова на ночь совсем ни как
|
|
|
|
|
Aug 6 2011, 20:57
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
CODE $ cat el.c #include <stdlib.h> #include <string.h> #include <assert.h>
static void *eqpos(const void *buf, size_t buflen, const void *s, size_t slen) { if (slen > buflen) return NULL; for (size_t i = 0; i <= (buflen - slen); i++) { char *pos = (char *)buf + i; if (memcmp(pos, s, slen) == 0) return pos; } return NULL; }
int main() { const char *buf = "deadbeefcafe"; size_t buflen = strlen(buf); const char *s;
s = "d"; assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));
s = "dead"; assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));
s = "none"; assert(NULL == eqpos(buf, buflen, s, strlen(s)));
s = "tooooooooooolarge"; assert(NULL == eqpos(buf, buflen, s, strlen(s)));
s = "cafe"; assert((buf + sizeof("deadbeef") - 1) == eqpos(buf, buflen, s, strlen(s)));
assert(buf == eqpos(buf, buflen, buf, buflen)); exit(EXIT_SUCCESS); } $ gcc el.c -Wall -g -O0 -std=gnu99 $ ./a.out $
|
|
|
|
|
Aug 7 2011, 02:56
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(Idle @ Aug 6 2011, 23:57)  CODE $ cat el.c #include <stdlib.h> #include <string.h> #include <assert.h>
static void *eqpos(const void *buf, size_t buflen, const void *s, size_t slen) { if (slen > buflen) return NULL; for (size_t i = 0; i <= (buflen - slen); i++) { char *pos = (char *)buf + i; if (memcmp(pos, s, slen) == 0) return pos; } return NULL; }
int main() { const char *buf = "deadbeefcafe"; size_t buflen = strlen(buf); const char *s;
s = "d"; assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));
s = "dead"; assert((buf + 0) == eqpos(buf, buflen, s, strlen(s)));
s = "none"; assert(NULL == eqpos(buf, buflen, s, strlen(s)));
s = "tooooooooooolarge"; assert(NULL == eqpos(buf, buflen, s, strlen(s)));
s = "cafe"; assert((buf + sizeof("deadbeef") - 1) == eqpos(buf, buflen, s, strlen(s)));
assert(buf == eqpos(buf, buflen, buf, buflen)); exit(EXIT_SUCCESS); } $ gcc el.c -Wall -g -O0 -std=gnu99 $ ./a.out $
Спасибо
|
|
|
|
|
Aug 7 2011, 05:28
|

Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 29-11-06
Из: Ижевск
Пользователь №: 22 902

|
Код DDRD = ~(1 << 2); А вот эта строчка что делает ?
--------------------
|
|
|
|
|
Aug 7 2011, 09:31
|

Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 29-11-06
Из: Ижевск
Пользователь №: 22 902

|
Цитата(Idle @ Aug 7 2011, 10:58)  выставляет в единицу все биты кроме бита 2, 11111011 А что делает символ: ~ ? А строчку (1 << 2) Я понимал как взять единицу записать в младший разряд и сдвинуть влево на два бита . Как так получилось что записать во все биты 1 ? или (1 << 2) означает записать во все биты 1 кроме второго бита ?
Сообщение отредактировал ветерок - Aug 7 2011, 09:32
--------------------
|
|
|
|
|
Aug 7 2011, 17:18
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-05-08
Пользователь №: 37 515

|
Цитата(ветерок @ Aug 7 2011, 12:31)  А что делает символ: ~ ? А строчку (1 << 2) Я понимал как взять единицу записать в младший разряд и сдвинуть влево на два бита . Как так получилось что записать во все биты 1 ? или (1 << 2) означает записать во все биты 1 кроме второго бита ? ~ - поразрядная инверсия. так что ~(1<<2) - взять единицу, сдвинуть на 2 разряда влево и побитно проинвертировать результат
|
|
|
|
|
Aug 8 2011, 01:50
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Павел_Б @ Aug 6 2011, 13:57)  Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт. То есть есть последовательность байт, например ......0x05 0x51 0x12 0x64 0xC0 0x66 0x41.................................................. И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? Спасибо за внимание. Почему бы вам не почитать Кнута? Это все такие базовые вещи, что просто стыдно должно быть их спрашивать. Цитата(777777 @ Jul 26 2011, 12:01)  А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Для арма такой способ эффективнее, т.к. в нем сдвиг в любой инструкции к аргументу бесплатно можно применять.
|
|
|
|
|
Aug 9 2011, 14:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Павел_Б @ Aug 9 2011, 18:07)  нужно его преображзовать в 2 символа char (y,z). где x будет иметь значение 3, а z=1 В Вашем трансляторе отсутствует функция sprintf? Правда, она очень прожорлива к ресурсам МК... Для Вашего случая и собственную функцию написать не сложно. Что-то типа такого: Код int x; char s[2]; s[0]= x/10 + '0'; s[1]= x%10 + '0'; Здесь отсутствует проверка на знак числа х. Кроме того, не подавляется первый ноль, в случае если число х<10, и выдаст неверный результат, если x>99... Доработайте сами под Ваши нужды.
|
|
|
|
|
Aug 9 2011, 15:07
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(Палыч @ Aug 9 2011, 18:51)  В Вашем трансляторе отсутствует функция sprintf? Правда, она очень прожорлива к ресурсам МК... Для Вашего случая и собственную функцию написать не сложно. Что-то типа такого: Код int x; char s[2]; s[0]= x/10 + '0'; s[1]= x%10 + '0'; Здесь отсутствует проверка на знак числа х. Кроме того, не подавляется первый ноль, в случае если число х<10, и выдаст неверный результат, если x>99... Доработайте сами под Ваши нужды. Да, спасибо огромное. Тут ещё вопрос назрел. Как мне явно указать ячейку памяти в eeprom? Тоесть в программе будет меняться значение переменной в eeprom. После включения мк должен считать значение из этой ячейки. В связи с чем вопрос. Если я просто укажу ячейку как eeprom char j; И в программе она сменит значение. После нового включения я считаю значение переменной j из eeprom - она возъмёт из той же ячейки? И правильно ли будет такой алгоритм. Есть таже переменная в памяти eeprom. В обработчике прерываний таймера который работает на высокой скорости я пишу, например: if (j==0) {zz = 0;} else {zz = 1;} Просто насколько мне известно запись в eeprom занимает более 100 циклов тактового генератора. А вот чтение насколько быстро будет выполняться не знаю  Спасибо.
Сообщение отредактировал Павел_Б - Aug 9 2011, 15:15
|
|
|
|
|
Aug 10 2011, 04:47
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ветерок @ Aug 7 2011, 09:28)  А вот эта строчка что делает ? Скорее всего, имелось в виду DDRD &= ~(1 << 2); Такая строчка сбрасывает нужный бит.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 10 2011, 11:28
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(ветерок @ Aug 10 2011, 15:14)  (1 << 2) то есть такой сдвиг двигает единичку а после себя ноль оставляет ? Да, загляните уж в какой нибудь учебник по языку С! DDRD &= ~(1 << 2); 1. Десятичная константа 1. Двоичное представление 00000001 2. (1<<2) Сдвиг константы влево на 2. Получаем 00000100 3. ~(1<<2) Побитовая инверсия = 11111011 4. DDRD &= ~(1 << 2) Это эквивалентно такой записи DDRD = DDRD & ( ~(1 << 2)). Если значение битов DDRD равно (х7)(х6)(х5)(х4)(х3)(х2)(х1)(х0), то после побитового логического умножения на 11111011 получаем результат (х7)(х6)(х5)(х4)(х3)( 0)(х1)(х0), который и заносится в DDRD. Т.е. фактически - сбрасывается в ноль второй бит регистра DDRD.
|
|
|
|
|
Aug 10 2011, 17:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(MrYuran @ Aug 10 2011, 20:57)  А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо. Да бросьте вы только про asm inline. Для примера: Код __inline BYTE RotateByteLeft(BYTE n, unsigned long i) { return (n << i) | (n >> (8 - i)); }
__inline BYTE RotateByteRight(BYTE n, unsigned long i) { return (n >> i) | (n << (8 - i)); }
|
|
|
|
|
Aug 11 2011, 04:27
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(sergeeff @ Aug 10 2011, 20:39)  Для примера: Код __inline BYTE RotateByteLeft(BYTE n, unsigned long i) { return (n << i) | (n >> (8 - i)); }
__inline BYTE RotateByteRight(BYTE n, unsigned long i) { return (n >> i) | (n << (8 - i)); } или так: Код #define ROR(x,y) (((x) >> (y)) | ((x) << ((sizeof(x)*8 - (y)))
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Aug 13 2011, 15:31
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(zltigo @ Aug 11 2011, 23:33)  Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно. Забыл сказать что я использую WinAVR. Жаль что Вы уклонились от ответа, в принципе я пробовал, не получилось. Потому мой ответ на мой вопрос отрицательный. void detect_akk(byte *flag_prm,byte *indakk_prm,word *cloc_prm); 1064: case 1: detect_akk(&akk1.ucon,&akk1.index,&akk1.cloc1);break; ../Mcuzuaa.c:1064: warning: passing argument 1 of 'detect_akk' discards qualifiers from pointer target type ../Mcuzuaa.c:1064: warning: passing argument 2 of 'detect_akk' discards qualifiers from pointer target type ../Mcuzuaa.c:1064: warning: passing argument 3 of 'detect_akk' discards qualifiers from pointer target type Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов.
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 13 2011, 15:38
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(дымок @ Aug 13 2011, 18:31)  Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов. &akk1.ucon имеет тип void * Параметры же другого типа. Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров.
Сообщение отредактировал _Pasha - Aug 13 2011, 15:38
|
|
|
|
|
Aug 13 2011, 16:56
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(_Pasha @ Aug 13 2011, 21:38)  &akk1.ucon имеет тип void * Параметры же другого типа. Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров. Большое Вам спасибо, исправил и все предупреждения исчезли, а их было аж 42.
Сообщение отредактировал дымок - Aug 13 2011, 16:58
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 14 2011, 13:50
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(aaarrr @ Aug 14 2011, 18:25)  Не должны потери квалификаторов измеряться десятками - скорее всего, это означает, что применены они не по делу. Я электронщик, программированием был вынужден заняться ибо без микроконтроллеров никуда. Отношу себя к начинающим, С изучал по учебному пособию Бредли Л.Джонса и Питера Эйткена. О передаче в функции адресов переменных в качестве аргументов описано весьма кратко. Если можно, укажите где можно почитать об этом более подробно. Спасибо.
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 14 2011, 14:19
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(_Pasha @ Aug 13 2011, 19:38)  &akk1.ucon имеет тип void * Откуда вдруг void *? Цитата(дымок @ Aug 14 2011, 17:50)  О передаче в функции адресов переменных в качестве аргументов описано весьма кратко. Если можно, укажите где можно почитать об этом более подробно. Увы, учебную литературу не подскажу - как-то так получилось, что ничего, кроме стандарта и справочников, по "C" не читал  Расскажите, как в программе объявлен akk1, и почему он объявлен именно так.
|
|
|
|
|
Aug 14 2011, 14:58
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(aaarrr @ Aug 14 2011, 20:19)  Расскажите, как в программе объявлен akk1, и почему он объявлен именно так. Переменная akk1 объявлена глобально как структура, почему именно так? Скорее всего исходя из предыдущего опыта: volatile struct { byte index; byte numprg; byte capind; byte ucon; byte hitmpr; byte error; byte outzrz; word maxvlt; word captr; word cloc1; word cloc2; word tmpair; dword sumcap; }akk1;
Сообщение отредактировал дымок - Aug 14 2011, 15:03
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 14 2011, 15:09
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(aaarrr @ Aug 14 2011, 21:03)  А volatile действительно нужен? (Сам факт использования объекта в прерывании не является безусловным к тому показанием.) Скорее всего я использую его на всякий случай, а что он может быть проблемой в моёи случае?
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 14 2011, 15:30
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(aaarrr @ Aug 14 2011, 21:17)  Так он, собственно, и вызывает ругань в 42-х местах. Спасибо Вам, действительно volatile был всему виной.
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 15 2011, 16:49
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(Палыч @ Aug 15 2011, 22:26)  Из-за приоритета операций. В Вашем случае следует записывать (*cloc_prm)++ Спасибо!
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 18 2011, 07:15
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Павел_Б @ Aug 6 2011, 21:57)  Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт. То есть есть последовательность байт, например ......0x05 0x51 0x12 0x64 0xC0 0x66 0x41.................................................. И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? Спасибо за внимание. Если нужен действительно наиболее оптимальный вариант, то это алгоритм Бойера-Мура
|
|
|
|
|
Aug 18 2011, 07:27
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(дымок @ Aug 13 2011, 19:31)  Забыл сказать что я использую WinAVR. Жаль что Вы уклонились от ответа, в принципе я пробовал, не получилось. Потому мой ответ на мой вопрос отрицательный. Код typedef unsigned char volatile event; #define BIT_FIELD :1
typedef struct stEvents { event Event1 BIT_FIELD ; event Event2 BIT_FIELD ; event Event3 BIT_FIELD ; event Event4 BIT_FIELD ; } stEvents; Встречал и такие варианты: Код typedef char bool; #define true 1 #define false 0
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 18 2011, 15:42
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(MrYuran @ Aug 18 2011, 13:27)  Код typedef unsigned char volatile event; #define BIT_FIELD :1
typedef struct stEvents { event Event1 BIT_FIELD; event Event2 BIT_FIELD; event Event3 BIT_FIELD; event Event4 BIT_FIELD; } stEvents; На эти битовые поля можно использовать указатели?
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 19 2011, 03:56
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата На эти битовые поля можно использовать указатели? Ни на какме битовые поля нельзя использовать указатели. Указатель содержит только адрес памяти. А на битовое поле необходимо еще его положение в байте и его длину. Где это все хранить? Код typedef unsigned char volatile event; #define BIT_FIELD :1
typedef struct stEvents { event Event1 BIT_FIELD; event Event2 BIT_FIELD; event Event3 BIT_FIELD; event Event4 BIT_FIELD; } stEvents; Вся эта ф_гня заменится предпроцессором и на вход компилятора все равно попадет: Код typedef struct stEvents { unsigned char Event1 :1; unsigned char Event2 :1; unsigned char Event3 :1; unsigned char Event4 :1; } stEvents; Даже если мы корову назовем тигром, то она все равно не перестанет быть коровой и не начнет есть мясо!!
|
|
|
|
|
Aug 19 2011, 05:05
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(alexeyv @ Aug 19 2011, 07:56)  Вся эта ф_гня заменится предпроцессором и на вход компилятора все равно попадет: Легким движением руки... #define BIT_FIELD Получаем структуру байтовых флагов. Пожалуйста, пользуйте указатели. Конечно, в некотором смысле костыли, но при желании использовать можно.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Aug 19 2011, 10:25
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата Получаем структуру байтовых флагов. Пожалуйста, пользуйте указатели. Согласен, но это уже будут не битовые поля, а совсем другая история.................
|
|
|
|
|
Aug 20 2011, 19:40
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(Idle @ Aug 7 2011, 00:57)  пардону просим: CODE --- el.c.a 2011-08-20 23:22:43.247702288 +0400 +++ el.c 2011-08-20 23:21:54.836310902 +0400 @@ -7,7 +7,7 @@ if (slen > buflen) return NULL; for (size_t i = 0; i <= (buflen - slen); i++) { - char *pos = (char *)buf + i; + int8_t *pos = (int8_t *)buf + i; if (memcmp(pos, s, slen) == 0) return pos; } да, подкиньте мне пример использования ptrdiff_t вместо неправильного использования вместо него других типов, типа CODE size_t slen = strlen(some_outerspace_string); for (size_t i = 0; i < slen; i++) printf("%c\n", some_outerspace_string[i]);
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|