реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Вопрос по си
zltigo
сообщение Aug 6 2011, 18:42
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 6 2011, 18:53
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046



Цитата(zltigo @ Aug 6 2011, 21:42) *
А подумать головой совсем нельзя было?

Продолжайте дальше перебирать буквы и цифры, поскольку эти каракули, как минимум, неработоспособны, если массив начинается с искомой последовательности.

Благо что последовательность где-то находится через 7-мь и далее символов...
Голова на ночь совсем ни как smile3046.gif
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 6 2011, 20:57
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 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
$
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 7 2011, 02:56
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 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
$

Спасибо sm.gif
Go to the top of the page
 
+Quote Post
ветерок
сообщение Aug 7 2011, 05:28
Сообщение #20


Местный
***

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



Код
   DDRD = ~(1 << 2);

А вот эта строчка что делает ?


--------------------
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 7 2011, 06:58
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



выставляет в единицу все биты кроме бита 2, 11111011
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 7 2011, 09:11
Сообщение #22


Гуру
******

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



QUOTE (Idle @ Aug 6 2011, 22:57) *

Универсально, но в силу этого громоздко.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ветерок
сообщение Aug 7 2011, 09:31
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 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


--------------------
Go to the top of the page
 
+Quote Post
Genius1
сообщение Aug 7 2011, 17:18
Сообщение #24


Участник
*

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



Цитата(ветерок @ Aug 7 2011, 12:31) *
А что делает символ: ~ ?
А строчку (1 << 2)
Я понимал как взять единицу записать в младший разряд и сдвинуть влево на два бита .
Как так получилось что записать во все биты 1 ?
или (1 << 2) означает записать во все биты 1 кроме второго бита ?

~ - поразрядная инверсия.
так что ~(1<<2) - взять единицу, сдвинуть на 2 разряда влево и побитно проинвертировать результат
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Aug 8 2011, 01:50
Сообщение #25


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
Как это сделать? smile3046.gif
Спасибо за внимание.

Почему бы вам не почитать Кнута? Это все такие базовые вещи, что просто стыдно должно быть их спрашивать.

Цитата(777777 @ Jul 26 2011, 12:01) *
А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным.

Для арма такой способ эффективнее, т.к. в нем сдвиг в любой инструкции к аргументу бесплатно можно применять.
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 9 2011, 14:07
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046



Как правильно конвертировать шестнадцатиричное число в десятичное?
Другими словами.
Есть переменная int x
оно например имеет значение 1F
а мне нужно его преображзовать в 2 символа char (y,z). где x будет иметь значение 3, а z=1
то есть конвертировать hex в dec
Заранее спасибо всем откликнувшимся.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 9 2011, 14:51
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 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... Доработайте сами под Ваши нужды.
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 9 2011, 15:07
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 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 циклов тактового генератора. А вот чтение насколько быстро будет выполняться не знаю sad.gif
Спасибо.

Сообщение отредактировал Павел_Б - Aug 9 2011, 15:15
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 10 2011, 04:47
Сообщение #29


Беспросветный оптимист
******

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



Цитата(ветерок @ Aug 7 2011, 09:28) *
А вот эта строчка что делает ?

Скорее всего, имелось в виду DDRD &= ~(1 << 2);
Такая строчка сбрасывает нужный бит.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ветерок
сообщение Aug 10 2011, 11:14
Сообщение #30


Местный
***

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



Genius1 спасибо
MrYuran ,да точно там такая строка

(1 << 2)
то есть такой сдвиг двигает единичку а после себя ноль оставляет ?


--------------------
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 00:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016