Уроки программирования Arduino

Перенос из темы «Чайные радиоэлектронные вопросы»
 
1 2 3 4 5
RU Валентин_НН #09.04.2015 15:02
+
-
edit
 

Валентин_НН

координатор
★★
Сообщение было перенесено из темы Чайные радиоэлектронные вопросы.
Ковыряю букварь от Джереми Блума.

вопросов выплывает масса
вот, скажем, тут пытаюсь разобраться, как устроены функции.
code c
  1. int potA=0; //объявляем пин подключения потенциометра А
  2. int potB=1; //объявляем пин подключения потенциометра В
  3. int A;      // длина стороны А
  4. int B;      // Длина стороны В
  5. int S;      // площадь прямоугольника
  6. void setup()
  7. {
  8.  Serial.begin (9600);
  9.  pinMode (potA, INPUT);
  10.  pinMode (potB, INPUT);
  11.  A=0;
  12.  B=0;
  13.  S=0;
  14.  
  15. }
  16. // задаем функцию AREA, которая получает в качестве аргументов
  17. // А и В. В теле функции эти числа перемножаются и присваиваются
  18. // переменной S. Функция возвращает значение S
  19.  int AREA (int A , int B)
  20. {
  21.   S=A*B;
  22.   return S;
  23. }
  24.  
  25. void loop()
  26. {
  27.   A=analogRead(potA); // А=значению потенциометра А
  28.   B=analogRead(potB); // В=значению потенциометра В
  29.   AREA (A,B); // вызываем функцию AREA, передаём ей значения А и В
  30.   Serial.println(S); // выводим значение на экран
  31.   delay (500);
  32. }

в начале инициализируем переменные АиВ.
Почему при определении функции AREA я опять должен указать, что переменные А и В являются int?
да, и, собственно, а что значит int перед AREA? ведь переменной AREA у меня нет. это просто название функции. Или это не просто название функции?

ПС. если что, то программу я не запускал. Не знаю, правильно она работает или нет. Но, от ошибок при компилировании я избавился :)
 37.037.0
Это сообщение редактировалось 09.04.2015 в 15:16
RU GOGI #09.04.2015 15:56  @Валентин_НН#09.04.2015 15:02
+
+1
-
edit
 

GOGI

старожил
★★★
В.Н.> в начале инициализируем переменные АиВ.
В.Н.> Почему при определении функции AREA я опять должен указать, что переменные А и В являются int?
Потому что ты не указываешь, а создаешь две новые локальные для функции AREA переменные А и B, которые ссылаются на две глобальные переменные А и B. Дурнейший стиль программирования.
Надо примерно так
code c
  1. int AREA (int Width , int Height)
  2. {
  3. Int I=Width*Height;
  4. return I;
  5. }


или в данном случае просто
code c
  1. int AREA (int Width , int Height)
  2. {
  3. return Width*Height;
  4. }

В.Н.> да, и, собственно, а что значит int перед AREA? ведь переменной AREA у меня нет. это просто название функции.
Ты указываешь, какой тип данных возвращает функция.
1  36.036.0
Это сообщение редактировалось 09.04.2015 в 16:16
RU Balancer #10.04.2015 03:26  @Валентин_НН#09.04.2015 15:02
+
-
edit
 

Balancer

администратор
★★★★☆
В.Н.> Почему при определении функции AREA я опять должен указать, что переменные А и В являются int?

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

При описании переменных, соответственно, у тебя указывается их тип. В общем случае он может не совпадать с типом переменных функции. Скажем, тип переменной char, а функция работает с int. Преобразование возможно без потерь, поэтому выполнится автоматически.

В.Н.> да, и, собственно, а что значит int перед AREA?

Тип возвращаемого функцией значения. Одна функция может возвращать целое, другая — значение с плавающей точкой, третья — ничего не возвращать.

...

P.S. поправил твоё сообщение на использование тега [code]
 41.0.2272.11841.0.2272.118

RU Валентин_НН #10.04.2015 11:39  @GOGI#09.04.2015 15:56
+
-
edit
 

Валентин_НН

координатор
★★
GOGI> Надо примерно так

code c
  1.   int AREA (int Width , int Height)
  2.     {
  3.     return Width*Height;
  4.     }


т.е. мне в строке вывода достаточно будет написать

code c
  1. Serial.println(AREA);

Так?

ну и за кучу ещё пара вопросов
функция возвращает только одно значение?
т.е. я не могу написать в её теле
code c
  1. return (I);
  2. return (B);
?

В теле программы я могу сослаться на локальные переменные, используемые в функции? или они действуют только внутри неё (функции).

а вообще, конечно, надо купить учебник по этому С, чтобы народ не веселить ламерскими вопросами

