Приветствую Вас, Гость! Регистрация RSS

Вторник, 22.08.2017
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Форум mega-avr.ucoz.ru » Языки программирования » Функция (Разберем по полочкам)
Функция
us4ilqДата: Вторник, 02.11.2010, 16:47 | Сообщение # 1
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Вот никак я толком "недогоню" .
Ваня! В твоей статье о функциях есть пример:

3. функция принимает данные и возвращает результат

Code
unsigned char func( unsigned char mode )
{
unsigned char temp;

switch( mode )
{
case in1: temp=PORTC; break;
case in2: temp=PORTD; break;
}

return temp;
}

Любую переменную до ее использования необходимо обьявить,
так вот мне непонятно следующее - переменная mode вроде нигде не обьявлена.
Или запись в () после имени и есть ее обьявление?

А так же в switch она используется как параметр, но почему я нигде невижу каких либо
действий, которые каким то образом влияют на значение этого параметра?

Далее
Функция возвращает результат - а где именно он находится? В какой переменной?
Ну чтобы этот результат можно было как то использовать.

Прошу прощения если не там спрашиваю.

Сообщение отредактировал us4ilq - Вторник, 02.11.2010, 16:49
 
АвторДата: Среда, 03.11.2010, 09:17 | Сообщение # 2
Автор сайта
Сообщений: 200
Репутация: 3
Город: Омск
Статус: Отсутствует
Сергей, в статье по функциям вышла неувязочка, которую я исправлю. Вот верный вариант:

Code

unsigned char func( unsigned char mode )    
{    
      unsigned char temp;    

      switch( mode )    
      {    
          case in1: temp=PINC; break;    
          case in2: temp=PIND; break;    
      }    

      return temp;    
}

ПОЛНЫЙ ВАРИАНТ ПРИМЕРА

Code

#include <mega8.h>   

#define in1 0   
#define in2 1   

unsigned char result;   

unsigned char func( unsigned char mode )   
{   
      unsigned char temp;   

      switch( mode )   
      {   
          case in1: temp=PINC; break;   
          case in2: temp=PIND; break;   
      }   

      return temp;   
}   

void main( void )   
{   
      DDRC=0x00; PORTC=0xff;   
      DDRD=0x00; PORTD=0xff;   

      result=func( 0); //байт состояния порта С   
      //или   
      result=func( 1 ); //байт состояния порта D   
}

ПОДРОБНЕЕ

переменная mode является аргументом функции, посредством которой функция принимает параметр и которая уже определена по типу данных ( может принимать значение в размере 1байт - 8бит ).

определение по директиве #define

Code

#define in1 0 //компилятор заменит мнемонику in1 на 0   
#define in2 1 // -|- заменит in2 на 1   

unsigned char result; // переменная для хранения результата, который возвратит функция func

переменная result будет содержать 8битный результат, возвращенный функцией func. В зависимости от установки параметра mode ( in1, in2 ), будет производиться чтение либо PINC, либо PIND. Далее, переменную с результатом можно использовать как душе угодно - вывести в другой порт, на индикатор или на линию RS232.



_____________________________________________________________
Радиоэлектроника и Программирование занимательная штука...
 
us4ilqДата: Четверг, 02.12.2010, 18:40 | Сообщение # 3
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Даааа!
Черт побери,
ох и туго же до меня доходит

Добавлено (02.12.2010, 18:40)
---------------------------------------------
Этот пример я взял из книги Белова
«Создаем устройства на микроконтроллерах»
Раздел 1.11 « кодовый замок » стр. 192

Скажу сразу что меня тут интересует не сама поцедура задержки, а именно то -
Какой смысл в сторке 29 и 34 проверять kodz если нигде больше, никаких действий
с kodz не призводится ?
Нигде в листинге этого замка я ненашел упоминания о kodz.
Как kodz мола измениться сама по себе?

Таких примеров я встречал очень много.

Code
// процедура формирования задержки.

