Easyelectronics.ru

Электроника для всех
Текущее время: 28 фев 2021, 11:50

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 13  След.
Автор Сообщение
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 02 дек 2011, 07:20 
Старожил

Зарегистрирован: 06 фев 2010, 17:22
Сообщения: 1557
Откуда: Иркутск
На википедии куча примеров, как использовать циклы:
http://en.wikipedia.org/wiki/While_loop
http://en.wikipedia.org/wiki/Do_while_loop


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 02 дек 2011, 11:56 
Старожил

Зарегистрирован: 28 дек 2010, 03:18
Сообщения: 741
Откуда: Оренбург
R_ura писал(а):
Весь день читал хваленных Кернигана и Ричи, понятного ответа не нашел.
Вот неправда ваша.
Керниган и Ричти писал(а):
1.3. Оператор FOR
...
Оператор FOR содержит три части, разделяемые точкой с запятой. Первая часть FAHR = 0 выполняется один раз перед входом в сам цикл.
Вторая часть - проверка, или условие, которое управляет циклом: FAHR <= 300 это условие проверяется и, если оно истинно, то выполняется тело цикла.
Затем выполняется шаг реинициализации FAHR =FAHR + 20 и условие проверяется снова.
Код:
for(key_cod=0;key_cod!=125;key_cod=KEYBOAR());
key_cod=0 - выполнится 1 раз;
key_cod!=125 - условие;
key_cod=KEYBOAR() - реинициализация;

R_ura писал(а):
Так заманчивее и нагляднее.
А ещё лучше как:
Код:
for(key_cod=KEYBOAR();key_cod!=125;key_cod=KEYBOAR());

_________________
arogov.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 02 дек 2011, 16:41 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
while ( (keycod=KEYBOAR()) != 125 );


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 02 дек 2011, 16:47 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Мне while тоже как-то понятней кажется. Делать такие циклы через for мне глаз режет.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 11 янв 2012, 12:07 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
такой вопрос:
правильно ли будет выглядеть условие на проверку выбранного бита байтовой переменной?
Код:
if ( byteVar &(1<<bitNum) == 1)
{

}

...или там в зависимости от номера бита нужно не с единицей сравнивать, а с таким же байтом, имеющим единицу на том же месте?

а то чета не могу до конца вкурить тонкости битовых операций. поднятие/опускание ног портов понял, а как ветвиться на основании отдельных битов, так и не понял


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 11 янв 2012, 12:38 
Старожил
Аватара пользователя

Зарегистрирован: 01 фев 2010, 18:05
Сообщения: 422
Ant писал(а):
такой вопрос:
правильно ли будет выглядеть условие на проверку выбранного бита байтовой переменной?
Код:
if ( byteVar &(1<<bitNum) == 1)
{

}



в С вроде как любой ненулевой результат = true. так что можно написать так:
Код:
if ( byteVar &(1<<bitNum) )
{

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 11 янв 2012, 12:45 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Да, ==1 не нужен.
И если bitNum переменная, то 1<<bitNum будет вычисляться при каждом сравнении. Т.ч. если ее значение не меняется, то лучше использовать константу.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 11 янв 2012, 12:46 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
значение bitNum как раз меняется, так что тут всё ок

а вот насчёт любой ненулевой результат = true не знал, спасибо. это прям всё ставит на места


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 11 янв 2012, 13:00 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Что <>0 является истинной, не работает в C.NET. Там необходимо явно указывать условия.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 11 янв 2012, 15:42 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
вот-вот. впервые только в Си с этим и столкнулся.
ни в JS, ни в VB, ни в TSQL, которые я, считаю, знаю неплохо, такой фигни нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 янв 2012, 06:12 
Старожил

Зарегистрирован: 06 фев 2010, 17:22
Сообщения: 1557
Откуда: Иркутск
Ant писал(а):
такой вопрос:
правильно ли будет выглядеть условие на проверку выбранного бита байтовой переменной?
Код:
if ( byteVar &(1<<bitNum) == 1)
{

}

...или там в зависимости от номера бита нужно не с единицей сравнивать, а с таким же байтом, имеющим единицу на том же месте?

а то чета не могу до конца вкурить тонкости битовых операций. поднятие/опускание ног портов понял, а как ветвиться на основании отдельных битов, так и не понял


Сравнивать с единицей неправильно! Если бит под номером bitNum установлен, то результатом byteVar & (1 << bitNum) будет (1 << bitNum). Например, 0xFF & (1 << 5) даст 32(5ый бит).
А вот если == 1 убрать, то все правильно, как уже сказали, все ненулевое приравнивается к true.
Еще удобно пользоваться макросами, типа:
Код:
#define ISSET(val, bit) (((val) & (1 << (bit))) && 1)
...
if(ISSET(byteVar, bitNum)) {...}

Если добавить && 1 то результатом всегда будет 0 или 1. && - это логическое И, т.е. возвращает 1 если оба операнда не нулевые и 0 в противном случае.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 янв 2012, 06:17 
Старожил

Зарегистрирован: 06 фев 2010, 17:22
Сообщения: 1557
Откуда: Иркутск
Ant писал(а):
вот-вот. впервые только в Си с этим и столкнулся.
ни в JS, ни в VB, ни в TSQL, которые я, считаю, знаю неплохо, такой фигни нет

Это потому, что в перечисленных языках есть тип boolean, а в С такого нет, вот и получаются такие исхищрения:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 янв 2012, 08:31 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
ну вот я собссно для того, чтоб нормальные дефайны написать, и спрашивал)
спасибо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 янв 2012, 13:30 
Только пришел