пс. а почему у меня листинги не раскрашиваются разными цветами?
 37.037.0
Это сообщение редактировалось 10.04.2015 в 12:15
RU GOGI #10.04.2015 11:49  @Валентин_НН#10.04.2015 11:39
+
+1
-
edit
 

GOGI

старожил
★★★
>т.е. мне в строке вывода достаточно будет написать
Нет, писать надо так.
Serial.println(AREA(А,B))
Ты не можешь вызвать функцию, а потом просто использовать получившееся значение, не вызывая её снова. Если тебе одно и тоже значение надо будет в нескольких местах использовать, то надо так
int StoredAREA;
StoredAREA=AREA(A,B);
Serial.println(StoredAREA);

В.Н.> В теле программы я могу сослаться на локальные переменные, используемые в функции? или они действуют только внутри неё (функции).
Не можешь. На то они и локальные.
В.Н.> пс. а почему у меня листинги не раскрашиваются разными цветами?
Парсер не определил что это Си код.
1  37.037.0
RU Валентин_НН #10.04.2015 12:14  @GOGI#10.04.2015 11:49
+
-
edit
 

Валентин_НН

координатор
★★
В.Н.>> пс. а почему у меня листинги не раскрашиваются разными цветами?
GOGI> Парсер не определил что это Си код.

не, там просто надо писать в тег [code c]
но, почему-то, когда я пытаюсь в этот тег заключить несколько разных фрагментов, то происходит сбой - если два фрагмента, то и текст письма между фрагментами определяется как листинг программы (см. образец). Если три фрагмента, то тэг вообще перестаёт работать
 37.037.0
RU Balancer #10.04.2015 14:45  @Валентин_НН#10.04.2015 12:14
+
-
edit
 

Balancer

администратор
★★★★☆
В.Н.> но, почему-то, когда я пытаюсь в этот тег заключить несколько разных фрагментов, то происходит сбой

Потому что ты первый раз закрыл не по [/code], а некой химерой [/code c] :) Исправил. Заодно, хотя формат записи {code c} верный и поддерживаемый парсером, в BB-коде нынче правильнее писать {code=c}. На форумах парсер оба варианта поддерживает, но лучше писать как чаще принято :)
 4141
RU Sandro #10.04.2015 15:34  @Валентин_НН#10.04.2015 11:39
+
-
edit
 

Sandro
AXT

инженер вольнодумец

В.Н.> а вообще, конечно, надо купить учебник по этому С, чтобы народ не веселить ламерскими вопросами

Ключевые слова:

Язык программирования Си
Брайан Керниган, Деннис Ритчи
3-е издание

От авторов языка :)
 41.0.2272.10141.0.2272.101
RU Валентин_НН #10.04.2015 16:43  @Balancer#10.04.2015 14:45
+
-
edit
 

Валентин_НН

координатор
★★
Balancer> Потому что ты первый раз закрыл не по [/code], а некой химерой [/code c]
Ну извини. Я думал, что как обзываешься, так и называешься как открывается, так и закрывается.
 37.037.0
RU Валентин_НН #10.04.2015 16:57
+
-
edit
 

Валентин_НН

координатор
★★
О, контекстная реклама меня уже в Питер на курсы по программированию приглашает :)

Программирование - Институт прикладной автоматизации и программирования

Учебные курсы по востребованным направлениям: сметное дело, управление строительством, курсы Microsoft, курсы Linux, IP сети, VoIP телефония, администрирование сетей, программирование. Современные методики обучения. Дистанционное обучение: программы по сметному делу и системному администрированию. Повышение квалификации. Индивидуальные программы. // ipap.ru
 
 37.037.0
RU Валентин_НН #25.10.2015 23:39
+
-
edit
 

Валентин_НН

