Перевод символов в число (Си)

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Перевод символов в число (Си)

Сообщение GAGArin » 08.09.2008 (Пн) 22:56

Вопрос по сям...
Вобщем-то надо перевести последовательность байтов в число. Имеем код:

Код: Выделить всё
unsigned int USART1_ReceiveInt (unsigned char * last_char)
{
    unsigned char chars[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    unsigned int temp = 0; //Сюда число собираем
    unsigned char timer = 0; //Это таймер по которому мы читаем символы
    unsigned char timer2 = 0; //Это таймер по которому мы собираем из массива данных число.
    unsigned char length=0; //Это переменная вместо которой раньше использовался первый таймер, длинна считанного вобщем
    unsigned char current_char = 0; //Текущий символ

     for (timer=0; timer<8; timer++) //Читаем до восьми символов
    {
      current_char = USART1_Receive();//Эта функция хоть убейся, но отдаст какой-нибудь символ, тут проблем нет.
      if ((current_char>47) & (current_char<58))//Смотрем циферка ли
      {
         length++;//считаем длинну
          chars[timer] = current_char-48;//записываем в массив цифру
       }
      else
      {
        *last_char=current_char;//если считали не то, то запомним для разбора полетов и идём на выход.   
       break;
      }
    }


    for (timer2=0;timer2<length;timer2++) //Пробегаем по массиву и суммируем по разрядам.
    {
      switch (length-1-timer2)
      {
      case 0:
        temp=temp+chars[timer2];
       break;
       case 1:
        temp=temp+chars[timer2]*10;
       break;
       case 2:
        temp=temp+chars[timer2]*100;
       break;
       case 3:
        temp=temp+chars[timer2]*1000;
       break;
       case 4:
        temp=temp+chars[timer2]*10000;
       break;
       case 5:
        temp=temp+chars[timer2]*100000;
       break;
       case 6:
        temp=temp+chars[timer2]*1000000;
       break;
       case 7:
        temp=temp+chars[timer2]*10000000;
       break;
       default:
        ;
      }
     //   temp=temp+chars[timer2]*(10^(length-1-timer2));
    }   
return temp;

}


Вопрос в том, почему вот этот кейсовый монстр работает, а тот вариант что закоментирован снизу нифига не пашет? Или как менее ненормально можно реализовать подобную задачу.

PS Сорри за выбор раздела, в алгоритмы вроде бестолку, тут просто хочется совета спросить. В C# тоже не катит потому что не C# тут нифига.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перевод символов в число (Си)

Сообщение Хакер » 08.09.2008 (Пн) 23:28

GAGArin писал(а):почему вот этот кейсовый монстр работает, а тот вариант что закоментирован снизу нифига не пашет?


Потому что оператор ^ — это не возведение в степень, а Xor.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Re: Перевод символов в число (Си)

Сообщение GAGArin » 08.09.2008 (Пн) 23:39

Спасибо, тему можно убивать


Вернуться в Народный треп

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

Сейчас этот форум просматривают: PetalBot и гости: 2

    TopList