Страница 68 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб фев 18, 2012 21:05:53
vitalik_1984
А кто сказал, что
правильно?
как вам это?
../121.c:5: error: expected ';' before '}' token
Вот правильно, грамотеи блин...
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
Ну ошибся одной циферкой, что такого? Я вообще тот код в шутку выставил,

Я по крайней мере не пишу всякие
А можно ещё так:
Код: Выделить всё
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;
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,
При каждом выполнении единичка будет двигаться из 0-го разряда влево с шагом 1 бит. Содержимое старших трёх битов не портится, по достижении 4-го разряда, при следующем выполнении, единичка пропадёт.
Т.е. с каждым исполнением будет так:
0bxxx00001
0bxxx00010
0bxxx00100
0bxxx01000
0bxxx10000
0bxxx00000
...
0bxxx00000
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб фев 25, 2012 17:32:54
backdoor_64
AI_Disable писал(а):backdoor_64,
При каждом выполнении единичка будет двигаться из 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, т.е. только с шестью(если правильно посчитал) побитовыми лог. операциями. И естественно, никакое образование для этого особо не нужно, а описание самих операций можно уместить в пол-странички...