Страница 109 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт авг 24, 2012 15:47:41
vitalik_1984
shads писал(а):
как еще завставить компилятор не тупить так, оптимизацию чет тоже неохота отключать.....
если эти переменные используются не только в одном месте,( например в прерывании и в основном цикле) тогда лучше переменную объявить как volatile, а не городить новые переменные и портить свободное время процессора.
В вашем случае непонятно что там за переменные появляются после функции.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт авг 24, 2012 20:14:07
avreal
shads писал(а):Пришлось туда пихнуть volatile переменную
volatile надо было пихать не тут, а где-то к переменным, читаемым в BtnPressWait1Sec()
Если переменная, в которой отражаются нажимаемые кнопки илди время таймаута не volatile, то компилятор не знает, что она может поменяться из прерывания и проверяет один раз.
volatile это
avr libc FAQ number ONE, все через это проходят

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт авг 24, 2012 21:09:24
shads
avreal писал(а):Если переменная, в которой отражаются нажимаемые кнопки илди время таймаута не volatile, то компилятор не знает, что она может поменяться из прерывания и проверяет один раз.
volatile это
avr libc FAQ nuber ONE, все через это проходят

Да я вроде решил эту проблему применением указателей, вроде нормально получилось, из любого места работа идет с конкретным байтом в памяти, а не с клонами.....
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт авг 24, 2012 21:24:37
vitalik_1984
Так тоже не с клоном, зато указатель занимает два байта в памяти.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 25, 2012 21:54:20
FeCat
Подскажите пожалуйста
Вот есть два массива
char string_1 [] = "Preved medved";
char string_2 [] = "Hello ";
Как второй массив поместить в первый, что бы получилось в итоге: "Hello medved"?
string_1[] = string_2[]; - не прокатывает.
Писать функцию, которая перекидывала бы элементы массива из одного в другой - мне кажется должен быть проще вариант.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 25, 2012 22:05:33
Аlex
strcpy(....)
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 25, 2012 22:16:40
FeCat
Аlex
Большое спасибо!!
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 25, 2012 22:20:17
U235
Получаете функцией strlen количество байт в строке и копируете эти байты функцией memcpy.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс авг 26, 2012 00:00:59
FeCat
U235
Чуточку больше телодвижений, но более гибко.
Спасибо!
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс авг 26, 2012 00:29:26
Аlex
Чуточку больше телодвижений
Ну не совсем. Просто это 2 разных оператора.
memcpy даёт возможность скопировать определённое кол-во байт.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн авг 27, 2012 20:01:37
O-LED
нужно менять один бит в байте. менять нужно либо на 0, либо на 1 в произвольном порядуке.
(для примера, если переменная y=1 то в нулевой бит переменной х нужно записать 1, а если y=0, то в нулевой бит переменной х записать 0)
можно ли это сделать как то компактнее и красивее??
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн авг 27, 2012 22:15:44
vitalik_1984
O-LED , это самый короткий вариант, если не использовать шаблон или тернарный оператор. y?(х|=1):(x&=(!1))
скобки для наглядности можно совсем без них.
Правда этот оператор не везде работает.
Если нужна изверсия, то можно просто использовать x^=1;
O-LED, вы что же это решили с код вижна слезть?

Re: Вопросы по С/С++ (СИ)
Добавлено: Вт авг 28, 2012 00:33:18
Tolmi
FeCat писал(а):
Как второй массив поместить в первый, что бы получилось в итоге: "Hello medved"?
strncpy c нужной длиной?
что-то типа strncpy(string_1,string_2,strlen(string_2));
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт авг 28, 2012 11:45:30
avreal
Или так. Тут уже почти всё равно, strncpy или memcpy, так как strlen дало реальную длину строки и 0 в ней уже не встретится.
strncpy от memcpy отличается тем, что может закончить не по числу длины, а по нулю в строке, но при этом этот ноль вставит в строку получатель.
Ещё
memcpy(str1, str2, strlen(str2));
отработает быстрее, так как не будет проверять на 0
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт авг 28, 2012 12:46:52
Tolmi
avreal писал(а):Или так. Тут уже почти всё равно, strncpy или memcpy, так как strlen дало реальную длину строки и 0 в ней уже не встретится.
А вообще ни один из этих вариантов не является безопасным и использование таких техник программирования - дурной тон. Лучший выход - форматируемый вывод входных строк в буфер, но в связи с ограниченными доступными ресурсами при работе с МК обычно начинаются танцы с бубном. Но стоит думать, что танцы с бубном являются неотьемлемой нормой повседневной жизни.
PS И как замечательно, что до МК не везде добрался юникод

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт авг 28, 2012 18:48:30
Лютик
В чем разница этих двух строк?
Во втором случае работает, в 1ом нет =(
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт авг 28, 2012 19:04:46
ut1wpr
У вас единица в шестом разряде выделяется маской. Единичный результат будет 01000000, а вы сравниваете с 00000001. Они никогда не будут равны. Результат этого выражения всегда будет ложь.
Надо
Только маску лучше определить самому перед компиляцией, не заставляя препроцессор тратить на это время. В вашем примере это константа. Ну, это и не важно...
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт авг 28, 2012 19:08:55
КРАМ
Лютик писал(а):В чем разница этих двух строк?
Во втором случае работает, в 1ом нет =(
А попробуйте так:
Может тогда и первый вариант заработает?

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт авг 28, 2012 19:32:14
vitalik_1984
А надо ли? Тут выходит, что сначала пин очищается по маске, а потом еще и сравнивается с этой же маской! Бессмысленно тратить процессорное время и память программ.
ut1wpr писал(а):
Только маску лучше определить самому перед компиляцией, не заставляя препроцессор тратить на это время. В вашем примере это константа. Ну, это и не важно...
Маску то можно и заранее определить, только потом в исходнике заблудиться на раз плюнуть.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт авг 28, 2012 19:35:27
Аlex
Лютик писал(а):в 1ом нет =(
Что значит "не работает" ? И почему должно работать ?