Приведите пожалуйста ПРОСТОЙ пример возврата значения

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Вымогатель припоя
Аватара пользователя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Приведите пожалуйста несколько простых примеров функций с возвратом значения, и примеры использования оператора return.
Только примеры нужны тривиальные, чтобы была ясна суть, что происходит. Желательно без изящных сокращений, это придет само позже...
С очень подробными комментариями, без них пока туговато...
Трудно быть деревянным, совсем трудно....
Реклама
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн июл 23, 2007 03:10:34
Откуда: СПб

Сообщение L29Ah »

int add1(int x)
{
return x + 1;
}

Вот тебе функция, возвращающая число, на 1 большее полученнгого параметра. Т.е. если ты вызовешь её, например, так: add1(100), то в результате получишь 101. Чего непонятного?
Ꙑ!
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Можно поточнее суть вопроса? Ибо сам принцип возврата результата работы функции в общем-то един для большинства ЯВУ.

На процессоре х86 он происходит в простейшем случае через аккумулятор (т.е. с помощью return). Приличные языки программирования также предполагают использование переданных переменных для возврата значений. В функции оператор return может быть в любом месте и он завершает работу функции в любом ее месте с возвратом значения, если это предусмотрено объявлением функции либо без него. Эпилог функции исполняется при этом в любом случае.

например

int fun1(){
int a=8;a*=6;return a;}

тут после завершения работы функции в аккумуляторе окажется 48.

или

void fun1(){
int a=8;a*=6;return;}

тут после завершения работы функции в аккумуляторе м.б. что угодно. Ибо туда функция ничего вам не кладет.

еще пример

int fun1(){
int a=8;a*=fun2();//где fun2() выдает произвольное целое число.
if ( a==48 ) return a;
if ( a!=48 ) return 0;
}

тут после завершения работы функции в аккумуляторе окажется 48. А может и 0. Но в любом случае будет исполнен одинаковый эпилог, который приведет к возврату на следующую после вызова функции fun1() инструкцию.

Как возврат производится в CVAVR мне неизвестно, но принцип подозреваю тот же, просто выбирается какой-то из регистров для возврата. Или речь даже не о CVAVR?
Знание - сила!
Вымогатель припоя
Аватара пользователя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Спасибо!
Речь о CVAVR. Не знаю почему, но всё, что пока видел (даже применение ссылочных переменных при работе с несколькими массивами) схватывал или налету, или довольно быстро, (учитывая, что спецобразования нет, и занимаюсь изучением СИ и МК вообще -всего 2 недели с полного нуля,) а вот с этой функцией возврата, мозги клинят по-черному :shock: :o :))) :))) :))) :))) . Понятно что ничего сложного нет.

В догонку еще вопросик: :roll:
вот кусочек кода из статьи AHEIRа про прием RC5:


bit error = 0; //флаг ошибки

как-то интересно объявили переменную... или я чего-то путаю???
ссылка http://www.radiokot.ru/articles/16/02.zip
строчка 11
Трудно быть деревянным, совсем трудно....
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн июл 23, 2007 03:10:34
Откуда: СПб

Сообщение L29Ah »

Судя по всему, да. Поищи определение типа 'bit' в заголовках/документации.
Ꙑ!
Контактная информация:
Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

приведу пример попроще из школьного курса математики (когда-то тоже не понимал функции в математике)

y = f(x), где f(x)=x+1
знакомо?

на сях

int f(int x){
return x+1;
}

теперь вызываем функцию

int y;

y = f(1); // результат будет 2

printf ("%d",y);

функция возвращает тебе результат типа int и тип переменной должен быть того же типа, иначе ошибка

по поводу бит - такой тип использует только тот компилятор
другие его не поймут и так делать не надо
если у тебя один флаг, то лучше используй char flag = 0;
если флагов до 8, то используй тоже один байт, но теперь уже со сдвигом

т.е. если у тебя памяти много, то лучше юзать по байту на флаг
если памяти мало, но время некритично, то юзай 1 байт для хранения 8 флагов
в этом случае тебе надо будет использовать операции сдвига и логические операции and or xor для доступа к нужным битам и изменении их состояния
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»