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

 
 
> Вопрос по си
Павел_Б
сообщение Jul 22 2011, 16:12
Сообщение #1


Местный
***

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



Здравствуйте.
Вопрос чисто по си.
Знаю что писалось уже тысячу раз, но отыскать так и не получилось sad.gif
есть некоторая переменная char temp
нужно условие что старшая тетрада (старшие четыре бита) например равнялись 2
тоесть что-то типа
Код
if (temp ?? 0x20) {}

как сделать?
Подскажите пожалуйста.
Что старшая тетрада равна 2
Спасибо!
Go to the top of the page
 
+Quote Post
5 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 63)
Палыч
сообщение Jul 22 2011, 16:17
Сообщение #2


Гуру
******

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



if ( (temp & 0xF0) == 0x20) {}
Go to the top of the page
 
+Quote Post
Hellper
сообщение Jul 22 2011, 16:19
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



(temp >> 4 ) == 2


--------------------
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Jul 22 2011, 16:22
Сообщение #4


Местный
***

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



Спасибо большое!!! rolleyes.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2011, 16:27
Сообщение #5


Гуру
******

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



QUOTE (Павел_Б @ Jul 22 2011, 18:12) *
Вопрос чисто по си.

Для чисто по 'C' есть буквари и на крайний случай раздел программирования для начинающих.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
777777
сообщение Jul 26 2011, 16:01
Сообщение #6


Профессионал
*****

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



Цитата(Hellper @ Jul 22 2011, 20:19) *
(temp >> 4 ) == 2

А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным.
Go to the top of the page
 
+Quote Post
Genius1
сообщение Jul 26 2011, 17:09
Сообщение #7


Участник
*

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



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

Из-за того, что тип char?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 26 2011, 19:20
Сообщение #8


Гуру
******

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



Цитата(Genius1 @ Jul 26 2011, 21:09) *
Из-за того, что тип char?
Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа).
Go to the top of the page
 
+Quote Post
Genius1
сообщение Jul 27 2011, 15:09
Сообщение #9


Участник
*

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



Цитата(Палыч @ Jul 26 2011, 22:20) *
Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа).

Ну я это и имел ввиду. Убедиться решил, что правильно думаю sm.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 27 2011, 16:21
Сообщение #10


Гуру
******

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


Местный
***

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



Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт.
То есть есть последовательность байт, например
......0x05 0x51 0x12 0x64 0xC0 0x66 0x41..................................................

И вот мне нужно найти начало последовательности 0x64 0xC0 0x66
Как это сделать? smile3046.gif
Спасибо за внимание.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 6 2011, 18:14
Сообщение #12


Гуру
******

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



Цитата(Павел_Б @ Aug 6 2011, 21:57) *
И вот мне нужно найти начало последовательности 0x64 0xC0 0x66
Как это сделать?
Для такой короткой последовательности наиболее оптимально решение "в лоб":
1. Ищется значение 0x64
2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1

Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 6 2011, 18:19
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 6 2011, 18:26
Сообщение #14


Гуру
******

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



Цитата(Павел_Б @ Aug 6 2011, 22:19) *
Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь
Да, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено.
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 6 2011, 18:27
Сообщение #15


Местный
***

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



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

Да, верно, это тоже нужно учесть!
Спасибо! sm.gif
Go to the top of the page
 
+Quote Post
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
Палыч
сообщение Aug 10 2011, 11:28
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 10 2011, 16:22
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



bb-offtopic.gif
а как в С сделать именно "roll" битов?
при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору?
операнд, разумеется, имеет разрядность МК
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 10 2011, 16:57
Сообщение #33


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

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



Цитата(toweroff @ Aug 10 2011, 20:22) *
bb-offtopic.gif
а как в С сделать именно "roll" битов?
при операциях << и >> дополняются нулями, а roll ? roll с флагом? Или, в очередной раз, отдаем на откуп оптимизатору?
операнд, разумеется, имеет разрядность МК

А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо.


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


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(MrYuran @ Aug 10 2011, 20:57) *
А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо.

ну и посему оффтопику офф sm.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 10 2011, 17:39
Сообщение #35


Профессионал
*****

Группа: Свой
Сообщений: 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));
}

Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 10 2011, 17:52
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(sergeeff @ Aug 10 2011, 21:39) *
Для примера:


во-во, я про эти конструкции и говорил. То есть, все нормально ляжет в асм?
но проверить надо )

кстати, а как оно там с флагом?
Go to the top of the page
 
+Quote Post
ARV
сообщение Aug 11 2011, 04:27
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 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)))


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 11 2011, 16:42
Сообщение #38


Местный
***

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



Уважаемые коллеги, возможно ли использование указателей на битовые переменные?


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 11 2011, 17:33
Сообщение #39


Гуру
******

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



Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Flexz
сообщение Aug 11 2011, 19:36
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Возможно, если архитектура поддерживает bit-banding.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 13 2011, 15:31
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 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

Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 13 2011, 15:38
Сообщение #42


;
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 13 2011, 16:56
Сообщение #43


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 13 2011, 20:11
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(дымок @ Aug 13 2011, 20:56) *
их было аж 42.

Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль sad.gif
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 14 2011, 10:18
Сообщение #45


Местный
***

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



