zltigo 2 6 августа, 2011 Опубликовано 6 августа, 2011 · Жалоба Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь: А подумать головой совсем нельзя было? temp=0; do {temp++;} while ((byte[temp] != 0x64) | (byte[(temp+1)] != 0xC0) | (byte[(temp+2)] != 0x66)); Продолжайте дальше перебирать буквы и цифры, поскольку эти каракули, как минимум, неработоспособны, если массив начинается с искомой последовательности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 6 августа, 2011 Опубликовано 6 августа, 2011 · Жалоба А подумать головой совсем нельзя было? Продолжайте дальше перебирать буквы и цифры, поскольку эти каракули, как минимум, неработоспособны, если массив начинается с искомой последовательности. Благо что последовательность где-то находится через 7-мь и далее символов... Голова на ночь совсем ни как :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 6 августа, 2011 Опубликовано 6 августа, 2011 · Жалоба $ 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 $ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 7 августа, 2011 Опубликовано 7 августа, 2011 · Жалоба $ 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 $ Спасибо :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ветерок 0 7 августа, 2011 Опубликовано 7 августа, 2011 · Жалоба DDRD = ~(1 << 2); А вот эта строчка что делает ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 7 августа, 2011 Опубликовано 7 августа, 2011 · Жалоба выставляет в единицу все биты кроме бита 2, 11111011 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 7 августа, 2011 Опубликовано 7 августа, 2011 · Жалоба Универсально, но в силу этого громоздко. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ветерок 0 7 августа, 2011 Опубликовано 7 августа, 2011 (изменено) · Жалоба выставляет в единицу все биты кроме бита 2, 11111011 А что делает символ: ~ ? А строчку (1 << 2) Я понимал как взять единицу записать в младший разряд и сдвинуть влево на два бита . Как так получилось что записать во все биты 1 ? или (1 << 2) означает записать во все биты 1 кроме второго бита ? Изменено 7 августа, 2011 пользователем ветерок Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Genius1 0 7 августа, 2011 Опубликовано 7 августа, 2011 · Жалоба А что делает символ: ~ ? А строчку (1 << 2) Я понимал как взять единицу записать в младший разряд и сдвинуть влево на два бита . Как так получилось что записать во все биты 1 ? или (1 << 2) означает записать во все биты 1 кроме второго бита ? ~ - поразрядная инверсия. так что ~(1<<2) - взять единицу, сдвинуть на 2 разряда влево и побитно проинвертировать результат Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 8 августа, 2011 Опубликовано 8 августа, 2011 · Жалоба Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт. То есть есть последовательность байт, например ......0x05 0x51 0x12 0x64 0xC0 0x66 0x41.................................................. И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? :smile3046: Спасибо за внимание. Почему бы вам не почитать Кнута? Это все такие базовые вещи, что просто стыдно должно быть их спрашивать. А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Для арма такой способ эффективнее, т.к. в нем сдвиг в любой инструкции к аргументу бесплатно можно применять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 9 августа, 2011 Опубликовано 9 августа, 2011 · Жалоба Как правильно конвертировать шестнадцатиричное число в десятичное? Другими словами. Есть переменная int x оно например имеет значение 1F а мне нужно его преображзовать в 2 символа char (y,z). где x будет иметь значение 3, а z=1 то есть конвертировать hex в dec Заранее спасибо всем откликнувшимся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 9 августа, 2011 Опубликовано 9 августа, 2011 · Жалоба нужно его преображзовать в 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... Доработайте сами под Ваши нужды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 9 августа, 2011 Опубликовано 9 августа, 2011 (изменено) · Жалоба В Вашем трансляторе отсутствует функция 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 циклов тактового генератора. А вот чтение насколько быстро будет выполняться не знаю :( Спасибо. Изменено 9 августа, 2011 пользователем Павел_Б Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба А вот эта строчка что делает ? Скорее всего, имелось в виду DDRD &= ~(1 << 2); Такая строчка сбрасывает нужный бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ветерок 0 10 августа, 2011 Опубликовано 10 августа, 2011 · Жалоба Genius1 спасибо MrYuran ,да точно там такая строка (1 << 2) то есть такой сдвиг двигает единичку а после себя ноль оставляет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться