Страница 1 из 1
Виды подпрограмм
Добавлено: Пн дек 01, 2008 23:44:49
kvark85
Здравствуйте. Пытаюсь разобраться в чужой программе. Автор использует несколько подпрограм. Вот первая:
void write(eeprom char *kuda)
{
for(num=0; num<number_of_impuls; num++) kuda[num]=serial[num];
mode=7;
num=0;
serial[0]=0;
}
надо ли в скобках описывать переменные? почему автор сделал так?
Вот вторая:
void infrared(void)
{
static unsigned int zader;
static unsigned char prop;
unsigned char temp;
if(zader)//ждем окончания приема сигнала
{
if(infra_old==1 && infra==1)
.........
и пошла подпрограмма дальше...
чего теперь в скобочках void? проясните. необходимо это знать и для правильного понимания чужой програмы и в своей использавать буду.
Добавлено: Вт дек 02, 2008 00:21:20
Ra
В скобках описываются передаваемые в функцию параметры.
void означает "пустой", в качестве параметра не обязательно его писать.
А вот в качестве типа возвращаемого значения - нужно.
void foo1(char a); // функция ничего не возвращает, а в качестве параметра получает одну переменную типа char
void foo2(); //функция ничего не возвращает, и не требует параметров.
void foo21(void); //то же самое.
int foo3(int a); // функция возвращает int, а в качестве параметра получает одну переменную типа int
Добавлено: Вт дек 02, 2008 01:10:12
Krik99
извиняюсь за любопытство... Что за программа?
Добавлено: Вт дек 02, 2008 01:10:34
kvark85
Ra, можно поподробней?
1. тоесть если я собираюсь в подпрограмме работать с переменной "a" которая гдето, например в основном цикле программы, установилась, то это будет подпрограма с передаваемой в нее параметром, и описываться а должно в скобках этой подпрограммы и больше нигде. тоесть так:
void dopprograma (char a), а если переменная 16 разрядная то соответственно:
void dopprograma (int a). в скобках надо описать все переменные которые меняются вне подпрограммы? правильно я понял?
2. в третем примере где написано что функция получает переменную параметром именно char?
3. в моем примере: void write(eeprom char *kuda) перед kuda стоит * - зачем?
Добавлено: Вт дек 02, 2008 01:16:17
Krik99
void dopprograma (char a) делают так для того чтобы при вызове подпрограммы одновременно передать в подпрограмму значение переменной "а". Тоесть если написать dopprograma(5); в основном цыкле например, тогда по достижению этой строки МК перейдёт к выполнению подпрограммы и в нутри подпрограммы переменная "а" будет иметь значение а=5;
Добавлено: Вт дек 02, 2008 01:17:16
Ra
1) В скобках надо писать параметры, которые ты передаешь функции.
Представь что функция (подпрограмма) - это черный ящик. туда какие-то данные приходят, и на их основании она выдает какие-то данные. Вот входные параметры пишутся в скобках.
Пример - ты пишешь функцию, которая ждет заданный интервал времени.
То есть, входными данными будет как раз таки интервал времени - если ты хочешь его сделать изменяемым, конечно.
Т.е:
void Delay(int Seconds); //в функцию передаем int-число секунд, сколько ждать. Т.е. Delay(5); для 5 сек, Delay(10) - для десяти.
Если же ты пишешь функцию которая ждет именно 10 секунд, допустим - то ей не нужны параметры. тогда она будет
void DelayTenSec();
Более того, если уже реализовано Delay, то можно написать так:
void DelayTenSec()
{
Delay(10);
}
Только я бы не рекомендовал, это все таки контроллер а не комп, лишние вызовы жрут выч. мощности.
2) Опечатался, извиняюсь, поправил.
3)Ооо... это указатель. Если ты с ними не знаком, лучше тебе почитать книжку по С, это довольно обширная тема...
Если коротко - то это не сама переменная, а адрес памяти, по которому она расположена. В данном случае, видимо, используется указатель, потому что в функцию передается массив данных, т.е. передается указатель на его первый байт.
Добавлено: Вт дек 02, 2008 01:22:26
Krik99
Ra писал(а):Если ты с ними не знаком, лучше тебе почитать книжку по С, это довольно обширная тема...
В любом случае почитай книгу по Си, если в Code Vision тогда хотябы хелп посмотри.
Добавлено: Вт дек 02, 2008 01:24:16
Ra
Ну или как вариант - писать на асме, там попроще )
Добавлено: Вт дек 02, 2008 02:23:58
kvark85
для меня асм сейчас вобще такой черный дремучий неизведаный лес что заходить страшно... но чувствую что надо будет. мне надо разобраться как заставить работать микроконтроллер с пультом ду от телевизора, апликухи по этому поводу я только на асме понаходил. а по поводу функций. как вводить в фунлцию переменную я понял. а как возврвщать, и в каких случаях это может понадобится - не очень.
Krik99 - делаю сенсорный включатель с пультом ду и регулированием мощности. в нете есть подобные схемы но прошивки к ним платные. на данном этапе удачно использовал две функции: плавного включения и плавного выключения по прикасанию к сенсорной кнопке. в моем примере не понядобилось выводить ничего из функции, а в каком может понадобиться? прсто хочется на будущее уже до конца разобраться, все узнать.
Добавлено: Вт дек 02, 2008 07:11:17
mr.Kirill
В ASM'е нет ничего сложного. Это просто стереотип: "ASM - сложно!" Нужно просто взять хороший учебник и изучить его досканально, поняв каждую строчку, которую пишет автор.
kvark85, Вы пытались прежде чем задавать вопросы открыть любой учебник основ Си? Судя по элементарным вопросам - нет.
Понятно, что форум удобен и там подскажут, но нужно начинать задвать вопросы после изучения литературы и если там что-то не понятно.
PS. Да, я такой плохой и пишу часто "гадости", но все же - учитесь читать не форумы, а книги!
Добавлено: Вт дек 02, 2008 07:17:23
Ra
АСМ использовать, скажем так, не всегда целесообразно =)
Когда проект большой, его будет потруднее развивать и поддерживать, если он на языке ассемблера, особенно, если отложил его на месяц-другой, а потом вернулся и пытаешься вспомнить, что там наваял =)
Компиллеры сейчас хорошие, дают неплохой код (по скорости и размеру) - поэтому можно и на С писать и горя не знать.
(Правда, не КодеВиженский, там он на редкость тормознутый)
Оптимальный вариант - рутина всякая на С, а там где требуется скорость, а Сишный компиллер ее не обеспечивает - ассемблерные вставки.
Но книжку по С в самом деле стоит почитать - эти вопросы (про функции) - элементарные, обсуждаются в самом начале.
Добавлено: Вт дек 02, 2008 08:58:36
kvark85
спасибо. буду читать "Руководство полного идиота по программированию (на языке Си)")
Добавлено: Вт дек 02, 2008 11:00:58
Gudd-Head
А можно мне тоже ссылочку на
kvark85 писал(а):"Руководство полного идиота по программированию (на языке Си)"
???

Добавлено: Вт дек 02, 2008 12:12:01
ARV
Gudd-Head писал(а):А можно мне тоже ссылочку на
kvark85 писал(а):"Руководство полного идиота по программированию (на языке Си)"
???

не читайте книжки, написанные идиотом

сами таким станете.
Добавлено: Вт дек 02, 2008 14:50:07
mr.Kirill
Ищите в поисковиках что-нибудь типа "Керниган Ричи Язык С"
А книги с приведенным выше и аналогичными названиями действительно не стоит читать, а то тем и вопросов на форуме еще небось только увеличится.
Добавлено: Вт дек 02, 2008 22:12:43
kvark85
я тоже подумал бы что это издевательство, если бы не слышал раньше уже отзывов о этой статье. очень мне пмогла. я разобрался во всех вопросах. а Керниган Ричи Язык С тоже гляну, тлько впринципе незачем уже...
Добавлено: Ср дек 03, 2008 00:56:29
Владимир К.
Ни эту ли программу переделываешь?
http://eldigi.ru/site/house/15.php
Если да, то на форуме уже было обсуждение этой схемы. Там может чего и полезного почитаешь.