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

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

Добавлено: Сб фев 18, 2012 21:05:53
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) она тут же приравнивается к единице и потом уже ответ сравнивается с нулем!
то есть пока в скобках не ноль цикл выполняется.

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

Добавлено: Сб фев 18, 2012 21:15:40
IfoR
Мастер Ломастер, ты, собственно, повторил тоже самое, что и мы говорили, кроме одного. :)

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

Добавлено: Сб фев 18, 2012 21:26:12
vitalik_1984
то же самое да не то кто-то говорил, что такая запись правильна, а синтаксис то неверный оказался.
И парню не объяснили с чем сравнивается в условии WHILE в общем не до конца выложились.А постов то зато набили и пошутить успели.Неудивительно, что форумы никто читать не любит.

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

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

Полный код программы прилагаю.

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

Добавлено: Ср фев 22, 2012 09:05:42
Аlex
http://rk6.bmstu.ru/electronic_book/inf ... /lab5.html
2 минуты понадобилось что-бы найти описание оператора :)
Читайте и поймёте свою проблему.

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

Добавлено: Ср фев 22, 2012 09:42:00
slavik.ksu
Аlex Спасибо!
в этой конструкции строка выполняется только после меток case или default !
Спасибо большое!

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

Добавлено: Пт фев 24, 2012 18:53:36
isx
Добрый вечер) Я новичок в СИ поэтому если вопрос глупый не пинайте)
Возможно ли сделать подобную операцию в СИ:
IF (a == 3 ИЛИ 4) {
if (b == 5 ИЛИ 6 ) {c = 1;} else {c = 0;};}
Тоесть если "а" соответствует трём или четырём, а "b" соответствует пяти или шести.
Как я понял после долких мук, операция "||" этого сделать не может.

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

Добавлено: Пт фев 24, 2012 19:12:59
IfoR
Можно:

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

if (a == 5 || a == 4) {
if (b == 5 || b == 6) c = 1; else c = 0;} 
Но такое ещё можно сократить как: :))

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

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

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

Добавлено: Пт фев 24, 2012 19:47:49
vitalik_1984
Я думаю что так можно

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

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

  
    if ((a ==3)||(a == 4)) {              //if1 если a = (3 или 4)
              if ((b ==5)||(b == 6)) {c = 1;}             //|условие
              else {c = 0;}                    //|если не выполняется
    }//end if1
   }//end while
}//end main
 
IfoR писал(а): Но такое ещё можно сократить как: :))

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

if (a == 5 || a == 4) c = b == 5 || b == 6;  
Может и можно, но человеку легче читать

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

if (a == 5 || a == 4) c = (b == 5 || b == 6);  
И то если С- битовая переменная. Что будет присвоено переменной int в приведенном примере?

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

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

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

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

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

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

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

c = a+++b; 
:)))

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

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

a == 3 || a == 4 ? c = b == 5 || b == 6 : 0; 

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

Добавлено: Пт фев 24, 2012 20:57:11
vitalik_1984
Заинтересовался что за символы ? и :
Оказалось что это тернарный оператор.
Только не нашел в книге в каком случае его можно использовать...
Книга Brian W. Kernighan, Dennis M. Ritchie второе издание в виде chm файла.

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

Добавлено: Пт фев 24, 2012 21:10:38
IfoR
Да уж легче сказать, где его нельзя использовать:

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

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

#include <iostream>

int main()
{
 int a,c;

 std::cin >> c;
 a = (c>2 ? -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%2 ? 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++ вытворять.

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

Добавлено: Пт фев 24, 2012 22:06:07
isx
Спасибо за помощь :)

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

Добавлено: Сб фев 25, 2012 04:40:22
vitalik_1984
вот так и рождаются лишние посты.IfoR я же попросил написать в каких случаях можно использовать.а не приводить кучу непонятных примеров.примеры то есть в книге.а из описания только то что это тернарный оператор.
вы бы лучше написали логику работы,а мы бы уже думали в каком виде его применять.

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

Добавлено: Сб фев 25, 2012 09:48:30
Мастер Ломастер
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 - это ОПЕРАТОР. и т.

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

Добавлено: Сб фев 25, 2012 10:04:16
IfoR
vitalik_1984, так я считал, что ты уже знаешь логику её работы, ведь об этом где только не пишут. Даже по твоему же "тернарный оператор" в поисковеке первая и последующие ссылки ведут на описание принципа её работы.

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

Добавлено: Сб фев 25, 2012 16:58:10
backdoor_64
Здравствуйте все!
есть такой вопрос:

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

как покороче сдвигать единицу от нулевого разряда до четвертого, чтобы разряды xxx не были затронуты?

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

Добавлено: Сб фев 25, 2012 17:21:16
AI_Disable
backdoor_64,

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

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

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

Добавлено: Сб фев 25, 2012 17:32:54
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)

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

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