27    void wait (unsigned char kodz)
28    {
29       If (kodz==1) TIMSK=0x40; // выбор маски прерываний по таймеру.
30       else TIMSK=0x80;
31       TCNT1=0; // обнуление таймера.
32       Flz=0; // сброс флага задержки.
33       #asm(sei); // разрешаем прерывания.
34       If(kodz!=2) while(flz==0); // цикл задержки.
35    }

Я ЖЕ УЖЕ ГОВОРИЛ, ЧТО КОД ПРОГРАММЫ НУЖНО ПОМЕЩАТЬ В ВВ-CODE code_/code ( ОБРАЩАЙТЕ ПОЖАЛУЙСТА ВНИМАНИЕ )

Сообщение отредактировал us4ilq - Четверг, 02.12.2010, 18:50
 
ilvzДата: Четверг, 02.12.2010, 20:28 | Сообщение # 4
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Значение переменной (параметру) kodz присваивается при вызове этой функции.
А здесь проверятся значение этого параметра (переменной) и в зависимости от его значения выполняются те или иные действия.

Добавлено (02.12.2010, 20:28)
---------------------------------------------
В данном примере есть и ещё одно интересное место.
Переменной Flz присваивают нулевое значение, а потом ждут пока оно не станет нулём. Хотя в рамках этой функции других присваиваний этой переменной не происходит.
Вроде бы зависание!?
А на самом деле, судя по команде разрешения прерываний, присваивание не нулевого значения происходит совсем в другом месте(в прерывании).

 
us4ilqДата: Четверг, 02.12.2010, 20:40 | Сообщение # 5
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Да. С переменной Flz в программе есть много разных действий, и по ней у меня вопросов нет.
А было бы если бы я заметил "фокус" о котором Вы только что написали.

(Значение переменной (параметру) kodz присваивается при вызове этой функции. )
Ну вот опять же, какое значение? Я так понимаю раз явно неуказано (ну к примеру kodz=6 ) то значит
поумолчанию в ней "0" ?

 
ilvzДата: Четверг, 02.12.2010, 21:41 | Сообщение # 6
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Ещё раз.
Вызов wait(2) (где то в программе, вне этой функции) и есть акт присваивания значения параметру функции wait, хоть я и не знаю при вызове как он называется.

При входе в функцию эта двойка попадёт в переменную kodz, так как она объявлена параметром функции.

 
us4ilqДата: Суббота, 04.12.2010, 18:34 | Сообщение # 7
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Вот вложил скрины экрана с других сайтов, в качестве примера, везде все нормально.
А вот здесь почемуто нет blink

Добавлено (04.12.2010, 18:34)
---------------------------------------------
Да! Точно!
Есть в главном цикле две такие строчки:

Code

wait(1); //задержка первого типа
и
wait(2); //задержка второго типа

Теперь кое как начинаю понимать. smile

Файл: 5516796.jpg(32Kb) · _Microsoft_Word.rar(380Kb)


Сообщение отредактировал us4ilq - Суббота, 04.12.2010, 20:13
 
us4ilqДата: Пятница, 17.12.2010, 21:48 | Сообщение # 8
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Вот еще

Добавлено (17.12.2010, 21:48)
---------------------------------------------
Очередной очень тупой вопрос:

В качестве параметра функции ( тоесть в скобках) может использоваться какая нибудь глобальная переменная ?
С которой уже (до вызова функции ) производились какието действия.
Чисто для примера

Code
unsigned char kodz;   
....
....
void main( void ) {
...
...
}
   void wait (unsigned char kodz)  {
...
...
}

Надеюсь что ворос задал правильно smile

Файл: _Microsoft_Word.doc(278Kb)


Сообщение отредактировал us4ilq - Пятница, 17.12.2010, 21:49
 
АвторДата: Понедельник, 20.12.2010, 15:37 | Сообщение # 9
Автор сайта
Сообщений: 200
Репутация: 3
Город: Омск
Статус: Отсутствует
Вообщем в полне можно, по крайней мере компилятор не возражает

Code
#include <mega8535.h>

//объявляем переменную. тип: глобальная
unsigned char kodz;

//прототип функции
int wait( unsigned char kodz );

void main(void)  
{  
     //инициализация порта
     //вход с подтяжкой
     DDRD=0x00;
     PORTD=0xff;
      
     //присваиваем переменной значение прочитанного порта
     kodz=PIND;
      
     //выполняем функцию wait
     wait( kodz );
      
     while ( 1 );

}

int wait( unsigned char kodz )
{
      //выполняем цикл пока kodz больше нуля
      while( --kodz > 0 );
       
      return 0;
          
}

Правда на практике не проверял такую реализацию программы!



_____________________________________________________________
Радиоэлектроника и Программирование занимательная штука...
 
us4ilqДата: Понедельник, 20.12.2010, 20:15 | Сообщение # 10
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Спасибо.
Я тоже думал что можно , но небыл уверен.
А прямого указания на такую возможность нигде в умных книжках не встречал.
 
ilvzДата: Вторник, 21.12.2010, 01:22 | Сообщение # 11
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Правильно небыл уверен. Слов в английском полно. Можно выбрать не повторяющиеся. Дублировать (ИМХО) можно только безликие или отражающие суть происходящего переменные объявленные внутри функций и принимаемые параметры.
Типа: temp, count, i, j, k, a, b, c, .....
И это будет как здоровый образ жизни. Избавит от большего гемороя в будущем!
И ещё, для полного понимания.
Code
   
unsigned char kodz;
.
.
.
void wait (unsigned char kodz)

Это уже не та глобальная переменная, что объявлена выше. Это параметр функции, и кроме названия и типа их ничего не объединяет.
Тоесть внутри функции глобальная переменная НЕДОСТУПНА. Её перекрыл (заместил ) параметр. У них будут РАЗНЫЕ ЗНАЧЕНИЯ, т.к. переменная скорее всего на регистре, а параметр в стеке. Вспомнишь ли ты об этом через неделю...год.
 
us4ilqДата: Вторник, 21.12.2010, 04:44 | Сообщение # 12
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
О черт возьми!
Выходит что сомневался ненапрасно?
А как же тогда быть если нужно в качестве параметра использовать
именно то что находится в глобальной kodz ?

И, что то я несовсем понял первую часть Вашего сообщения , (до слова Code)
Еси не трудно разжуйте пожалуйста.

Сообщение отредактировал us4ilq - Вторник, 21.12.2010, 04:51
 
ilvzДата: Среда, 22.12.2010, 00:10 | Сообщение # 13
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Похоже здесь путаница. ЗНАЧЕНИЕ глобальной переременной можно передавать в функцию. И делается это в вызове, а не в объявлении функции. Т.е. при вызове происходит копирование значения из аргументов указанных при вызове в аргументы указанные при объявлении.
Как раз это и позволяет использовать функцию многократно и в разных частях программы.
Code

int global_1,global_2,i;

int mult_(int arg)
{
  return arg *global_2; //"arg" получило значение при вызове, а global_2 просто доступно везде как глобальное.
};

main()
{
  global_1=3;
  global_2=10;
  i=mult(global_1); // здесь идет передача значения (arg=global_1)
}

Здесь значениие одной глобальной переменной передаётся в функцию как параметр, а вторая просто используется, т.к. доступна внутри любой функции.

Про первую частью
Нельзя дублировать без особой причины имена глобальных переменных. Это чревато труднопонимаемыми проблемами.

Code

int global1,global2;

void func (int global1)
{
  int global2;
// теперь обе глобальные переменные недоступны внутри этой функции, т.к. замещены
// и если в момент написания это не важно
// то через некоторое время можно забыть что снаружи и внутри разные переменные
}

А часто наоборот удобно использовать внутри разных функций одинаковые имена. Напр: i,j,k... и т.д. Видя их сразу ясно что они локальны. Это счётчики циклов или промежуточные переменные. Короче, переменные приобретающие смысл и теряющие его внутри данной функции.
P.S. Настоятельно рекомендую читать. Не только про AVR и не только про "С", а про программирование вообще.
 
us4ilqДата: Среда, 22.12.2010, 13:27 | Сообщение # 14
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Quote
Настоятельно рекомендую читать.