Цитата(aaarrr @ Aug 14 2011, 02:11) *
Кабы их было 1-2 осознанно внесенных, тогда можно было бы сказать, что исправили. А так - просто вбили костыль sad.gif


Спасибо Вам за профессиональный "костыль". Просто у меня в программе около около десятка таких функций с подобными аргументами, потому и столько предупреждений.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 14 2011, 12:25
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(дымок @ Aug 14 2011, 14:18) *
Спасибо Вам за профессиональный "костыль". Просто у меня в программе около около десятка таких функций с подобными аргументами, потому и столько предупреждений.

Не должны потери квалификаторов измеряться десятками - скорее всего, это означает, что применены они не по делу.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 14 2011, 13:50
Сообщение #47


Местный
***

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



Цитата(aaarrr @ Aug 14 2011, 18:25) *
Не должны потери квалификаторов измеряться десятками - скорее всего, это означает, что применены они не по делу.


Я электронщик, программированием был вынужден заняться ибо без микроконтроллеров никуда. Отношу себя к начинающим, С изучал по учебному пособию Бредли Л.Джонса и Питера Эйткена. О передаче в функции адресов переменных в качестве аргументов описано весьма кратко. Если можно, укажите где можно почитать об этом более подробно. Спасибо.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 14 2011, 14:19
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_Pasha @ Aug 13 2011, 19:38) *
&akk1.ucon имеет тип void *

Откуда вдруг void *?

Цитата(дымок @ Aug 14 2011, 17:50) *
О передаче в функции адресов переменных в качестве аргументов описано весьма кратко. Если можно, укажите где можно почитать об этом более подробно.

Увы, учебную литературу не подскажу - как-то так получилось, что ничего, кроме стандарта и справочников, по "C" не читал sad.gif

Расскажите, как в программе объявлен akk1, и почему он объявлен именно так.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 14 2011, 14:58
Сообщение #49


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 14 2011, 15:03
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А volatile действительно нужен? (Сам факт использования объекта в прерывании не является безусловным к тому показанием.)
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 14 2011, 15:09
Сообщение #51


Местный
***

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



Цитата(aaarrr @ Aug 14 2011, 21:03) *
А volatile действительно нужен? (Сам факт использования объекта в прерывании не является безусловным к тому показанием.)


Скорее всего я использую его на всякий случай, а что он может быть проблемой в моёи случае?


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 14 2011, 15:17
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Так он, собственно, и вызывает ругань в 42-х местах.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 14 2011, 15:30
Сообщение #53


Местный
***

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



Цитата(aaarrr @ Aug 14 2011, 21:17) *
Так он, собственно, и вызывает ругань в 42-х местах.


Спасибо Вам, действительно volatile был всему виной.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 15 2011, 16:11
Сообщение #54


Местный
***

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



Очень прошу дать ответ на следующий вопрос, почему компилятор в WinAVR ругается на выражение типа: *cloc_prm++;
Однако при просмотре примеров других программ используются именно такие выражения.
Потому мне приходится использовать: *cloc_prm=*cloc_prm+1; в таком виде выражение принимается без проблем.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 15 2011, 16:26
Сообщение #55


Гуру
******

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



Из-за приоритета операций. В Вашем случае следует записывать (*cloc_prm)++
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 15 2011, 16:49
Сообщение #56


Местный
***

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



Цитата(Палыч @ Aug 15 2011, 22:26) *
Из-за приоритета операций. В Вашем случае следует записывать (*cloc_prm)++


Спасибо!


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 18 2011, 07:15
Сообщение #57


Профессионал
*****

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



Цитата(Павел_Б @ Aug 6 2011, 21:57) *
Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт.
То есть есть последовательность байт, например
......0x05 0x51 0x12 0x64 0xC0 0x66 0x41..................................................

И вот мне нужно найти начало последовательности 0x64 0xC0 0x66
Как это сделать? smile3046.gif
Спасибо за внимание.


Если нужен действительно наиболее оптимальный вариант, то это алгоритм Бойера-Мура
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 18 2011, 07:27
Сообщение #58


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

Группа: Свой
Сообщений: 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 =)
Go to the top of the page
 
+Quote Post
Smoky
сообщение Aug 18 2011, 15:42
Сообщение #59


Местный
***

Группа: Свой
Сообщений: 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;


На эти битовые поля можно использовать указатели?


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Aug 19 2011, 03:56
Сообщение #60


Местный
***

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


Даже если мы корову назовем тигром, то она все равно не перестанет быть коровой и не начнет есть мясо!!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 19 2011, 05:05
Сообщение #61


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

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



Цитата(alexeyv @ Aug 19 2011, 07:56) *
Вся эта ф_гня заменится предпроцессором и на вход компилятора все равно попадет:

Легким движением руки...
#define BIT_FIELD

Получаем структуру байтовых флагов. Пожалуйста, пользуйте указатели.
Конечно, в некотором смысле костыли, но при желании использовать можно.


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


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Получаем структуру байтовых флагов. Пожалуйста, пользуйте указатели.


Согласен, но это уже будут не битовые поля, а совсем другая история.................
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 19 2011, 18:38
Сообщение #63


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Нет указателя на бит в байте и нечего тут обсуждать.
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 20 2011, 19:40
Сообщение #64


Местный
***

Группа: Участник
Сообщений: 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]);
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:45
Рейтинг@Mail.ru


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