Базовое двоичное преобразование не работает на PIC

У меня есть следующий код, преобразующий dec. в двоичный (сохраненный как int), и он отлично работает в C::B :

 for(i=0;i<8;i++)
   {
    carry = start_value%2;
    tab[bla] = carry;
    bla++;
    start_value = start_value/2;
   }

for(i=bla; i>0; i--)
       {
       binary = binary + tab[i]*pow(10,i);
       }

Но когда я пытаюсь сделать то же самое на PIC18F4550 с MikroC, ничего не получается! Я включил «pow» и соблюдал объявления переменных, которые использую. Несмотря ни на что, вывод неправильный (например, -62053 вместо 110110).

Спасибо, что заглянули :) Хорошего дня


person gqq    schedule 19.11.2010    source источник
comment
Не могли бы вы предоставить компилируемый пример с объявлениями переменных и показать, как выполняется вывод, пожалуйста?   -  person philant    schedule 19.11.2010
comment
Различный sizeof(int) на PIC?   -  person Paul R    schedule 19.11.2010


Ответы (4)


Проверьте размер типа int (sizeof(int)) для этой архитектуры PIC. Например, если int является 16-битным, максимальное значение, которое оно может содержать, равно 65535 (для unsigned int) или от -32768 до 32767 (для int). Вероятно, проблема в том, что вычисляемое вами значение слишком велико для используемого вами типа.

person jmpcm    schedule 19.11.2010

Вы должны начать второй цикл с i = bla - 1, так как он был увеличен на один раз больше, чем двоичные цифры. Также может случиться так, что tab[] не инициализировано до 0.

И второй цикл должен содержать первый элемент табуляции: tab[0] :

for(i = bla - 1; i >= 0; i--)
{
    binary += tab[i] * pow(10, i);
}
person philant    schedule 19.11.2010

Чтобы получить десятичное значение из массива двоичных цифр, вы должны умножить их на соответствующие степени 2, а не 10. Предполагая, что pow() - это то, чем оно кажется, pow(base, exponent), вам нужно использовать pow(2,i) вместо этого.

person Jeanne Pindar    schedule 19.11.2010

jmpcm : на моем PIC18F значение int составляет 16 бит (2 байта). Но проблема в том, что код работает нормально на моем компьютере, но не на PIC, тогда как переменные, которые я использую, имеют одинаковый размер.

Филипп : У меня такое ощущение , что ты прав насчет того , что со стола не убирают ! Хотя пока не могу протестировать.

Жанна Пиндар: Нет. Я храню массив битов, с которым мне нужно взаимодействовать, в int (необходимо экономить место в оперативной памяти), поэтому мы все еще работаем с базой 10 для окончательного сохранения.

Все: мне удалось выйти из этого с помощью структуры, для которой я определил все биты:

struct {
unsigned int bit0: 1;
unsigned int bit1: 1;
...

Таким образом, я могу хранить 1 бит в группе из 8 бит и обрабатывать его как целое число в основных вычислениях и получать к нему доступ в матрице Nx1.

Тем не менее спасибо за вашу помощь!

person gqq    schedule 20.11.2010
comment
это не ответ на ваш вопрос. Это должно было быть опубликовано как отдельный комментарий к каждому ответу. Вы также можете отредактировать свой вопрос. См. часто задаваемые вопросы: stackoverflow.com/faq#howtoask - person philant; 22.11.2010