не стоит давать такие советы. понятное дело, что хуже не сделаете, но лучше разобраться в происходящем и делать правильно и компактно: по требованиям стандарта Си в выражении все операнды с размерностью менее int автоматически приводятся к типу int, если нет явного приведения типов. таким образом, для операндов char явное приведение типа к int не требуется - оно делается и так компилятором.Аlex писал(а):В любом случае, я бы советовал писать так
Вопрос по Си
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопрос по Си
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Васька серый
- Родился
- Сообщения: 8
- Зарегистрирован: Чт июл 01, 2010 06:52:02
Re: Вопрос по Си
добрый день.
небольшой вопрос, по формарированию вывода на сях.
Proteus - Mega8 - ds18b20 - Virtual Terminal на USARTе. USART на 9600 (8 Data, 1 Stop, No Parity, Asynchronous)
Задача: вывести температуру в USART.
есть код
работает без замечаний.
а вот кусок
выдает что попало. вместо t=30 выдает t=240, вместо t=31 уже t= 248, t=32 отображает t=0, t=33 отображает t=8 и тд...
как правильно отформатировать?
небольшой вопрос, по формарированию вывода на сях.
Proteus - Mega8 - ds18b20 - Virtual Terminal на USARTе. USART на 9600 (8 Data, 1 Stop, No Parity, Asynchronous)
Задача: вывести температуру в USART.
есть код
Код: Выделить всё
dv = w1_search(0xf0, rc);
printf("count devices = %d\x0d",dv);работает без замечаний.
а вот кусок
Код: Выделить всё
char temp = 0;
temp = ds1820_temperature_10(&rc[0][0]) / 10;
printf("temp = %i \x0d", temp); // (пробовал i, d, f)выдает что попало. вместо t=30 выдает t=240, вместо t=31 уже t= 248, t=32 отображает t=0, t=33 отображает t=8 и тд...
как правильно отформатировать?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопрос по Си
во-первых, в строке формата для "перевода строки" принято вводить "\n", а не шестнадцатиричный код "\x0d"
во-вторых, а вы уверены, что функция ds1820_temperature_10 возвращает результат типа char? по-моему, собака порылась именно тут
во-вторых, а вы уверены, что функция ds1820_temperature_10 возвращает результат типа char? по-моему, собака порылась именно тут
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопрос по Си
Проблема явно видна. С увеличением на 1 'C на датчике, значение увеличилось на 8. Это говорит о том, что датчик у Вас 18B20 а программа работает с 1820. Можете поделить это значение на 8, но это не выход. Ставьте датчик тот который указан в проге, либо указывайте в программе тот, который стоит
И, как сказал AVR, тип переменной выберите float, а то десятых не будет...
Re: Вопрос по Си
нашел в сети такой алгоритм извлечения квадратного корня
но что-то он у меня сразу не заработал, может кто встречал описание, а то по коду не пойму!?
Код: Выделить всё
//Вычисление целочисленного корня квадратного из long int
unsigned int lsqrt(unsigned long arg){
char count=16;
unsigned long res=0,tmp=0;
if(!arg)
{
if(!(arg&0xFF000000))
{
arg<<=8;
count-=4;
}
res=1;
while((tmp<1)&&(count))
{
count--;
if(arg&0x80000000UL)tmp|=2;
if(arg&0x40000000UL)tmp|=1;
arg<<=2;
};//поиск первой 1-ы
tmp--;
for(;count;count--)
{
tmp<<=2;
res<<=1;
if(arg&0x80000000UL)tmp|=2;
if(arg&0x40000000UL)tmp|=1;
arg<<=2;
if( tmp>=((res<<1)|1))
{
tmp-=((res<<1)|1);
res|=1;
}
}
}
return (unsigned int)res;
}но что-то он у меня сразу не заработал, может кто встречал описание, а то по коду не пойму!?
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопрос по Си
О, ещё одна вариация.
Читать тут
http://groups.google.com/group/fido7.ru ... 7557d41673
тут
http://groups.google.com/group/fido7.ru ... f6ff04ac53
и тут
http://groups.google.com/group/fido7.ru ... d286bc7a4a
Читать тут
http://groups.google.com/group/fido7.ru ... 7557d41673
тут
http://groups.google.com/group/fido7.ru ... f6ff04ac53
и тут
http://groups.google.com/group/fido7.ru ... d286bc7a4a
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: Вопрос по Си
спасибо вот это заработал
но только из обсуждения не понял, что это за алгоритм, не могли бы Вы меня точно послать на ... этот разжеванный алгоритм!?
Код: Выделить всё
unsigned short int isqrt( unsigned long int from)
{
unsigned long int mask = 0x40000000, sqr = 0, temp;
do {
temp = sqr | mask;
sqr >>= 1;
if( temp <= from )
{
sqr |= mask;
from -= temp;
}
} while( mask >>= 2 );
// можно дать еще округление
if( sqr < from ) ++sqr;
return (unsigned int)sqr;
} но только из обсуждения не понял, что это за алгоритм, не могли бы Вы меня точно послать на ... этот разжеванный алгоритм!?