|
|
  |
Вопрос по си |
|
|
|
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 =)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|