Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

shads писал(а):

Код: Выделить всё


        if    
(BtnPressWait1Sec() & ShortUp)
 

     как еще завставить компилятор не тупить так, оптимизацию чет тоже неохота отключать.....

если эти переменные используются не только в одном месте,( например в прерывании и в основном цикле) тогда лучше переменную объявить как volatile, а не городить новые переменные и портить свободное время процессора.
В вашем случае непонятно что там за переменные появляются после функции.
В поисках истины человек развивается.
Реклама
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

shads писал(а):Пришлось туда пихнуть volatile переменную
volatile надо было пихать не тут, а где-то к переменным, читаемым в BtnPressWait1Sec()
Если переменная, в которой отражаются нажимаемые кнопки илди время таймаута не volatile, то компилятор не знает, что она может поменяться из прерывания и проверяет один раз.
volatile это avr libc FAQ number ONE, все через это проходят :-)
Последний раз редактировалось avreal Пт авг 24, 2012 21:37:20, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

avreal писал(а):Если переменная, в которой отражаются нажимаемые кнопки илди время таймаута не volatile, то компилятор не знает, что она может поменяться из прерывания и проверяет один раз.
volatile это avr libc FAQ nuber ONE, все через это проходят :-)

Да я вроде решил эту проблему применением указателей, вроде нормально получилось, из любого места работа идет с конкретным байтом в памяти, а не с клонами.....
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Так тоже не с клоном, зато указатель занимает два байта в памяти.
В поисках истины человек развивается.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Re: Вопросы по С/С++ (СИ)

Сообщение FeCat »

Подскажите пожалуйста
Вот есть два массива

char string_1 [] = "Preved medved";
char string_2 [] = "Hello ";

Как второй массив поместить в первый, что бы получилось в итоге: "Hello medved"?
string_1[] = string_2[]; - не прокатывает.
Писать функцию, которая перекидывала бы элементы массива из одного в другой - мне кажется должен быть проще вариант.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

strcpy(....)
Реклама
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Re: Вопросы по С/С++ (СИ)

Сообщение FeCat »

Аlex
Большое спасибо!!
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: Вопросы по С/С++ (СИ)

Сообщение U235 »

Получаете функцией strlen количество байт в строке и копируете эти байты функцией memcpy.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

Re: Вопросы по С/С++ (СИ)

Сообщение FeCat »

U235
Чуточку больше телодвижений, но более гибко.
Спасибо!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Чуточку больше телодвижений
Ну не совсем. Просто это 2 разных оператора.
memcpy даёт возможность скопировать определённое кол-во байт.
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение O-LED »

нужно менять один бит в байте. менять нужно либо на 0, либо на 1 в произвольном порядуке.
(для примера, если переменная y=1 то в нулевой бит переменной х нужно записать 1, а если y=0, то в нулевой бит переменной х записать 0)

Код: Выделить всё

if(y) {x |= 0x01;} else {x &= 0xFE;}

можно ли это сделать как то компактнее и красивее??
KIT
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

O-LED , это самый короткий вариант, если не использовать шаблон или тернарный оператор. y?(х|=1):(x&=(!1))
скобки для наглядности можно совсем без них.
Правда этот оператор не везде работает.
Если нужна изверсия, то можно просто использовать x^=1;

O-LED, вы что же это решили с код вижна слезть?
:wink:
В поисках истины человек развивается.
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

FeCat писал(а):
Как второй массив поместить в первый, что бы получилось в итоге: "Hello medved"?

strncpy c нужной длиной?
что-то типа strncpy(string_1,string_2,strlen(string_2));
In theory, theory and practice are the same. In practice, they're not.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Или так. Тут уже почти всё равно, strncpy или memcpy, так как strlen дало реальную длину строки и 0 в ней уже не встретится.
strncpy от memcpy отличается тем, что может закончить не по числу длины, а по нулю в строке, но при этом этот ноль вставит в строку получатель.

Ещё
memcpy(str1, str2, strlen(str2));
отработает быстрее, так как не будет проверять на 0
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

avreal писал(а):Или так. Тут уже почти всё равно, strncpy или memcpy, так как strlen дало реальную длину строки и 0 в ней уже не встретится.

А вообще ни один из этих вариантов не является безопасным и использование таких техник программирования - дурной тон. Лучший выход - форматируемый вывод входных строк в буфер, но в связи с ограниченными доступными ресурсами при работе с МК обычно начинаются танцы с бубном. Но стоит думать, что танцы с бубном являются неотьемлемой нормой повседневной жизни.

PS И как замечательно, что до МК не везде добрался юникод :) :tea:
In theory, theory and practice are the same. In practice, they're not.
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Лютик »

В чем разница этих двух строк?

Код: Выделить всё

while((PIND & (1<<6))==1);

Код: Выделить всё

while(bit_is_set(PIND,6));

Во втором случае работает, в 1ом нет =(
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ut1wpr »

У вас единица в шестом разряде выделяется маской. Единичный результат будет 01000000, а вы сравниваете с 00000001. Они никогда не будут равны. Результат этого выражения всегда будет ложь.
Надо

Код: Выделить всё

while( (PIND & (1<<6)) == 0x40 ) continue;

Только маску лучше определить самому перед компиляцией, не заставляя препроцессор тратить на это время. В вашем примере это константа. Ну, это и не важно...
Последний раз редактировалось ut1wpr Вт авг 28, 2012 19:09:37, всего редактировалось 1 раз.
С уважением,
Виктор.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25205
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение КРАМ »

Лютик писал(а):В чем разница этих двух строк?

Код: Выделить всё

while((PIND & (1<<6))==1);

Код: Выделить всё

while(bit_is_set(PIND,6));

Во втором случае работает, в 1ом нет =(

А попробуйте так:

Код: Выделить всё

while (PIND & (1<<6));

Может тогда и первый вариант заработает?
:dont_know:
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение vitalik_1984 »

ut1wpr писал(а):Надо

Код: Выделить всё

while( (PIND & (1<<6)) == 0x40 ) continue;

А надо ли? Тут выходит, что сначала пин очищается по маске, а потом еще и сравнивается с этой же маской! Бессмысленно тратить процессорное время и память программ.

ut1wpr писал(а):
Только маску лучше определить самому перед компиляцией, не заставляя препроцессор тратить на это время. В вашем примере это константа. Ну, это и не важно...

Маску то можно и заранее определить, только потом в исходнике заблудиться на раз плюнуть.
В поисках истины человек развивается.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Аlex »

Лютик писал(а):в 1ом нет =(
Что значит "не работает" ? И почему должно работать ?
Ответить

Вернуться в «Разные вопросы по МК»