roboforum.ru

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

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

Не могу въехать, почему условие 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 все работает.

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

Myp » 18 фев 2008, 12:44

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

имхо у тя в F минусика нету
мб тип переменной сменить?

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-битные.
Прийдется от них уйти. Но вообще обидно :)

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

Виталий » 18 фев 2008, 13:26

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

if (V <= 0.0f) {
}
else {
}

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

Myp » 18 фев 2008, 13:32

эммм

тоесть нуно добавлять буковку f ???

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] = '-';
   };

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

Digit » 18 фев 2008, 14:02

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

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

Проблема с отрицательными числами.
Причем signed int тоже не хочет... :sorry:

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;
   }
      };

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

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

Master » 18 фев 2008, 15:26

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

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

Добавлено спустя 3 минуты 17 секунд:
и на -100 то же работает, ща попробую на мега 8

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

avr123.nm.ru » 18 фев 2008, 15:28

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

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

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

4. Проверит в протеус на меге16

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

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

Помнится в досовском Си надо было float.h присоединять. Попробуй, мож прокатит... :roll:
А вообще нах тебе плавающая точка? Делай просто double и радуйся...

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

Master » 18 фев 2008, 15:35

короче вот.
все работает и на мега 8.
Вложения
папка (2).rar
(18.24 КиБ) Скачиваний: 25

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 КиБ) Просмотров: 2088


Значит, косячит протеус. :( Версия 7.2 SP2 (build 4602)

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

Master » 18 фев 2008, 16:07

7.1 SP2 build 3692
Вложения
.JPG


Rambler\'s Top100 Mail.ru counter