Proteus, KiCAD и другие ECAD Разработчик так или иначе сталкивается с системами автоматизированного проектирования. Данный раздел - по САПР. |
20.02.2007, 22:39
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Интересная задача знатокам Си
Есть семисегментный трехразрядный индикатор. Нужно смотреть на него (програмно), и сохранять его значение в переменную типа float, так как все значения с запятой.
Я уже начал писать, вроде как все просто, но нехочет нормально работать если стоит запятая (point) после второго разряда. Вот код:
str18[0]=1;
str18[1]=7;
str18[2]=3;
point=2;
float SUM=0;
byte LD1, LD2, LD3;
LD1=str18[0];
LD2=str18[1];
LD3=str18[2];
SUM=((LD1*100)+(LD2*10)+LD3);
switch (point){
case 0 : break;
case 1 : SUM=SUM/100; break;
case 2 : SUM=SUM/10; break;
}
data=SUM;
return data;
При point=0 получаем 173;
При point=1 получаем 1,73;
При point=2 должны получить 17,3 а получаем 7,29.
Получаеться, что на 100 делим и все ок, а на 10 резульиаи не верный.
Заранее благодарен за любую помощь.
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
21.02.2007, 00:17
|
|
Вид на жительство
Регистрация: 03.05.2006
Сообщений: 312
Сказал спасибо: 30
Сказали Спасибо 144 раз(а) в 52 сообщении(ях)
|
А что будет получено, если задать point=4; ?
|
|
|
|
21.02.2007, 00:59
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от EagleB3
|
А что будет получено, если задать point=4; ?
|
То же, что и при point=0;
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
21.02.2007, 03:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.10.2006
Сообщений: 1,755
Сказал спасибо: 0
Сказали Спасибо 80 раз(а) в 56 сообщении(ях)
|
Вероятно ошибка не в данной части кода. Приведите полный код.
Какой тип имеет переменная data?
Попробуйте изменить case 1 : SUM=SUM/100; break;
на case 1 : SUM=SUM/10; break; и провести преобразование при point=1;
Ошибка очень похожа на некорректное описание (преобразование) типов переменных.
С уважением, Алексей.
|
|
|
|
21.02.2007, 11:14
|
|
Прохожий
Регистрация: 22.11.2006
Сообщений: 1
Сказал спасибо: 8
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
попробуйте такой вариант:
//----------------------------
switch (point){
case 0 : break;
case 1 : SUM=SUM/100.; break;
case 2 : SUM=SUM/10.; break;
}
//----------------------------
|
|
|
|
21.02.2007, 12:39
|
|
Прописка
Регистрация: 09.08.2006
Сообщений: 252
Сказал спасибо: 2
Сказали Спасибо 125 раз(а) в 90 сообщении(ях)
|
А что мешает сделать вывод дебаг-инфы куда-либо? и посмотреть, на каком этапе ошибка
|
|
|
|
21.02.2007, 13:30
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
К сожалению предложения от ALEX__A и BigYu не помогли. Вот полный код функции:
float float_control_range(float data, int8 p)
{
byte n=0, rd=0, bufpoint, pointset=0;
int8 b=0;
bufpoint=point;
if(p›0)b=1;
else if(p‹0)b=-1;
switch (ChLed){
case 1 : rd=str18[2]; n=2; break;
case 2 : rd=str18[1]; n=1; break;
case 3 : rd=str18[0]; n=0; break;
case 4 : pointset=1; break;
}
if(pointset==0){
if (b›0){
if(rd‹9){
rd++;
}
else rd=0;
}
else if (b‹0){
if (rd›0){
rd--;
}
else rd=9;
}
str18[n]=rd;
}
else if(pointset==1){
}
/*******************/
str18[0]=1;
str18[1]=7;
str18[2]=3;
point=1;
/*******************/
float SUM=0;
byte LD1, LD2, LD3;
LD1=str18[0];
LD2=str18[1];
LD3=str18[2];
SUM=((LD1*100)+(LD2*10)+LD3);
switch (point){
case 0 : break;
case 1 : SUM=SUM/10; break;
case 2 : SUM=SUM/100; break;
}
data=SUM;
return data;
}
Где:
ChLed - указывает что вводим, т.е мигающий курсор.
1-3 - вводим разряды, 4 - запятую
case 4 : pointset=1; break; - будет вписана процедура ввода запятой, аналогично вводу цыфр.
выделенная часть /*...*/ написана только для отладки
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
21.02.2007, 15:56
|
|
Прохожий
Регистрация: 09.01.2007
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Если у тебя при Point =2 получается "другой результат", значит в масив str18[x] приходят "другие" значение.
проверь определение массива и значение переменной Point при входе в switch
|
|
|
|
21.02.2007, 16:03
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от littande
|
Если у тебя при Point =2 получается "другой результат", значит в масив str18[x] приходят "другие" значение.
|
Ну как же, если я временно вставил:
/*******************/
str18[0]=1;
str18[1]=7;
str18[2]=3;
point=1;
/*******************/
массив типа byte
То что я написал теоретически должно работать, просто наверное обговариваем очередные "грабли".
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
21.02.2007, 17:58
|
|
Прохожий
Регистрация: 05.12.2006
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Привет всем!
Вообще бы я сказал, что
Код:
|
switch (point){
case 0 : break;
case 1 : SUM=SUM/100; break;
case 2 : SUM=SUM/10; break;
} |
некорректно, по моему.....
Дело в том, что при проверке
Код:
|
case 1 : SUM=SUM/10; break; |
переменная SUM уже содержит значение в 100 раз меньшее, т.к. при реальном выполнении кода в каждом кейсе выполняется расчет SUM.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:53.
|
|