Страница 109 из 386

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

Добавлено: Пт авг 24, 2012 15:47:41
vitalik_1984
shads писал(а):

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

        if    (BtnPressWait1Sec() & ShortUp)
 
     как еще завставить компилятор не тупить так, оптимизацию чет тоже неохота отключать.....
если эти переменные используются не только в одном месте,( например в прерывании и в основном цикле) тогда лучше переменную объявить как 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)

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

if(y) {x |= 0x01;} else {x &= 0xFE;}
можно ли это сделать как то компактнее и красивее??

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

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

O-LED, вы что же это решили с код вижна слезть?
:wink:

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 И как замечательно, что до МК не везде добрался юникод :) :tea:

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

Добавлено: Вт авг 28, 2012 18:48:30
Лютик
В чем разница этих двух строк?

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

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

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

while(bit_is_set(PIND,6));
Во втором случае работает, в 1ом нет =(

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

Добавлено: Вт авг 28, 2012 19:04:46
ut1wpr
У вас единица в шестом разряде выделяется маской. Единичный результат будет 01000000, а вы сравниваете с 00000001. Они никогда не будут равны. Результат этого выражения всегда будет ложь.
Надо

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

while( (PIND & (1<<6)) == 0x40 ) continue;
Только маску лучше определить самому перед компиляцией, не заставляя препроцессор тратить на это время. В вашем примере это константа. Ну, это и не важно...

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

Добавлено: Вт авг 28, 2012 19:08:55
КРАМ
Лютик писал(а):В чем разница этих двух строк?

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

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

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

while(bit_is_set(PIND,6));
Во втором случае работает, в 1ом нет =(
А попробуйте так:

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

while (PIND & (1<<6));
Может тогда и первый вариант заработает?
:dont_know:

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

Добавлено: Вт авг 28, 2012 19:32:14
vitalik_1984
ut1wpr писал(а): Надо

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

while( (PIND & (1<<6)) == 0x40 ) continue;
А надо ли? Тут выходит, что сначала пин очищается по маске, а потом еще и сравнивается с этой же маской! Бессмысленно тратить процессорное время и память программ.
ut1wpr писал(а):
Только маску лучше определить самому перед компиляцией, не заставляя препроцессор тратить на это время. В вашем примере это константа. Ну, это и не важно...
Маску то можно и заранее определить, только потом в исходнике заблудиться на раз плюнуть.

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

Добавлено: Вт авг 28, 2012 19:35:27
Аlex
Лютик писал(а):в 1ом нет =(
Что значит "не работает" ? И почему должно работать ?