roboforum.ru

Технический форум по робототехнике.

Не могу въехать, почему условие If не пашет с float'ом

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Не могу въехать, почему условие If не пашет с float'ом

Сообщение Digit » 18 фев 2008, 12:31

Такой вот вопрос.
Пишу программулинку маленькую и уже час наверное не могу понять, почему оператор if корректно не отрабатывается.
Код вот такой:
Код: Выделить всёРазвернуть
   // Declare your local variables here
   float V = -9.65;
   char digits[5] = {'','','','',''};
                             
   if (V >= 0) {
      digits[0] = 'E';
   } else {
      digits[0] = '-';
   };

Почему-то дает 'E', хотя V у нас меньше нуля.
При этом поэкспериментировал с вариантами кода:
Код: Выделить всёРазвернуть
   if (V < 0) {

Код: Выделить всёРазвернуть
   if (V == 0) {

Код: Выделить всёРазвернуть
   if (V > 0) {

Во всех случаях дает '-'.

Ничего не понимаю... :unknown: Скажите мне, что я дурак и не увидел примитивного, чтоб я успокоился уже. :cry:
"Бэн, это Данила. Ай нид хэлп!" (с)


Update: 2008.02.18 15:48
По итогам обсуждения нашли крайнего - косяк из-за того, что протеус стоит версии 7.2 SP2 (build 4602). На 7.1 SP2 build 3692 все работает.
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Myp » 18 фев 2008, 12:44

эээ
а ты в F подставь ноль и проверь срабатывает ли условие на ноль?

имхо у тя в F минусика нету
мб тип переменной сменить?
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Digit » 18 фев 2008, 12:53

Маразм крепчал...
Новая порция тестов. Проинициализировал переменную V нулем.
Код: Выделить всёРазвернуть
   // Declare your local variables here
   float V = 0;
   char digits[5] = {'','','','',''};
                             
   if (V >= 0) {
      digits[0] = 'E';
   } else {
      digits[0] = '-';
   };


Результат аналогичный. Т.е. при условиях
Код: Выделить всёРазвернуть
if (V >= 0)

Код: Выделить всёРазвернуть
if (V <= 0)

дает 'E', а при условиях
Код: Выделить всёРазвернуть
if (V > 0)

Код: Выделить всёРазвернуть
if (V == 0)

Код: Выделить всёРазвернуть
if (V < 0)

дает '-'.
:crazy:

Добавлено спустя 1 минуту 30 секунд:
PS
Пользуюсь
CodeVisionAVR ver.1.25.8a Evaluation

Добавлено спустя 2 минуты 57 секунд:
Myp писал(а):имхо у тя в F минусика нету
мб тип переменной сменить?


А на что сменить? С десятичной точкой есть только float и double, которые по сути одно и то же.

Думается, что весь косяк в том, что эти типы 32-битные.
Прийдется от них уйти. Но вообще обидно :)
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Виталий » 18 фев 2008, 13:26

Код: Выделить всёРазвернуть
float V = 0.0f;
//float V = -2.93f;

if (V <= 0.0f) {
}
else {
}
Все новости о моих проектах http://savethebest.ru
Аватара пользователя
Виталий
 
Сообщения: 2114
Зарегистрирован: 08 окт 2004, 16:43
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Myp » 18 фев 2008, 13:32

эммм

тоесть нуно добавлять буковку f ???
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Master » 18 фев 2008, 13:47

Код: Выделить всёРазвернуть
// Declare your local variables here
   float V = 0;
   char digits[5] = {'','','','',''};
                             
   if (V >= 0) {
      digits[0] = 'E';  //!!!!!!!!!!!!!!убери эту точку с запятой!!!!
   } else {
      digits[0] = '-';
   };
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Digit » 18 фев 2008, 14:02

Мастер, там перед else стоит фигурная скобка, поэтому точка с запятой должна быть обязательно! Иначе синтакс эррор.

Добавлено спустя 9 минут 7 секунд:
Виталий, буковка f на результат не повлияла. Все так же не работает с отрицательными числами. Положительные и ноль отрабатывает нормально. Причем и без f - видимо я что-то ступил, когда предыдущий опыт с инициализацией нулем делал...

Проблема с отрицательными числами.
Причем signed int тоже не хочет... :sorry:
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Master » 18 фев 2008, 14:32

Пардон перепутал с паскалем.

Добавлено спустя 6 минут 39 секунд:
Или я чета не то понял, но у меня все работает, С на работе тока CVavr, поэтому в качестве отладки использовал Мегу 16 и протеус все работает. Прив V=0 горит порта А0, при -2 горит А1.

Код: Выделить всёРазвернуть
// Declare your local variables here 
float V = 0;
char digits[5] = {'','','','',''};

.................

while (1)
      {
      // Place your code here
   if (V >= 0)
   {
    PORTA.0=1;
   }
   else
   {
    PORTA.1=1;
   }
      };
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Digit » 18 фев 2008, 15:13

Мастер, а отрицательные?

Я тоже в протеусе тестирую, только мега восьмая...

Добавлено спустя 12 минут 20 секунд:
В общем, то ж самое, что и было.
Вот код:
Код: Выделить всёРазвернуть
void main(void)
{
   // Declare your local variables here
   signed int Voltage;

   init_avr();

   Voltage = -965;
   
   // Global enable interrupts
   #asm("sei")

   while (1)
   {
      if (Voltage >= 0) {
         PORTB.0=1;
         PORTB.1=0;
      } else {
         PORTB.0=0;
         PORTB.1=1;
      };
  };
}


В процедуре инициализации лежит сгенереный мастером (из CVavr, а не нашим, форумовским) код, так что в нем не должно быть влияющих на результат косяков.
В итоге, порт В всегда "1", хоть проверяю на "<=", хоть на ">="...

Блин, писец. На таком примитиве столько времени потерять! :o
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Master » 18 фев 2008, 15:26

Мастер, а отрицательные?

так я ж написал -2, все работает.

Добавлено спустя 3 минуты 17 секунд:
и на -100 то же работает, ща попробую на мега 8
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение avr123.nm.ru » 18 фев 2008, 15:28

1. Позырить листинг.

2. Проверить в VMLAB и заходит ли прога во внутрь { }

3. Сделать Voltage = -5;

4. Проверит в протеус на меге16
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение -= Александр =- » 18 фев 2008, 15:31

Помнится в досовском Си надо было float.h присоединять. Попробуй, мож прокатит... :roll:
А вообще нах тебе плавающая точка? Делай просто double и радуйся...
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Master » 18 фев 2008, 15:35

короче вот.
все работает и на мега 8.
Вложения
папка (2).rar
(18.24 КиБ) Скачиваний: 25
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Digit » 18 фев 2008, 15:52

Короче, взял код и симуляцию Мастера. Не перекомпилил даже. Не пашет.
Код там вот такой:
Код: Выделить всёРазвернуть
      // Place your code here    
      Voltage = 9;
     
      if (Voltage >= 0) {
         PORTB.0=1;
         PORTB.1=0;
      } else {
         PORTB.0=0;
         PORTB.1=1;
      };

      Voltage = -9;
      if (Voltage >= 0) {
         PORTC.0=1;
         PORTC.1=0;
      } else {
         PORTC.0=0;
         PORTC.1=1;
      };


А в протеусе получаю вот так.
.PNG
.PNG (6.64 КиБ) Просмотров: 2083


Значит, косячит протеус. :( Версия 7.2 SP2 (build 4602)
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Не могу въехать, почему условие If не пашет с float'ом

Сообщение Master » 18 фев 2008, 16:07

7.1 SP2 build 3692
Вложения
.JPG
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

След.

Вернуться в Микроконтроллеры

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

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