Илья! ну неужели Вы думаете что я ничего не читаю?
У меня есть книга Кернигана и Ричи, вот по ней и учусь.
Как я уже упоминал раньше, многие моменты в умных книжках описаны неочень понятно,
а когда тоже самое обьясняет грамотный человек НО ТОЛЬКО СВОИМИ СЛОВАМИ, в большинстве случаев становится понятнее.

Quote
Нельзя дублировать без особой причины имена глобальных переменных.

Это я знаю. И я не пытался их дублировать, я думал что таким образом можно использовать глобальную переменную как параметр функции.
А поскольку толкового разьяснения найти неудалось , то спросил здесь на форуме.

Спасибо что обьясняете.

 
ilvzДата: Четверг, 23.12.2010, 02:51 | Сообщение # 15
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Ну не надо так близко к сердцу! Задеть ну никак уж не хотел. Да и впредь не собираюсь. Я ведь сам, тоже вечный студент.
А моя рекомендация была связана только лишь с тем, что затронутая тема слишком обширна и осветить её в формате форума очень сложно.
Тем более, что в книгах все формулировки отточены. А не то что у меня.
По личному опыту знаю как помогает чтение "посторонних" книг не связанных непосредственно с AVR и "С".
Понимание как, и по каким законам, "живут" данные не менее важно, чем понимание языка непосредственно.
Если есть возможность качать, то в интернете полно оч. "вкусных" книг. Есть даже одна по CodeVisonAVR непосредственно. Могу подсказать где скачать.

И снова по теме.
Я так и не понял, помогло ли объяснение =).

Добавлю. При объявлении функции мы указываем аргументы ПРИЁМНИКИ значений, а при вызове указываем аргументы ПЕРЕДАТЧИКИ. Они должны иметь одинаковый тип. Правда с типом не очень строго.

Про переменные объявленные внутри функции (и аргументы в частности).
Они создаются КАЖДЫЙ РАЗ при вызове функции и исчезают (освобождают память) перед выходом из функции. Это позволяет экономить память и придаёт функции одно оч. хорошее свойство (реентерабельность). Т.е. если функция вызовет сама себя несколько раз, то при каждом вызове будет ссоздан свой НЕЗАВИСИМЫЙ набор данных.
Ещё раз "пардон" если задел.

Добавлено (23.12.2010, 02:51)
---------------------------------------------
Перечитал ветку с самого начала.
Примерно понял в чём загвоздка.
Ещё раз поясню. Может уже известное smile

Глобальные константы и переменные (те что объявленны вне функций, наверху) доступны внутри любой функции просто так. Они именно для того там (наверху) и объявляются. Их передавать как параметры нет почти никакого смысла. Т.к. они и так доступны.
Едиственный случай который приходит в голову, это когда в один параметр функции могут загружаться значения разных глобальных переменных.
Напр:

Code


int global_maxcount;
.
// без передачи (непосредственное использование)
void func(void)
{
  int count;
  count=global_maxcount;// тут сразу понятно, что от чего зависит
  while(--count) {нечто};
};
// а это с передачей
void func(int count;)
{
  while(--count) {нечто};// а тут сразу понятно, что ничего не понятно
};

И наоборот. Преременные и константы объявленные внутри функции доступны только и только в ней. Вот их и нужно передавать друг другу через параметры.
И ещё. Это о памяти.
Т.к. место под глобальные переменные отводится при компиляции и занято ВСЕГДА. А памяти как всегда smile не хватает. То лучше не злоупотреблять глобальными переменными и по максимуму объявлять переменные внутри функций. Глобальным оставлять только ГЛОБАЛЬНОЕ. Неизменяемые данные (константы) лучше объявлять как FLASH. Это тоже сэкономит озу.
Дааа, про это много есть ещё чего. =))

 
us4ilqДата: Четверг, 23.12.2010, 04:53 | Сообщение # 16
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Да нет Илья!
Совсем не задели!
Очевидно это я неправильно сформулировал свои мысли.
Как я уже раньше писал - очень тяжело до меня доходит, и меня частенько это бесит. smile
Quote
Ещё раз поясню. Может уже известное smile

Так ведь повторенье - мать ученья! smile

А затеял я эту тему, признаться вот почему:
В "своей" программе Барометр у меня есть глобальная переменная

Code
unsigned long adc_data_dav=0;

и есть функция
Code
void s_trim_convert(long adc_data_dav);


Конечно я эту прогу не сам с нуля написал, я использовал фрагменты чужого кода применительно к своему случаю.
Программа работает как и ожидалось, хоты я не применял никаких мер по передаче значения из переменной adc_data_dav
в параметр функции . Я имею в виду тех мер что Вы описали.

Вот тут то и возникли вопросы об использовании глобальных переменных в качестве параметров функций.
Но раз Вы утверждаете что это невозможно (без специальных действий) , тогда как же оно работает?
Или я в очередной раз что то непонял (прозевал) ?

 
ilvzДата: Пятница, 24.12.2010, 03:27 | Сообщение # 17
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Надо сначала отделить мух от котлет. Параметры бывают разные.
Первое это ФОРМАЛЬНЫЕ ПАРАМЕТРЫ.
Они указываются в заголовке функции при её объявлении.
Они никуда не ссылаются. Ничего не содержат. Они просто УКАЗЫВАЮТ программе ТИП ДАННЫХ который функция ожидает в этом по счёту параметре. Это ка щель для монет в автомате газводы. Приму всё, что от копейки до трояка по размеру.
Они вполне могли бы называться первый второй третий. В функциях с переменным к-вом параметров (scanf...printf) примерно так и делается. Имена им (формальным параметрам) дают ТОЛЬКО ДЛЯ ВНУТРЕННЕГО УПОТРЕБЛЕНИЯ. Их видно только изнутри функции.
Классически всё что объявленно в функции (и параметры в том числе) лежит в стеке и локально. Т.е. доступно только внутри данной функции.

Теперь ФАКТИЧЕСКИЕ ПАРАМЕТРЫ.
Это те параметры которые вы указываете в ОПЕРАТОРЕ ВЫЗОВА ФУНКЦИИ. Вот они то и указывают на ЗНАЧЕНИЯ которые функция примет для обработки Они МОГУТ БЫТЬ ЛЮБЫМИ. Лишь бы тип совпал с типом формального параметра. А там ГЛОБАЛЬНЫЕ, локальные, просто непоименованные константы (напр: 3..'A'..'Hello World') или выражения ( с локальными, глобальными переменными и константами которые выше), это не важно.

Когда в программе встречается оператор вызова функции, то происходит следующее:
В спецальном месте (стеке) запоминается адрес оператора следующего за вызовом функции. Это что-бы вернуться. Все выражения в ПАРАМЕТРАХ ОПЕРАТОРА ВЫЗОВА вычисляются (если есть). Если, как параметры указаны переменные, то их значения копируются. И всё это складывается по очереди в специальное место рядом с адресом возврата.
Делается переход по адресу функции.
И вот только тут формальные параметры приобретают смысл и значение. Тоесть имена формальных параметров нам нужны для того что-бы обращаться к полученным данным.

Ещё раз подчеркну, что никакой связи между именами фактических параметров указанных в вызове функции и именами формальных параметров указанных в объявлении функции не существует. Т.е. когда функция пишется наша забота только о правильности типа параметров. (хочу конфеты а не фантики). Ведь мы заранее не знаем где когда и с каими значениями будет вызываться наша функция.
Вызов может быть таким:

Code

func(tram);
func(3);
func(3+tararam);
и даже
func(func(func(tram+3*(3+4)))-tararam);

Тем более что при вызове функции в неё проникают только значения. Имена остаются за бортом.
Как деньги в магазине. Важна сумма, а не место откуда она получена.
(На самом деле имена исчезают ещё при компиляции. Остаются только адреса и смещения. Т.е. циферки)

Имена параметрам при объявлении функции даются любые. Лучше конечно если они будут отражать смысл выполняемого функцией действия. Но это только для своего удобства. В этот момент мы ничего не знаем о том что поступит на вход. Только тип.
Кроме этих данных (параметров) и объявленных внутри функции локальных переменных, изнутри функции видно ещё кое-что.
Это кое-что и есть глобальные переменные и константы.

