Виды подпрограмм

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков

Сообщение 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? проясните. необходимо это знать и для правильного понимания чужой програмы и в своей использавать буду.
Контактная информация:
Реклама
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

В скобках описываются передаваемые в функцию параметры.

void означает "пустой", в качестве параметра не обязательно его писать.
А вот в качестве типа возвращаемого значения - нужно.

void foo1(char a); // функция ничего не возвращает, а в качестве параметра получает одну переменную типа char

void foo2(); //функция ничего не возвращает, и не требует параметров.
void foo21(void); //то же самое.

int foo3(int a); // функция возвращает int, а в качестве параметра получает одну переменную типа int
Последний раз редактировалось Ra Вт дек 02, 2008 01:17:59, всего редактировалось 1 раз.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

извиняюсь за любопытство... Что за программа?
Изображение
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков

Сообщение kvark85 »

Ra, можно поподробней?

1. тоесть если я собираюсь в подпрограмме работать с переменной "a" которая гдето, например в основном цикле программы, установилась, то это будет подпрограма с передаваемой в нее параметром, и описываться а должно в скобках этой подпрограммы и больше нигде. тоесть так:

void dopprograma (char a), а если переменная 16 разрядная то соответственно:

void dopprograma (int a). в скобках надо описать все переменные которые меняются вне подпрограммы? правильно я понял?

2. в третем примере где написано что функция получает переменную параметром именно char?

3. в моем примере: void write(eeprom char *kuda) перед kuda стоит * - зачем?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

void dopprograma (char a) делают так для того чтобы при вызове подпрограммы одновременно передать в подпрограмму значение переменной "а". Тоесть если написать dopprograma(5); в основном цыкле например, тогда по достижению этой строки МК перейдёт к выполнению подпрограммы и в нутри подпрограммы переменная "а" будет иметь значение а=5;
Изображение
Контактная информация:
Реклама
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

1) В скобках надо писать параметры, которые ты передаешь функции.
Представь что функция (подпрограмма) - это черный ящик. туда какие-то данные приходят, и на их основании она выдает какие-то данные. Вот входные параметры пишутся в скобках.
Пример - ты пишешь функцию, которая ждет заданный интервал времени.
То есть, входными данными будет как раз таки интервал времени - если ты хочешь его сделать изменяемым, конечно.
Т.е:
void Delay(int Seconds); //в функцию передаем int-число секунд, сколько ждать. Т.е. Delay(5); для 5 сек, Delay(10) - для десяти.

Если же ты пишешь функцию которая ждет именно 10 секунд, допустим - то ей не нужны параметры. тогда она будет
void DelayTenSec();
Более того, если уже реализовано Delay, то можно написать так:
void DelayTenSec()
{
Delay(10);
}
Только я бы не рекомендовал, это все таки контроллер а не комп, лишние вызовы жрут выч. мощности.

2) Опечатался, извиняюсь, поправил.

3)Ооо... это указатель. Если ты с ними не знаком, лучше тебе почитать книжку по С, это довольно обширная тема...
Если коротко - то это не сама переменная, а адрес памяти, по которому она расположена. В данном случае, видимо, используется указатель, потому что в функцию передается массив данных, т.е. передается указатель на его первый байт.
Последний раз редактировалось Ra Вт дек 02, 2008 01:25:41, всего редактировалось 1 раз.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина

Сообщение Krik99 »

Ra писал(а):Если ты с ними не знаком, лучше тебе почитать книжку по С, это довольно обширная тема...
В любом случае почитай книгу по Си, если в Code Vision тогда хотябы хелп посмотри.
Изображение
Контактная информация:
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Ну или как вариант - писать на асме, там попроще )
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков

Сообщение kvark85 »

для меня асм сейчас вобще такой черный дремучий неизведаный лес что заходить страшно... но чувствую что надо будет. мне надо разобраться как заставить работать микроконтроллер с пультом ду от телевизора, апликухи по этому поводу я только на асме понаходил. а по поводу функций. как вводить в фунлцию переменную я понял. а как возврвщать, и в каких случаях это может понадобится - не очень.
Krik99 - делаю сенсорный включатель с пультом ду и регулированием мощности. в нете есть подобные схемы но прошивки к ним платные. на данном этапе удачно использовал две функции: плавного включения и плавного выключения по прикасанию к сенсорной кнопке. в моем примере не понядобилось выводить ничего из функции, а в каком может понадобиться? прсто хочется на будущее уже до конца разобраться, все узнать.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

В ASM'е нет ничего сложного. Это просто стереотип: "ASM - сложно!" Нужно просто взять хороший учебник и изучить его досканально, поняв каждую строчку, которую пишет автор.

kvark85, Вы пытались прежде чем задавать вопросы открыть любой учебник основ Си? Судя по элементарным вопросам - нет.
Понятно, что форум удобен и там подскажут, но нужно начинать задвать вопросы после изучения литературы и если там что-то не понятно.

PS. Да, я такой плохой и пишу часто "гадости", но все же - учитесь читать не форумы, а книги!
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

АСМ использовать, скажем так, не всегда целесообразно =)
Когда проект большой, его будет потруднее развивать и поддерживать, если он на языке ассемблера, особенно, если отложил его на месяц-другой, а потом вернулся и пытаешься вспомнить, что там наваял =)

Компиллеры сейчас хорошие, дают неплохой код (по скорости и размеру) - поэтому можно и на С писать и горя не знать.
(Правда, не КодеВиженский, там он на редкость тормознутый)
Оптимальный вариант - рутина всякая на С, а там где требуется скорость, а Сишный компиллер ее не обеспечивает - ассемблерные вставки.
Но книжку по С в самом деле стоит почитать - эти вопросы (про функции) - элементарные, обсуждаются в самом начале.
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков

Сообщение kvark85 »

спасибо. буду читать "Руководство полного идиота по программированию (на языке Си)")
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20104
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

А можно мне тоже ссылочку на
kvark85 писал(а):"Руководство полного идиота по программированию (на языке Си)"
??? :)))
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Gudd-Head писал(а):А можно мне тоже ссылочку на
kvark85 писал(а):"Руководство полного идиота по программированию (на языке Си)"
??? :)))
не читайте книжки, написанные идиотом :) сами таким станете.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

Ищите в поисковиках что-нибудь типа "Керниган Ричи Язык С"
А книги с приведенным выше и аналогичными названиями действительно не стоит читать, а то тем и вопросов на форуме еще небось только увеличится.
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков

Сообщение kvark85 »

я тоже подумал бы что это издевательство, если бы не слышал раньше уже отзывов о этой статье. очень мне пмогла. я разобрался во всех вопросах. а Керниган Ричи Язык С тоже гляну, тлько впринципе незачем уже...
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Ср ноя 21, 2007 14:14:37
Откуда: Краснодар

Сообщение Владимир К. »

Ни эту ли программу переделываешь?
http://eldigi.ru/site/house/15.php

Если да, то на форуме уже было обсуждение этой схемы. Там может чего и полезного почитаешь.
Закрыто

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