Страница 1 из 1
Моя САМАЯ ПЕРВАЯ минипрограммка. Вопросы.
Добавлено: Вс июл 06, 2008 23:11:08
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-ничего не изменилось... Расскажите доходчиво и с примером, если можно конечно.
Re: Моя САМАЯ ПЕРВАЯ минипрограммка. Вопросы.
Добавлено: Вс июл 06, 2008 23:20:27
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
Добавлено: Пн июл 07, 2008 00:03:59
megasvintus
Re: Моя САМАЯ ПЕРВАЯ минипрограммка. Вопросы.
Добавлено: Пн июл 07, 2008 17:48:18
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;
Добавлено: Пн июл 07, 2008 19:32:38
Пухич
Проще говоря (для х86-процессоров) тип void означает, что в аккумуляторе после выхода из функции ничего интересного не появляется.
Re: Моя САМАЯ ПЕРВАЯ минипрограммка. Вопросы.
Добавлено: Пн июл 07, 2008 20:16:47
L29Ah
ARV писал(а):L29Ah писал(а):Кстати да, если уходить от абстракции, в С, как в процедурном языке, нет функций, а есть только процедуры, которые иногда модифицируют свои параметры.
Утверждение прямо противоречащее стандарту Си!!! В
Си нет процедур - есть только функции!!!
Перечитай моё утверждение. Хотя да, я забыл добавить, что оно модифицирует параметры и не только =)
ARV писал(а):если тип не указан явно - подразумевается тип int.
в C89 - нет.
Re: Моя САМАЯ ПЕРВАЯ минипрограммка. Вопросы.
Добавлено: Пн июл 07, 2008 22:32:24
ARV
L29Ah писал(а):Перечитай моё утверждение. Хотя да, я забыл добавить, что оно модифицирует параметры и не только =)
я перечитал. и повторю: В СИ СУЩЕСТВУЮТ ТОЛЬКО ФУНКЦИИ. Понятие "процедура" характерно для PASCAL
L29Ah писал(а):ARV писал(а):если тип не указан явно - подразумевается тип int.
в C89 - нет.
значит, компилятор выдаст как минимум Warning на отсутствие явного указания типа функции.
Но даже если это не так - я призываю ориентироваться на классику стандарта Си, а не на разновидности, иначе проблем будет больше, чем пользы. говорить-то мы должны на одном языке, чтобы понимать друг друга

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

C89 - не "классика стандарта Си"?