Далее. Если при объявлении функции в качестве ФОРМАЛЬНОГО ПАРАМЕТРА указать нечто точно совпадающее типом и названием с какой либо глобальной переменной, то тогда имя (внутри функции) меняет хозяина и начинает принадлежать уже параметру, а не на глобальной переменной. НО ЭТО ТОЛЬКО ВНУТРИ ДАННОЙ ФУНКЦИИ. Для всей остальной программы это имя по прежнему ссылается на глоб. переменную. Программе имя параметра функции недоступно. Это имя для внутреннего употребления. И у программы нет проблеммы когда одно имя не может указывать на два разных места.

Ну а теперь главное. ПЕРЕДАЧА ЗНАЧЕНИЯ ГЛОБАЛНОЙ ПЕРЕМЕННОЙ в ФУНКЦИЮ

Code

int global_variable_1, global_variable_2;

int func(int local_parametr)
    {
    // обращаю внимание,  здесь мы знаем только то, что входящие данные будут типа int
    // и бращаться мы к ним будем по имени local_parametr которое никто кроме этой функции не знает
    // это всё что мы знаем о входящих данных.
     return local_parametr + 1;// прибавляем к тому что получили единичку
                    // и возвращаем полученное значение через return
    // у return две функции он вызывает выход из функции, где-бы не встретился, а ещё он передаёт результат      
    //выполнения  функции в место вызова
    };

void main()
    {
     // вот здесь то всё и происходит
     // вызываем функцию со значением из глобальной переменной global_variable_1 и даже не знаем как там у функции
     // называется параметр который примет наше значение. имя формального параметра это внутренне дело функции.
     // и помещаем результат выполнения функции в глобальную переменную global_variable_2
     global_variable_2=func(global_variable_1);
     // если отвлечься от того что что-то вызывается (и что на самом деле всё не так), то происходит примерно следующее:
     //  local_parametr = global_variable_1;
     //  global_variable_2 = local_parametr+1;

    };

Вооо понаписал. Не знаю. Понятно ли.

Добавлено (24.12.2010, 03:27)
---------------------------------------------
Гляну ещё раз с чего сыр-бор. Сразу скажу, что принимать код из интернета за эталон. Ну это знаете ли... всё равно, что изучать правила русского языка по моим постам smile
А у товарища, если это конечно не вызванно насущной необходимостью, скорее всего просто... ну забыл он, что давал уже такое имя. Тип совпал. Компилятор скушал. Побочного эффекта от подмены не случилось. т.к. глобальная переменная подозреваю в этой функции не нужна. Если бы была нужна, то он врядли бы имя глоб. переменной забыл. Прога работает. Устройство фунициклит. Чай не ядерный реактор. Для обучения нужно искать именно учебные примеры. Их как правило оттачивают. Часто благодаря злобным комментам smile Но и это не панацея.

Сообщение отредактировал ilvz - Пятница, 24.12.2010, 03:09
 
us4ilqДата: Пятница, 24.12.2010, 04:12 | Сообщение # 18
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Ух тыыыы!!!
Ну прям целую книгу написали! smile
Буду переваривать.

ОГРОМНОЕ СПАСИБО!

Я конечно понимаю что Вы пытаетесь, уже несколько постов подрят, вдолбить в мою бестолковую голову одно и тоже .
Это знаете , примерно как шахматы, если человек знает как ходят фигуры - то совсем не значит что он умеет играть.

Но я стремлюсь biggrin

Quote
Сразу скажу, что принимать код из интернета за эталон.

Вообщето это были обучающие статьи для начинающих, а я просто взял из них куски кода как основу.
Надеюсь знаете такого на "РАДИОКОТЕ" ARV? Вот с его сайта.
Еще раз спасибо.

Сообщение отредактировал us4ilq - Пятница, 24.12.2010, 04:25
 
Форум » Форум mega-avr.ucoz.ru » Языки программирования » Функция (Разберем по полочкам)
Страница 1 из 11
Поиск: