Моя САМАЯ ПЕРВАЯ минипрограммка. Вопросы.

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

Сообщение megasvintus »

Вот код программы:
#include <mega16>
#include <DELAY>
#define SET_B5 |=(1<<5) //определения для битовых операций
#define CLR_B5 &=~(1<<5)
char abc; //объявил переменную
//ниже функция "цикл" исполняется пока переменная менее 5 (светодиод мигает раз в секунду)
cikle(){
while (abc<5){
PORTA SET_B5; //в бит 5 пишется 1-гасится светодиод
delay_ms(1000); //ждем секунду
abc=abc+1; //добавим 1 к переменной
PORTA CLR_B5; //очищается бит 5 - загорается светодиод
delay_ms(1000); //ждем секунду
};
}
void main(void)
{
while (1){
cikle();
PORTA=0; //после выхода из цикла зажигаются светодиоды порта
delay_ms(2000); //ждем 2 секунды, светодиоды горят
abc=0; //очищается значение переменной
PORTA=255; //тушатся все светодиоды и go снова в цикл мигания всетодиода
};

}

что делает: светодиод мигает 5 раз, затем загораются все 8, тухнут, и цикл повторятся. строки инициализации порта я не приводил, там ничего интересного.

Вопрос по функциям. Если функция с параметром void то написано она ничего не возвращает, что значит слово "возврат значения"??? То что при выполнении функции cikle она увеличивает значение внешней переменной abc???--вроде нет, я ее сделал с параметрами void-ничего не изменилось... Расскажите доходчиво и с примером, если можно конечно.
Трудно быть деревянным, совсем трудно....
Реклама
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн июл 23, 2007 03:10:34
Откуда: СПб

Сообщение L29Ah »

megasvintus писал(а):Вопрос по функциям. Если функция с параметром void то написано она ничего не возвращает, что значит слово "возврат значения"???
Это значит, что она как бы передаёт значение вызвавшему её выражению.
Кстати да, если уходить от абстракции, в С, как в процедурном языке, нет функций, а есть только процедуры, которые иногда модифицируют свои параметры.
megasvintus писал(а):То что при выполнении функции cikle она увеличивает значение внешней переменной abc???--вроде нет, я ее сделал с параметрами void-ничего не изменилось... Расскажите дохдчиво и с примером, если можно пожалуйста.
int f(int z) {
return z + 1;
}

main() {
int a = 5, b;

b = f(a);
}
-- в b окажется 6, в a останется 5

void f(int* z) {
*z = *z + 1;
}

main() {
int a = 5;

f(&a);
}
-- в a окажется 6
Ꙑ!
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Спасибо огромное! Теперь всё предельно понятно! :)) :)) :)) :))
Трудно быть деревянным, совсем трудно....
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

L29Ah писал(а):Кстати да, если уходить от абстракции, в С, как в процедурном языке, нет функций, а есть только процедуры, которые иногда модифицируют свои параметры.
Утверждение прямо противоречащее стандарту Си!!! В Си нет процедур - есть только функции!!!

просто в Си функции могут быть "без возврата значения"... модификация параметров - это один из вариантов использования функций, скорее возникшее из-за того, что функция по определению обязана возвращать лишь одно значение...

каждая функция обязана иметь тип возвращаемого значения. если тип не указан явно - подразумевается тип int. если вы не хотите, чтобы функция что-то возвращала - опишите ее как тип void (пусто).

присвоить значение для возврата можно оператором return

примеры

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

func1(void); // функция без параметров, возвращает результат int 
int func2(void); // точно такая же функция, как func1, но правильно описанная

void func3(void); // функция без параметров, ничего не возвращающая

// далее пример "тел" этих и других функций
int func2(void){
   return 2; // просто вернем число 2
} 

void func3(void){
   abc++; // проинкрементируем внешнюю глобальную переменную
}

// вот как можно использовать функции
   а = b + func2(); // равносильно а = b + 2;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

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

Проще говоря (для х86-процессоров) тип void означает, что в аккумуляторе после выхода из функции ничего интересного не появляется.
Знание - сила!
Реклама
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн июл 23, 2007 03:10:34
Откуда: СПб

Сообщение L29Ah »

ARV писал(а):
L29Ah писал(а):Кстати да, если уходить от абстракции, в С, как в процедурном языке, нет функций, а есть только процедуры, которые иногда модифицируют свои параметры.
Утверждение прямо противоречащее стандарту Си!!! В Си нет процедур - есть только функции!!!
Перечитай моё утверждение. Хотя да, я забыл добавить, что оно модифицирует параметры и не только =)
ARV писал(а):если тип не указан явно - подразумевается тип int.
в C89 - нет.
Ꙑ!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

L29Ah писал(а):Перечитай моё утверждение. Хотя да, я забыл добавить, что оно модифицирует параметры и не только =)
я перечитал. и повторю: В СИ СУЩЕСТВУЮТ ТОЛЬКО ФУНКЦИИ. Понятие "процедура" характерно для PASCAL
L29Ah писал(а):
ARV писал(а):если тип не указан явно - подразумевается тип int.
в C89 - нет.
значит, компилятор выдаст как минимум Warning на отсутствие явного указания типа функции.

Но даже если это не так - я призываю ориентироваться на классику стандарта Си, а не на разновидности, иначе проблем будет больше, чем пользы. говорить-то мы должны на одном языке, чтобы понимать друг друга :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение L29Ah »

ARV писал(а):
L29Ah писал(а):Перечитай моё утверждение. Хотя да, я забыл добавить, что оно модифицирует параметры и не только =)
я перечитал. и повторю: В СИ СУЩЕСТВУЮТ ТОЛЬКО ФУНКЦИИ. Понятие "процедура" характерно для PASCAL
Перечитай ещё раз. Между функцией и процедурой в процедурных языках нет значительной разницы.
ARV писал(а):
L29Ah писал(а):в C89 - нет.
значит, компилятор выдаст как минимум Warning на отсутствие явного указания типа функции.
l29ah@l29ah ~ $ echo "main() {}" > c.c
l29ah@l29ah ~ $ gcc c.c
l29ah@l29ah ~ $

Никаких предупреждений.
ARV писал(а):Но даже если это не так - я призываю ориентироваться на классику стандарта Си, а не на разновидности, иначе проблем будет больше, чем пользы. говорить-то мы должны на одном языке, чтобы понимать друг друга :)
C89 - не "классика стандарта Си"?
Ꙑ!
Контактная информация:
Закрыто

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