Зарегистрирован: 17 ноя 2011, 01:12
Сообщения: 9
Цитата:
Код:
for(key_cod=KEYBOAR();key_cod!=125;key_cod=KEYBOAR());


Грамотно расставлены грабли...

Вот один из примеров получения граблями по лбу:
Код:
for(foo=GetFoo();IsGood(foo);foo=GetFoo())
{
...
free(foo);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 янв 2012, 13:53 
Старожил

Зарегистрирован: 28 дек 2010, 03:18
Сообщения: 741
Откуда: Оренбург
rumatavz писал(а):
Вот один из примеров получения граблями по лбу
... и поделом.

_________________
arogov.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 янв 2012, 14:13 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
rumatavz писал(а):
Вот один из примеров получения граблями по лбу:
че-то выдуманный пример.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 13 янв 2012, 13:21 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
где нужно смотреть имена функций, описанных в заголовочных файлах?

то есть, поначалу я пытался чего-то кодить в CvAVR, там увидел функцию delay_us(), сейчас изучаю Си в АВРстудии 4.19, но там, как выяснилось, эта же функция идёт как _delay_us() ! и полного списка "студийных" функций нигде в хэлпах найти не смог.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 13 янв 2012, 13:44 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
имена-то в самих заголовочных файлах и должны быть (прототипы функций), а вот описание нестандартных функций - в доке на библиотеку/компилятор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 13 янв 2012, 13:45 
Старожил

Зарегистрирован: 28 дек 2010, 03:18
Сообщения: 741
Откуда: Оренбург
Здесь

_________________
arogov.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 13 янв 2012, 13:48 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
вот спасибо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 14 янв 2012, 22:20 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
я не пойму, это что - действительно бесконечный цикл?
Код:
for(i=1; i>=0; i--)
    {
    }

отладчик зацикливается напрочь, компилил и АВРстудией и винАВРом.

UPD вопрос снят, i был объявлен как unsigned. поправил, цикл ожил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 15 янв 2012, 00:44 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 650
Откуда: Херсон
Ant писал(а):
.. i был объявлен как unsigned. поправил, цикл ожил.

Ну, как мне кажется, то все беззнаковые переменные всегда больше или равны нулю. Как не крути.
И условие выхода из цикла ...

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 15 янв 2012, 13:20 
Старожил

Зарегистрирован: 06 фев 2010, 17:22
Сообщения: 1557
Откуда: Иркутск
Ant писал(а):
UPD вопрос снят, i был объявлен как unsigned. поправил, цикл ожил.

Чтобы не путаться, очень удобно пользоваться определениями типов из stdint.h
Например:
Код:
int32_t  - 4 байта, знаковое целое
uint8_t - 1 байт, беззнаковое целое
и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 15 янв 2012, 14:15 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
нафига мне 4-байтовая переменная,циклсчитает от 0 до 7 :)
к тому же, прошивка - для тиньки, там не так много памяти


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 15 янв 2012, 17:53 
Старожил

Зарегистрирован: 06 фев 2010, 17:22
Сообщения: 1557
Откуда: Иркутск
Ага, а было до этого unsigned int?:)
Оно то и будет uint32_t.
Однобайтная беззаковая, просто в Си - unsigned char. Двухбайтовая - unsigned short и т.п.
Определения из stdint.h для того и нужны, чтобы в типах не путаться.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 13  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB