а у меня размер кода равен 172 байта для кода urry при оптимизации -Os... ну и чуть поменьше для альтернативного варианта. а если в коде urry исправить явный ляп в предпоследнем return arr[1]; на более логичный return arr[0]; как во всех предыдущих случаях, то разница становится вообще несущественной - то ли 2, то ли 4 байта...vitalik_1984 писал(а):Самый маленький код.Ведь как по условиям места мало вот я и поставил экономию места
Вопросы по С/С++ (СИ)
битва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
ну, камень atmega88 - не думаю, что это принципиально
а версия WinAVR 20100110 - довольно древненькая, но надежненькая 
битва с дураками проиграна, победители торжествуют. слава победителям!
Если только не в pgmspace. Хотя это здесь не вариант. Так, мысли в слухМастер Ломастер писал(а):ну, камень atmega88 - не думаю, что это принципиально
А другой вроде нету..Мастер Ломастер писал(а):а версия WinAVR 20100110 - довольно древненькая, но надежненькая
как WinAVR - нету, но принципиально имеются и более свежие (и более продвинутые) сборки AVR-GCC. например, на электрониксе некто Klen делает свои сборки...juzik писал(а):А другой вроде нету..
битва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
официально по той ссылке надо повесить табличку "Проект закрыт. Все ушли в Atmel" 
битва с дураками проиграна, победители торжествуют. слава победителям!
Я в пятой версии студии компилил.массив глобально обьявлен.
Пробовал локально в майне определить 292 байта стала занимать:)Глобально 290
Пробовал локально в майне определить 292 байта стала занимать:)Глобально 290
В поисках истины человек развивается.
я объявил массив volatile int arr[3]; а основной код сделал таким:если 5-я студия делает аж 290 байт - фтопку ее 
Код: Выделить всё
int main(void){
PORTB = sfSelect(arr);
}битва с дураками проиграна, победители торжествуют. слава победителям!
Студия то тут причем? Она просто дергает соответствующие бинарники из gcc toolchain'а. Надо глянуть makefile, мб лажа в билде.
тулчейн-то там уже не WinAVR-овский, а как бы "обновленный". может, все дело в нем как раз
а это уже студия, т.к. тулчейн с некоторых пор ее неотъемлемая часть
битва с дураками проиграна, победители торжествуют. слава победителям!
что может быть неправильного в этой команде ?
компилятор выдает предупреждение

Код: Выделить всё
switch (i)
{
case 0: PORTC=0b00101111&m(i); break;
case 1: PORTC=0b00011111&m(i); break;
}; - Вложения
-
- 77.jpg
- (15.1 КБ) 457 скачиваний
Tell Me The Truth
Сначала подумал что бинарная константа трактуется как-то странно, но ошибся. Что такое "m"? Функция? Или макрос? Если макрос, то покажите его определение.
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
char z=0,i=0;
char m[2]; // это массив
unsigned char is_button_pressed(void){
unsigned char btn; // переменная для хранения первого опроса состояния
btn = PIND.0; // опросили первый раз
delay_ms(15); // задержка для подавления дребезга
if(btn == PIND.0) // сравниваем первое состояние и текущее
return !btn; // если они одинаковы, то кнопка нажата, если на пине 0
// (а мы возвращаем в этом случае 1)
else
return 0; // а если разные - будем считать кнопку ненажатой
// принудительно, игнорируя реальное значение
}
void main(void)
{
PORTC=0x00;
DDRC=0x7F;
PORTD=0xFF;
DDRD=0x00;
while (1)
{
if(is_button_pressed()) {z++;while(is_button_pressed()){};};
if (z==100) z=0;
m[0]=z%10;
m[1]=z/10;
switch (i)
{
case 0: PORTC=0b00101111&m(i); break;
case 1: PORTC=0b00011111&m(i);break;
};
i++;
if (i>1) i=0;
};
}
Tell Me The Truth
m это массив, а индексация делается через оператор [], т.е.:
Код: Выделить всё
m[i]прошу совета..............., я пытаюсь освоить мышление на языке Си...................., на данный момент пытаюсь написать прогу с помощью которой я бы мог при каждом нажатии кнопки выводить число от 0 до 99, выводить число от 0 до 9 при каждом нажатии кнопки я уже умею......., если кто может, научите меня мыслить в данном направлении.........., как правильно придумать алгоритм работы данной программы ?
http://4put.ru/pictures/max/274/842090.jpg
http://4put.ru/pictures/max/274/842090.jpg
Tell Me The Truth
Я так понимаю осталось доделать часть, которая будет выводить десятки?
Любой число в данном контексте можно представить как
где number собственно само число, dec - десятки, ed - единицы.
Значит Вам надо число нацело поделить на 10. Это будут Ваши десятки, которые вывести на табло, используя методы для отображения единиц, но выбраб другую лампу.
А мышление я думаю везде одинаковое должно быть -- придумать алгоритм. Язык программирования позволит лишь его описать.
Любой число в данном контексте можно представить как
Код: Выделить всё
number = dec * 10 + edЗначит Вам надо число нацело поделить на 10. Это будут Ваши десятки, которые вывести на табло, используя методы для отображения единиц, но выбраб другую лампу.
А мышление я думаю везде одинаковое должно быть -- придумать алгоритм. Язык программирования позволит лишь его описать.
в вышеприведенной программе я уже это сделалjuzik писал(а):Я так понимаю осталось доделать часть, которая будет выводить десятки?
Код: Выделить всё
m[0]=z%10;
m[1]=z/10;Tell Me The Truth
Кажется я понял в чем затык.
Это вывод каждого разряда за 1 проход. Что он делает:
m -- берет значение разряда десятки\единицы
(m & 0x0F) -- убираем лишние данные, не относящиеся к выводимому значению (можно опустить)
1 << (i++ % 2) -- для стробирования ламп надо подать 1 на PC4 или PC5, в заисимости от того что выводить -- десятки или единицы. Инструкция i++ % 2 убирает нужду добавлять оператор if
m | 1 << (i++ % 2) -- битовая сумма операторов, что в конечном итоге даст нужно число на порте
Код: Выделить всё
while(1)
...
PORTC = (m[i] & 0x0F) | 1 << (i++ % 2 + 4);
...
m -- берет значение разряда десятки\единицы
(m & 0x0F) -- убираем лишние данные, не относящиеся к выводимому значению (можно опустить)
1 << (i++ % 2) -- для стробирования ламп надо подать 1 на PC4 или PC5, в заисимости от того что выводить -- десятки или единицы. Инструкция i++ % 2 убирает нужду добавлять оператор if
m | 1 << (i++ % 2) -- битовая сумма операторов, что в конечном итоге даст нужно число на порте


