Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

danger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);
обходитесь без float :) и в данном случае у вас абсолютно бессмысленное приведение типа.

drob = (drob * 1000UL) / 625; // как-то так
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: Вопросы по С/С++ (СИ)

Сообщение danger3466 »

danger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);

Сам придумал, исходя из того что у меня всего 16 возможных значений, завел масив всех возможных значений. Смешно но экономично :)))
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: Вопросы по С/С++ (СИ)

Сообщение danger3466 »

Мастер Ломастер писал(а):
danger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);
обходитесь без float :) и в данном случае у вас абсолютно бессмысленное приведение типа.

drob = (drob * 1000UL) / 625; // как-то так

Да компилятор жаловался

что значит 1000UL?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

компилятор не жаловался, а справедливо вас предупреждал, что вы написали неудобоваримую вещь в выражении. UL - это unsigned long для константы. я ведь рекомендовал вам почитать букварик по Си....
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: Вопросы по С/С++ (СИ)

Сообщение danger3466 »

Мастер Ломастер писал(а):компилятор не жаловался, а справедливо вас предупреждал, что вы написали неудобоваримую вещь в выражении. UL - это unsigned long для константы. я ведь рекомендовал вам почитать букварик по Си....

Да читал я его :)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

danger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);

В данном случае нужно решить, что для вас важнее - быстродействие или размер кода для умножения нужно два цикла такта и 3кб памяти тк используется тип Флоат.А для деления примерно 300 циклов такта и совсем немного памяти ведь Флоат можно не включать в код.

Мастер Ломастер писал(а):обходитесь без float :) и в данном случае у вас абсолютно бессмысленное приведение типа.

drob = (drob * 1000UL) / 625; // как-то так

Вот как раз без флоат обходится:)
В поисках истины человек развивается.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Вопросы по С/С++ (СИ)

Сообщение BerZerK-ku »

Какой то сумбур в голове, после прочтения вашего поста. Я вас правильно понял: умножение на переменную типа float жрет 3кБ памяти, но осуществляется всего за 2 такта, а использование целочисленных умножения с последующим делением, получается выигрыш по памяти, но зато деление осуществляется за 300 тактов?
MONAH_88
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн авг 09, 2010 15:11:11
Откуда: г.Красноярск

Re: Вопросы по С/С++ (СИ)

Сообщение MONAH_88 »

Доброго времени суток! Я вот уже пол года путаюсь разобраться с микроконтролёрами и всем что с ними связанно! Ток чтото плохо получается,вернее ничего не получается :(
подскажите пожалуйста какими програмными средствами воспользоваться? У меня Windows7! Прикупил програматор USB Asp. Он поддерживает большинство AVR-ок!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

MONAH_88, а причём тут тема по Си ? Или у Вас проблемы с этим языком ?
Ваша проблема не понятна.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

скажите пожалуйста, сдвиг в право содержимого регистра это уменьшение его значения, а в лево - это увеличение ?
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

BerZerK-ku писал(а):Какой то сумбур в голове, после прочтения вашего поста. Я вас правильно понял: умножение на переменную типа float жрет 3кБ памяти, но осуществляется всего за 2 такта, а использование целочисленных умножения с последующим делением, получается выигрыш по памяти, но зато деление осуществляется за 300 тактов?

ну я немного погорячился тут
написано что
умножение 8бит *8бит занимает 9слов +возврат и 58 циклов такта
а деление 8 / 8 занимает 14 слов +возврат и 97 циклов такта.

Так что деление всегда медленнее чем умножение.
умножение среди команд есть а деления нет, поэтому приходится извращаться:)
16 x 16 =16 слов и 218тактов
16 / 16= 39 слов и 255 тактов
В поисках истины человек развивается.
BVS
Потрогал лапой паяльник
Сообщения: 336
Зарегистрирован: Пн май 23, 2011 18:27:41

Re: Вопросы по С/С++ (СИ)

Сообщение BVS »

FreshMan писал(а):скажите пожалуйста, сдвиг в право содержимого регистра это уменьшение его значения, а в лево - это увеличение ?


сдвиг в право содержимого регистра это деление его значения на два, а в лево - это его умножение на два
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Вопросы по С/С++ (СИ)

Сообщение lix »

Мастер Ломастер писал(а):
danger3466 писал(а):Такая строчка мне обходится в 3,5кб, из-за дробной части? Как это обходят?
drob = (unsigned char)(drob * 0.625);
обходитесь без float :) и в данном случае у вас абсолютно бессмысленное приведение типа.

drob = (drob * 1000UL) / 625; // как-то так


можно еще

Код: Выделить всё

drob>>=3;
drob*=5;


с некоторой погрешностью конечно.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

штудирую Си по Белову.............., в его учебнике есть вот таой пример,
мне не понятен смысл команды PORTB=rab^0xFF;
почему просто в данном случае нелзя присвоить регистру rab=0b01111111, а потом уже в теле цикла с помощью команды rab = rab >> 1 сдвигать первоначальное значение ? :dont_know: зачем столько мороки ?????? :dont_know: :dont_know: :dont_know:

Код: Выделить всё

while (1)
   {
   if (PIND.0==1)  // Проверка состояния переключателя
     {
     rab = 0b10000000;  // Сдвиг вправо
     while (rab!=0)
        {
          PORTB=rab^0xFF;  // Запись в порт с инверсией
          rab = rab >> 1;  // Сдвиг разрядов
          delay_ms (200);  // Задержка на 200 мсек
        } 
     } 
   else
     {
     rab = 0b00000001;  // Сдвиг влево
     while (rab!=0)
        {
          PORTB=rab^0xFF;  // Запись в порт с инверсией
          rab = rab << 1;  // Сдвиг разрядов
          delay_ms (200);  // Задержка на 200 мсек
        } 
     }
   };
}
Tell Me The Truth
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: Вопросы по С/С++ (СИ)

Сообщение BerZerK-ku »

Ну ответ то на поверхности: в примере идет циклический сдвиг нуля в порту, а в вашем случае порт будет заполняться нулями.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

значит в Си оператор rab = rab >> 1; является оператором ЦИКЛИЧЕСКОГО сдвига ???
Tell Me The Truth
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Не циклического, а просто сдвига. Старший бит в регистре обнуляется.
В вашем примере не будет бегать ноль, а произойдёт заполнение нулями слева.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

понял........., но мне не понятен смысл этой операции PORTB=rab^0xFF; ???? :dont_know: :dont_know: :dont_know:
почему нельза написать вот так ??? :dont_know: :dont_know: :dont_know:

Код: Выделить всё

rab = 0b01111111;  // Сдвиг вправо
     while (rab!=0)
        {
          PORTB=rab
          rab = rab >> 1;  // Сдвиг разрядов
          delay_ms (200);  // Задержка на 200 мсек
        }
Tell Me The Truth
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Так будет бегать еденичка. А в примере из книги - ноль.
rab^0xFF - это инверсия регистра rab.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

Аlex,ну почему же единичка..........., смотрите, до цикла while мыделаем так rab = 0b01111111;
а в теле while мы пишем

Код: Выделить всё

while (rab!=0) 
        {
          PORTB=rab
          rab = rab >> 1;  // Сдвиг разрядов
          delay_ms (200);  // Задержка на 200 мсек
        }

разве так не правильно ?
Tell Me The Truth
Ответить

Вернуться в «Разные вопросы по МК»