координатор
★★
потихоньку ковыряю Ардуину
code c
  1. #include <LiquidCrystal.h>
  2. LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
  3. //определяем пины подключения кнопки и светодиода
  4. #define BUTTON_PIN    1
  5. #define LAMP_PIN      3
  6. //задаем состояния светодиода
  7. enum lampState
  8. {
  9.   STATE_OFF,
  10.   STATE_MED,
  11.   STATE_ON,
  12.   TOTAL_STATES
  13. };
  14. //задаём исходные значения переменных
  15. // char myString= "This is the first line";
  16. int lampState = STATE_OFF;
  17. bool wasButtonDown = false;
  18.  
  19. void setup()
  20. {
  21.     lcd.begin(8, 2);
  22.     lcd.clear();
  23.     pinMode(BUTTON_PIN, INPUT);
  24.     pinMode(LAMP_PIN, OUTPUT);
  25.  
  26.    
  27. }
  28.  
  29. void loop()
  30. {
  31.     bool isButtonDown = digitalRead(BUTTON_PIN);
  32.     if (isButtonDown==true && !wasButtonDown==true) {
  33.         //lampState = !lampState;
  34.          lampState = ++lampState % TOTAL_STATES;
  35.  
  36.          
  37.  
  38.         delay(10);
  39.     }
  40.  
  41.  
  42.   switch (lampState) {
  43.     case STATE_OFF:
  44.        analogWrite(LAMP_PIN, 0);
  45. //выводим имя состояния
  46.        lcd.setCursor(0, 0);
  47.        lcd.print("OFF ");
  48.            break;
  49.  
  50.  
  51.   case STATE_MED:
  52.         analogWrite(LAMP_PIN, 25);
  53. //выводим имя состояния
  54.         lcd.setCursor(0, 0);
  55.         lcd.print("MED ");
  56.         break;
  57.        
  58.        
  59.     case STATE_ON:
  60.        analogWrite(LAMP_PIN, 255);
  61. //выводим имя состояния
  62.        lcd.setCursor(0, 0);
  63.        lcd.print("ON ");
  64.        break;
  65.  
  66. }    
  67.  
  68.     wasButtonDown = isButtonDown;
  69.  // выводим номер состояния
  70.  lcd.setCursor(1, 1);
  71.  lcd.print(lampState);
  72.    
  73. }

простенькая программка.
при нажатии на кнопку последовательно перебирает три состояния светодиода - 0%, 15% и 100% мощности.
параллельно на LCD выводится строка с именем состояния LOW, MED, HIGH
и номер этого состояния.
я хочу выводить имя состояния за пределами блока CASE. Там, где выводится номер этого состояния. Для этого мне надо присваивать какой-то текстовой переменной имя состояния. А как это сделать? что-то не получается никак. Самое похожее, что нашел это char, но что-то не срастается у меня с ним ничего :(
 41.041.0
RU GOGI #26.10.2015 06:47  @Валентин_НН#25.10.2015 23:39
+
-
edit
 

GOGI

старожил
★★★
В.Н.>Самое похожее, что нашел это char, но что-то не срастается у меня с ним ничего :(
Просто char - это один символ. Для строки нужен массив char.
Вот примерно так делается, как раз для твоего случая пример

Пересчляемый тип данных в си

Перечисляемый типа данных: объявление нового перечисления, примеры использования. // learnc.info
 
code c
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. static char *ErrorNames[] = {
  6.     "Index Out Of Bounds",
  7.     "Stack Overflow",
  8.     "Stack Underflow",
  9.     "Out of Memory"
  10. };
  11.  
  12. enum Errors {
  13.     INDEX_OUT_OF_BOUNDS = 1,
  14.     STACK_OVERFLOW,
  15.     STACK_UNDERFLOW,
  16.     OUT_OF_MEMORY
  17. };
  18.  
  19. void main() {
  20.     //ошибка случилась
  21.     printf(ErrorNames[INDEX_OUT_OF_BOUNDS-1]);
  22.     exit(INDEX_OUT_OF_BOUNDS);
  23. }
1  41.041.0
RU Валентин_НН #26.10.2015 19:52  @GOGI#26.10.2015 06:47
+
-
edit
 

Валентин_НН

координатор
★★
В.Н.>>Самое похожее, что нашел это char, но что-то не срастается у меня с ним ничего :(
GOGI> Просто char - это один символ. Для строки нужен массив char.
а текстовые переменные, как в школьном бейсике уже не в тренде?
как щас помню -
29 CLS
30 PRINT AT(10,20) A$
31 INPUT B
 41.041.0
Это сообщение редактировалось 26.10.2015 в 19:58
RU GOGI #26.10.2015 20:06  @Валентин_НН#26.10.2015 19:52
+
-
edit
 

GOGI

старожил
★★★
В.Н.> а текстовые переменные, как в школьном бейсике уже не в тренде?
Не знаю как в С++, а в С их просто нет.
1  41.041.0
RU Валентин_НН #26.10.2015 20:10  @GOGI#26.10.2015 20:06
+
-
edit
 

Валентин_НН

координатор
★★
В.Н.>> а текстовые переменные, как в школьном бейсике уже не в тренде?
GOGI> Не знаю как в С++, а в С их просто нет.

хм. а как решается такая элементарная задача, как
10 input "введите ваше имя"A$
20 print "привет, "A$
 41.041.0
RU GOGI #26.10.2015 20:14  @Валентин_НН#26.10.2015 20:10
+
-
edit
 

GOGI

старожил
★★★
массивы char и стандартные библиотеки. В данном случае stdio
1  41.041.0
RU Валентин_НН #26.10.2015 20:22  @GOGI#26.10.2015 20:14
+
-
edit
 

Валентин_НН

координатор
★★
GOGI> массивы char и стандартные библиотеки. В данном случае stdio

[вздыхает]блин, как всё у вас непросто :(
 41.041.0

Mishka

модератор
★★☆
GOGI> Вот примерно так делается, как раз для твоего случая пример
GOGI, я понимаю, что код не твой, но можно я один коммент выскажу? :F
Маленькое изменение в один байт памяти позволит избежать некоторых ошибок в дальнейшем...
code c
  1.     #include <conio.h>
  2.     #include <stdio.h>
  3.     #include <stdlib.h>
  4.      
  5.     static char *ErrorNames[] = {
  6.         "",
  7.         "Index Out Of Bounds",
  8.         "Stack Overflow",
  9.         "Stack Underflow",
  10.         "Out of Memory"
  11.     };
  12.      
  13.     enum Errors {
  14.         INDEX_OUT_OF_BOUNDS = 1,
  15.         STACK_OVERFLOW,
  16.         STACK_UNDERFLOW,
  17.         OUT_OF_MEMORY
  18.     };
  19.      
  20.     void main() {
  21.         //ошибка случилась
  22.         printf(ErrorNames[INDEX_OUT_OF_BOUNDS]);
  23.         exit(INDEX_OUT_OF_BOUNDS);
  24.     }

Не будет проблемы единички. Т.е. 0 в возврате часто обозначает, что всё завершилось нормально (можно даже не пустую строку использовать, а "OK", тогда лучше в enum добавить и OK = 0), а первое сообщение об ошибке уже имеет код 1.
 37.037.0
US JackSmith #27.10.2015 08:03  @Валентин_НН#26.10.2015 19:52
+
-
edit
 

JackSmith

новичок

В.Н.> а текстовые переменные, как в школьном бейсике уже не в тренде?

между прочим, для AVR существует свой бейсик - BASCOM-AVR
 27.027.0
RU Валентин_НН #27.10.2015 09:55  @JackSmith#27.10.2015 08:03
+
-
edit
 

Валентин_НН

координатор
★★
В.Н.>> а текстовые переменные, как в школьном бейсике уже не в тренде?
JackSmith> между прочим, для AVR существует свой бейсик - BASCOM-AVR

Да нет. Тут уже надо бить в одну точку. А то сегодня поизучал Си, завтра бейсик, потом еще питон какой нибудь, прости господи. В итоге ничего и не изучил.
К тому же, в случае с Си у меня есть техподдержка на этом форуме, а с тем бейсиком я останусь один на один.
Так что продолжу погружение в Си.
 
RU GOGI #27.10.2015 10:41  @Валентин_НН#27.10.2015 09:55
+
-
edit
 

GOGI

старожил
★★★
В.Н.>а с тем бейсиком я останусь один на один.
В Bascom-AVR я писал, для начинающих неплохо, но странные глюки и ограниченность тем, что тебе предоставили разработчики (расширить функционал достаточно сложно) вынудили перейти к Си.
1  41.041.0
RU Валентин_НН #27.10.2015 21:39  @GOGI#26.10.2015 06:47
+
-
edit
 

Валентин_НН

координатор
★★
GOGI> Вот примерно так делается, как раз для твоего случая пример
Ура! Заработала!!! ©
мы заплатим золотом! (тоже ©)
 41.041.0

Balancer

администратор
★★★★☆
В.Н.>> а текстовые переменные, как в школьном бейсике уже не в тренде?
GOGI> Не знаю как в С++, а в С их просто нет.

В С++ есть куча реализаций соответствующих объектов в разных либах.

На Ардуино есть тип String.
 46.0.2490.8046.0.2490.80
RU Balancer #28.10.2015 13:23  @Валентин_НН#26.10.2015 20:10
+
-
edit
 

Balancer

администратор
★★★★☆
В.Н.> хм. а как решается такая элементарная задача, как
В.Н.> 10 input "введите ваше имя"A$

А input откуда? У тебя на Arduino есть клавиатура? :)
 46.0.2490.8046.0.2490.80
RU Валентин_НН #28.10.2015 13:40  @Balancer#28.10.2015 13:23
+
-
edit
 

Валентин_НН

координатор
★★
В.Н.>> хм. а как решается такая элементарная задача, как
В.Н.>> 10 input "введите ваше имя"A$
Balancer> А input откуда? У тебя на Arduino есть клавиатура? :)

[Покусывая сигару] мы тут про Си разговор ведем, коллега, а не про этот ардуиновский огрызок.
 
1 2 3 4 5

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru