Страница 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 - не "классика стандарта Си"?