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

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

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

Сообщение vitalik_1984 »

А кто сказал, что

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

while (k=1){PORTD=0b101, PORTD=0b11110}; 

правильно?
как вам это?
../121.c:5: error: expected ';' before '}' token

Вот правильно, грамотеи блин... :)))

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

while (k=1){PORTD=0b101, PORTD=0b11110;} 


FreshMan писал(а):а если переменная к станет равна 2 ???

даже если она до цикла приравнялась к 2-м

в самом то цикле (k=1) она тут же приравнивается к единице и потом уже ответ сравнивается с нулем!
то есть пока в скобках не ноль цикл выполняется.
Последний раз редактировалось vitalik_1984 Сб фев 18, 2012 21:29:59, всего редактировалось 1 раз.
В поисках истины человек развивается.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Мастер Ломастер, ты, собственно, повторил тоже самое, что и мы говорили, кроме одного. :)
Изображение
/dev/urandom - гигабайты информации.

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

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

Сообщение vitalik_1984 »

то же самое да не то кто-то говорил, что такая запись правильна, а синтаксис то неверный оказался.
И парню не объяснили с чем сравнивается в условии WHILE в общем не до конца выложились.А постов то зато набили и пошутить успели.Неудивительно, что форумы никто читать не любит.
В поисках истины человек развивается.
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

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

Сообщение slavik.ksu »

здравствуй те уважаемые форумчане! :)
Перехожу на Си, ничего не понимаю, поэтому не судите строго :)
задача: по приходу данных по UART генерируется прерывание по "завершению приема" и загорается светодиод. В симуляции прерывание происходит а то что внутри {} игнорируется, в чем можетбыть причина?
ISR ( USART_RX_vect )
{
switch(UDR)
{
LED_PORT &= ~ (1<<LED2);break;
}
}

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

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

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

http://rk6.bmstu.ru/electronic_book/inf ... /lab5.html
2 минуты понадобилось что-бы найти описание оператора :)
Читайте и поймёте свою проблему.
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

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

Сообщение slavik.ksu »

Аlex Спасибо!
в этой конструкции строка выполняется только после меток case или default !
Спасибо большое!
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Добрый вечер) Я новичок в СИ поэтому если вопрос глупый не пинайте)
Возможно ли сделать подобную операцию в СИ:
IF (a == 3 ИЛИ 4) {
if (b == 5 ИЛИ 6 ) {c = 1;} else {c = 0;};}
Тоесть если "а" соответствует трём или четырём, а "b" соответствует пяти или шести.
Как я понял после долких мук, операция "||" этого сделать не может.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Можно:

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

if (== 5 || a == 4) {
if (== 5 || b == 6) c = 1; else c = 0;} 


Но такое ещё можно сократить как: :))

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

if (== || == 4== || == 6;  
Изображение
/dev/urandom - гигабайты информации.

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

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

Сообщение vitalik_1984 »

Я думаю что так можно

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


int main
(void){
unsigned int a,b,c;
= 3;
= 7;
while (1){    

  
    if 
((==3)||(== 4)) {              //if1 если a = (3 или 4)
              if ((==5)||(== 6)) {= 1;}             //|условие
              else {= 0;}                    //|если не выполняется
    }//end if1
   }//end while
}//end main
 



IfoR писал(а):Но такое ещё можно сократить как: :))

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

if (== 5 || a == 4) c = b == 5 || b == 6;  


Может и можно, но человеку легче читать

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

if (== 5 || a == 4) c = (== 5 || b == 6);  

И то если С- битовая переменная. Что будет присвоено переменной int в приведенном примере?

запутали человека он начинает думать о приоритетах операций и тд

Обновление проверил ваш код в одну строку не работает с int
Обновление ,блин у вас неправильно условие записано не так как в начале задачи, поэтому и не сработало.
Если уж подсказывать, то с правильным условием
isx писал(а):Добрый вечер)
IF (a == 3 ИЛИ 4) {
if (b == 5 ИЛИ 6 ) {c = 1;} else {c = 0;};}

значит правильный и как я считаю более читаемый код будет

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

if (== 3 || a == 4) c = (== 5 || b == 6);  
В поисках истины человек развивается.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Ну ошибся одной циферкой, что такого? Я вообще тот код в шутку выставил, :)
Я по крайней мере не пишу всякие

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

= a+++b; 
:)))

А можно ещё так:

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

== 3 || a == 4 ? c = b == 5 || b == 6 : 0; 
Изображение
/dev/urandom - гигабайты информации.

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

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

Сообщение vitalik_1984 »

Заинтересовался что за символы ? и :
Оказалось что это тернарный оператор.
Только не нашел в книге в каком случае его можно использовать...
Книга Brian W. Kernighan, Dennis M. Ritchie второе издание в виде chm файла.
В поисках истины человек развивается.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Да уж легче сказать, где его нельзя использовать:

Можно, например, так:

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

#include <iostream>

int main()
{
 int a,c;

 std::cin >> c;
 a = (c>? -: c); 
 std
::cout << a;  

 return 0
;
}
 


$ cpp
2
2
$ cpp
3
-3


Или так:

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

#include <iostream>

int main()
{
 int a=0,b=0,c;

 std::cin >> c;
 (c>2?a:b) = c; 
 std
::cout << a << '|' << b;  

 return 0
;
}
  

$ cpp
1
0|1
$ cpp
3
3|0



Или

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

#include <stdio.h>

int main()
{
 int a[5],b[5],r;

 printf("Inter 10 ints:\n");
 for (r=0; r<10; r++)
  scanf ("%d", &(r%2?a:b)[r/2]);

 printf("\nEven number digits: ");
 for (r=0; r<5; r++) printf("%d ", a[r]);

 printf("\nOdd number digits: ");
 for (r=0; r<5; r++) printf("%d ", b[r]);

 return 0;
}
 

$ cpp
Inter 10 ints:
1 2 3 4 5 6 7 8 9 10

Even number digits: 2 4 6 8 10
Odd number digits: 1 3 5 7 9


Ну и на грани извращенства:

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

#include <stdio.h>

int main()
{
 int even[5], odd[5], countEven=0, countOdd=0, b, r;

 printf("Inter 5 ints:\n");
 for (r=0; r<5; r++)
  scanf ("%d", &b), (b%? odd[countOdd++] : even[countEven++]) = b;


 printf("\nEven digits: ");
 for (r=0; r<countEven; r++) printf("%d ", even[r]);

 printf("\nOdd digits: ");
 for (r=0; r<countOdd; r++) printf("%d ", odd[r]);

 return 0;
}
 

$ cpp
Inter 5 ints:
1 2 3 4 5

Even digits: 2 4
Odd digits: 1 3 5


Только, правда, некоторые вещи можно, наверно, только на C++ вытворять.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

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

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

Сообщение vitalik_1984 »

вот так и рождаются лишние посты.IfoR я же попросил написать в каких случаях можно использовать.а не приводить кучу непонятных примеров.примеры то есть в книге.а из описания только то что это тернарный оператор.
вы бы лучше написали логику работы,а мы бы уже думали в каком виде его применять.
В поисках истины человек развивается.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

vitalik_1984 писал(а):вот так и рождаются лишние посты.IfoR я же попросил написать в каких случаях можно использовать.а не приводить кучу непонятных примеров.примеры то есть в книге.а из описания только то что это тернарный оператор.
вы бы лучше написали логику работы,а мы бы уже думали в каком виде его применять.
результатом работы операции expr ? expr_1 : expr_2; является одно из двух значений: если значение expr не равно нулю, то результатом будет значение выражения expr_1, в противном случае expr_2.

по смыслу это очень похоже на действие оператора if, но с одной оговоркой: оператор if не создает значения, т.е. невозможно присвоить переменной значение оператора if, а операция ? - возвращает результат. сравните:

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

int var = a < b ? 12 : b + c;
и

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

int var;
if(a < b)
   var = 12;
else
   var = b + c;
мне кажется, тут сыграла роль одна тонкость перевода стандарта Си: ? - это ОПЕРАЦИЯ, т.е. действие, порождающее ЗНАЧЕНИЕ, а не ОПЕРАТОР, т.е. действие, не порождающее значение. видимо, при переводе однажды кто-то счел возможным подменить смысл слова ОПЕРАЦИЯ смыслом слова ОПЕРАТОР, и с тех пор и покатило...

+= это ОПЕРАЦИЯ, for - это ОПЕРАТОР. и т.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

vitalik_1984, так я считал, что ты уже знаешь логику её работы, ведь об этом где только не пишут. Даже по твоему же "тернарный оператор" в поисковеке первая и последующие ссылки ведут на описание принципа её работы.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
backdoor_64
Родился
Сообщения: 8
Зарегистрирован: Сб фев 25, 2012 16:48:42

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

Сообщение backdoor_64 »

Здравствуйте все!
есть такой вопрос:

имеется регистр 0bxxx00001;

как покороче сдвигать единицу от нулевого разряда до четвертого, чтобы разряды xxx не были затронуты?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

backdoor_64,

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

REG=((REG&0x1F)<<1)|(REG&0xE0);

При каждом выполнении единичка будет двигаться из 0-го разряда влево с шагом 1 бит. Содержимое старших трёх битов не портится, по достижении 4-го разряда, при следующем выполнении, единичка пропадёт.
Т.е. с каждым исполнением будет так:
0bxxx00001
0bxxx00010
0bxxx00100
0bxxx01000
0bxxx10000
0bxxx00000
...
0bxxx00000
backdoor_64
Родился
Сообщения: 8
Зарегистрирован: Сб фев 25, 2012 16:48:42

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

Сообщение backdoor_64 »

AI_Disable писал(а):backdoor_64,

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

REG=((REG&0x1F)<<1)|(REG&0xE0);

При каждом выполнении единичка будет двигаться из 0-го разряда влево с шагом 1 бит. Содержимое старших трёх битов не портится, по достижении 4-го разряда, при следующем выполнении, единичка пропадёт.
Т.е. с каждым исполнением будет так:
0bxxx00001
0bxxx00010
0bxxx00100
0bxxx01000
0bxxx10000
0bxxx00000
...
0bxxx00000


спасибо огромное! что-то я все не догадываюсь до реализации решений с битовыми операциями. не подскажите случайно, ресурс или источник, где можно проникнуться всем тонкостям работы с битами? в универе только начали дискретку, и то мне кажется, что там больше воды будет, чем конкретной практики(

блин, и все равно не получается реализовать код:

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

for(n=0;n<4;n++) {
DDRB.4=1;
PORTB.4=0;
DDRB.4=0;
};


так, чтобы с каждой итерацией цикла менялся номер разряда от 0 до 4 (n в DDR.n и в PORTB.n)
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

Даже не знаю, просто со временем начнёте понимать "механику". Я вообще работаю только с МК AVR, т.е. только с шестью(если правильно посчитал) побитовыми лог. операциями. И естественно, никакое образование для этого особо не нужно, а описание самих операций можно уместить в пол-странички...
Ответить

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