Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 31.08.2017
Сообщений: 12
1

Передача переменных из подпрограмм

23.06.2020, 16:55. Просмотров 1012. Ответов 4
Метки loop (Все метки)

Добрый день!
Хочу сделать ребёнку игрушку для тренировки арифметики
Завалялись светодиодная матрица 8х8х4
и клавиатура 4х4

начал писать код, давно не занимался (поэтому прошу художника не обижать)))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <SPI.h>                            // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                   // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                   // Подключаем библиотеку Max72xxPanel
#include <Keypad.h>                         // Подключаем библиотеку клавиатуры 4х4
 
#include "fonts.h"
 
// Подключаем Матрицк 8х32
# define pinCS 10                            // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
 
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
 
// Подключаем клавиатуру 4х4
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
char numkeys[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
 
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
// Подключаем Зуммер
# define beeppin 12
 
//Писанина
String text1 = "ynp-";
String text2 = "Tun-";
 
// Обнуляшки
byte x = 0; // первое слогаемое (множитель)
byte y = 0; // второе слогаемое (множитель)
byte k = 0; // количество нажатий на кнопки
char preskeys[2] = {'0', '0'}; //какие кнопочки нажаты
 
int result = 0;   // результат ввода
int numtests = 0; // количество заданий
int typtests = 0; // выбор формата заданий: 1 - умножение, 2 - сложение и вычитание, 3 - микс
 
//Функции
 
void setup() {
  Serial.begin(9600);
  // Подготовка матрицы
  matrix.setIntensity(7); // яркость от 0 до 15
  matrix.setRotation(1);  // Ориентация квадратиков
  matrix.fillScreen(LOW); // Очистка картинки
  matrix.write();
 
 
  // Задаём новый отчёт для псевдослуч. последовательности из "воздуха" на пине "A0"
  randomSeed(analogRead(A0));
 
  // Подключаем Зуммер
  pinMode(beeppin, OUTPUT);
 
}
 
void loop() {
  numtests = 0;
  int numtests2 = 0;
  Serial.print ("Количкество тестов = "); Serial.println (numtests);
  Serial.print ("Количкество тестов 2= "); Serial.println (numtests2);
  
  while (numtests == 0) {
    NumTest();              // Спрашиваем - сколько будет упражнений?
    numtests2 = EnterNum();  //количество заданий от 1 до 99
    if (numtests2 > 0 && numtests < 100) {
      numtests = numtests2;
      break;
    }
  }
 
 
Serial.print ("Количкество тестов всего += "); Serial.println (numtests);
Serial.print ("Количкество тестов всего 2+= "); Serial.println (numtests2);
 
 
//if (typtests == 0){
//typtests1 = TypeTest();// выбор формата заданий: 1 - умножение, 2 - сложение и вычитание, 3 - микс
// }
// Serial.print ("Тип тестов = "); Serial.println (typtests); Serial.println (typtests1);
// delay (500);
 
}
 
 
 
// Тренеруемся складывать
int SumTrener(byte paramX, byte paramY) {
  return (paramX + paramY);
}
 
// Тренеруемся вычитать
int SubtractionTrener(byte paramX, byte paramY) {
  return (abs(paramX - paramY));
}
 
// Спрашиваем - сколько будет упражнений?
void NumTest() {
  for ( int i = 0 ; i < text1.length(); i++ ) {
    matrix.drawChar(i * 5, 0, text1[i], HIGH, LOW, 1);
    matrix.write();
  }
}
 
 
// Ввод значений
int  EnterNum() {
 
  char key = keypad.getKey();
 
  if (key) {
 
    if ((key == numkeys[0] || key == numkeys[1] || key == numkeys[2] || key == numkeys[3] || key == numkeys[4] || key == numkeys[5] || key == numkeys[6] || key == numkeys[7] || key == numkeys[8] || key == numkeys[9]) && k < 2) {
      matrix.drawChar(21 + k * 6, 0, key, HIGH, LOW, 1); // Пишем название нажатой клавиши
      matrix.write();
      preskeys[k] = key;
      k++;
      //Serial.println(k);Serial.println(key);Serial.println(preskeys[0]);Serial.println(preskeys[1]);
      //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
    }
 
    else if ((key == keys[3][3]) && k > 0 ) { // если нажали кнопку Д и при этом хотя бы 1 символ напечатан
      matrix.drawChar(21 + (k - 1) * 6, 0, ' ', HIGH, LOW, 1); // Стираем пробелом
      matrix.write();
      k--;
      preskeys[k] = '0';
      //Serial.println(k); Serial.println(key); Serial.println(preskeys[0]); Serial.println(preskeys[1]);
      //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
    }
 
    else if ((key == keys[0][3] || key == keys[1][3] || key == keys[2][3] || key == keys[3][0] || key == keys[3][2]) && k > 0) { // если нажали любую не цифру и не Д то считаем значение
      matrix.drawChar(21, 0, 'O', HIGH, LOW, 1); // Пишем ОК
      matrix.drawChar(27, 0, 'K', HIGH, LOW, 1); // Пишем ОК
      matrix.write();
      //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
      if (k == 1) {
        result = preskeys[0] - '0';
      } else {
        result = (preskeys[0] - '0') * 10 + (preskeys[1] - '0');
      }
 
      Serial.println(k); Serial.println(preskeys[0]); Serial.println(preskeys[1]);
      Serial.println (result);
      return result;
    }
  }
}
 
// выбор формата заданий: 1 - умножение, 2 - сложение и вычитание, 3 - микс
int  TypeTest() {
  int  type1 = 0;
  char key1 = keypad.getKey();
 
 
  for (int i = 0 ; i < text2.length(); i++ ) {
    matrix.drawChar(i * 5, 0, text2[i], HIGH, LOW, 1);
    matrix.write();
  }
 
  if (key1) {
    if (key1 == numkeys[1] || key1 == numkeys[2] || key1 == numkeys[3]) {
      matrix.drawChar(21, 0, key1, HIGH, LOW, 1); // Пишем название нажатой клавиши
      matrix.write();
      type1 = key1 - '0';
      //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
      Serial.println(key1);
      delay (1000);
      return (type1);
    }
  }
}
Пока следующая проблема :
подпрограмма EnterNum() должна вернуть в loop количество примеров для решения result, но переменные сходят с ума! Как я их только не объявлял. Всё осложняется тем, что loop выскакивает из бесконечных циклов while.
Кто разбирается, пожалуйста - подскажите как грамотнее сделать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2020, 16:55
Ответы с готовыми решениями:

Задание переменных для подпрограмм
Добрый день! Не получается задать переменные для подпрограмм (a, b, N), их надо задать с консоли...

Передача значений переменных или ссылок, неконтролируемое изменение переменных
// заголовок класса ObservableCollection&lt;LineDom&gt; Method1; Method1 = new...

Передача переменных
Привет всем. Такой вопрос: Есть некая форма, в которую вводится значение переменной Х и передаётся...

Передача переменных
Добрый день дорогие форумчане!! Возник такой вопрос: Передо мной стоит задача, реализовать...

4
Модератор
8199 / 6070 / 810
Регистрация: 14.02.2011
Сообщений: 21,055
23.06.2020, 18:14 2
Цитата Сообщение от Zolo_T Посмотреть сообщение
подпрограмма EnterNum() должна вернуть в loop количество примеров для решения result
вижу возврат только из одной ветки
Цитата Сообщение от Zolo_T Посмотреть сообщение
return result;
что функция вернет если попадет в другую ветку?
Цитата Сообщение от Zolo_T Посмотреть сообщение
Всё осложняется тем, что loop выскакивает из бесконечных циклов while.
не вижу бесконечных циклов это раз
а два зачем бесконечные циклы в loop ?
1
0 / 0 / 0
Регистрация: 31.08.2017
Сообщений: 12
23.06.2020, 21:17  [ТС] 3
Вот...

Добавлено через 1 минуту
Забавно то, что первый цикл while в loop работает теперь "как надо" а два следующих проскакивают насквозь...

Добавлено через 1 минуту
новый вариант кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <SPI.h>                            // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                   // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                   // Подключаем библиотеку Max72xxPanel
#include <Keypad.h>                         // Подключаем библиотеку клавиатуры 4х4
 
#include "fonts.h"
 
// Подключаем Матрицк 8х32
# define pinCS 10                            // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
 
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
 
// Подключаем клавиатуру 4х4
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
char numkeys[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
 
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
// Подключаем Зуммер
# define beeppin 12
 
//Писанина
String text1 = "ynp-";
String text2 = "Tun-";
String text3 = "MAX-";
 
// Обнуляшки
byte x = 0; // первое слогаемое (множитель)
byte y = 0; // второе слогаемое (множитель)
byte k = 0; // количество нажатий на кнопки
char preskeys[2] = {'0', '0'}; //какие кнопочки нажаты
 
int result = 0;   // результат ввода
int numtests = 0; // количество заданий
int typtests = 0; // выбор формата заданий: 1 - умножение, 2 - сложение и вычитание, 3 - микс
int predel = 0;   // установить предел для упражнений для умножения от 1 до 9
 
//Функции
 
void setup() {
  Serial.begin(9600);
  // Подготовка матрицы
  matrix.setIntensity(7); // яркость от 0 до 15
  matrix.setRotation(1);  // Ориентация квадратиков
  matrix.fillScreen(LOW); // Очистка картинки
  matrix.write();
 
 
  // Задаём новый отчёт для псевдослуч. последовательности из "воздуха" на пине "A0"
  randomSeed(analogRead(A0));
 
  // Подключаем Зуммер
  pinMode(beeppin, OUTPUT);
}
 
void loop() {
  // Ввод значений - количество упражнений
  while ((numtests == 0) || (result == 0)) {
    numtests =  NumTest();   //количество заданий от 1 до 99
    if (numtests > 0 && numtests < 100) {
      delay (500);
      matrix.fillScreen(LOW); // Очистка картинки
      matrix.write();
      Serial.print ("Количкество тестов всего = "); Serial.println (numtests);
      break;
    }
  }
 
  // Ввод значений - тип упражнений
  while ((typtests) == 0 || (typtests > 3)) {
    typtests = TypeTest();// выбор формата заданий: 1 - умножение, 2 - сложение и вычитание, 3 - микс
    if (typtests > 0 && typtests <= 3) {
      delay (500);
      matrix.fillScreen(LOW); // Очистка картинки
      matrix.write();
      Serial.print ("Тип тестов выбран= "); Serial.println (typtests);
      break;
    }
  }
 
  //Ввод значений - предел умножения
  while ((predel) == 0 || (predel > 9)) {
    predel = PredelTest(); // выбор предела умножения от 1 до 9
    if (predel > 0 && predel <= 9) {
      delay (500);
      matrix.fillScreen(LOW); // Очистка картинки
      matrix.write();
      Serial.print ("Предел выбран= "); Serial.println (predel);
      break;
    }
  }
}
 
 
 
// Тренеруемся складывать
int SumTrener(byte paramX, byte paramY) {
  return (paramX + paramY);
}
 
// Тренеруемся вычитать
int SubtractionTrener(byte paramX, byte paramY) {
  return (abs(paramX - paramY));
}
 
// Спрашиваем - сколько будет упражнений?
int NumTest() {
  int numtests2 = 0;
  for ( int i = 0 ; i < text1.length(); i++ ) {
    matrix.drawChar(i * 5, 0, text1[i], HIGH, LOW, 1);
    matrix.write();
  }
  numtests2 = EnterNum();
  return numtests2;
}
 
 
// Ввод значений
int  EnterNum() {
 
  char key = keypad.getKey();
 
  if ((key == numkeys[0] || key == numkeys[1] || key == numkeys[2] || key == numkeys[3] || key == numkeys[4] || key == numkeys[5] || key == numkeys[6] || key == numkeys[7] || key == numkeys[8] || key == numkeys[9]) && k < 2) {
    matrix.drawChar(21 + k * 6, 0, key, HIGH, LOW, 1); // Пишем название нажатой клавиши
    matrix.write();
    preskeys[k] = key;
    k++;
    //Serial.println(k);Serial.println(key);Serial.println(preskeys[0]);Serial.println(preskeys[1]);
    //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
  }
 
  else if ((key == keys[3][3]) && k > 0 ) { // если нажали кнопку Д и при этом хотя бы 1 символ напечатан
    matrix.drawChar(21 + (k - 1) * 6, 0, ' ', HIGH, LOW, 1); // Стираем пробелом
    matrix.write();
    k--;
    preskeys[k] = '0';
    //Serial.println(k); Serial.println(key); Serial.println(preskeys[0]); Serial.println(preskeys[1]);
    //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
  }
 
  else if ((key == keys[0][3] || key == keys[1][3] || key == keys[2][3] || key == keys[3][0] || key == keys[3][2]) && k > 0) { // если нажали любую не цифру и не Д то считаем значение
    matrix.drawChar(21, 0, 'O', HIGH, LOW, 1); // Пишем ОК
    matrix.drawChar(27, 0, 'K', HIGH, LOW, 1); // Пишем ОК
    matrix.write();
    //digitalWrite (beeppin, 1); delay (700); digitalWrite (beeppin, 0);
    if (k == 1) {
      result = preskeys[0] - '0';
    } else {
      result = (preskeys[0] - '0') * 10 + (preskeys[1] - '0');
    }
    //Serial.println(k); Serial.println(preskeys[0]); Serial.println(preskeys[1]);   Serial.println (result);
    return result;
  }
}
 
// выбор формата заданий: 1 - умножение, 2 - сложение и вычитание, 3 - микс
int  TypeTest() {
  int  type1 = 0;
  typtests = 0;
  char key1 = keypad.getKey();
 
  for (int i = 0 ; i < text2.length(); i++ ) {
    matrix.drawChar(i * 5, 0, text2[i], HIGH, LOW, 1);
    matrix.write();
  }
 
  if (key1 == numkeys[1] || key1 == numkeys[2] || key1 == numkeys[3]) {
    matrix.drawChar(21, 0, key1, HIGH, LOW, 1); // Пишем название нажатой клавиши
    matrix.write();
    type1 = key1 - '0';
    //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
    return (type1);
  }
}
 
// Выясняем - предел таблицы умножения?
int PredelTest() {
  int predel2 = 0;
  predel = 2;
  char key2 = keypad.getKey();
 
  for ( int i = 0 ; i < text3.length(); i++ ) {
    matrix.drawChar(i * 5, 0, text1[i], HIGH, LOW, 1);
    matrix.write();
  }
  if (key2 == numkeys[1] || key2 == numkeys[2] || key2 == numkeys[3] || key2 == numkeys[4] || key2 == numkeys[5] || key2 == numkeys[6] || key2 == numkeys[7] || key2 == numkeys[8] || key2 == numkeys[9]) {
    matrix.drawChar(21, 0, key2, HIGH, LOW, 1); // Пишем название нажатой клавиши
    matrix.write();
    predel2 = key2 - '0';
    //digitalWrite (beeppin, 1); delay (200); digitalWrite (beeppin, 0);
    return (predel2);
  }
}
Добавлено через 1 минуту
Циклы теперь не бесконечные, но бесконечный точно так же "проскакивал".
0
С чаем беда...
Эксперт CЭксперт С++
7236 / 3568 / 966
Регистрация: 18.10.2014
Сообщений: 7,268
25.06.2020, 01:17 4
Лучший ответ Сообщение было отмечено Zolo_T как решение

Решение

Цитата Сообщение от Zolo_T Посмотреть сообщение
иклы теперь не бесконечные, но бесконечный точно так же "проскакивал".
Так а почему бы им не проскакивать? Вы же не ждете нажатия клавиши в EnterNum, а просто проверяете статус клавиатуры, после чего сразу вылетаете из функции (даже если ничего не было нажато), ничего не возвращая (т.е. возвращая мусор). Ну а из-за этого мусора потом что угодно может происходить.

И что означает комментарий "//количество заданий от 1 до 99", когда ваша EnterNum проверяет одно-единственное нажатие клавиши? Как одним нажатием клавиши можно ввести 99?
1
0 / 0 / 0
Регистрация: 31.08.2017
Сообщений: 12
25.06.2020, 12:24  [ТС] 5
EnterNum - работает как надо ). возврат значения (return куыгде) происходит по условию нажатия определённых кнопок и при наличии введённого значения. До этого подрограмма Enternum крутится в цикле while.

Другие подпрограммы построены по той же логике , но работают, почему-то, иначе...

Но то, что вы сказали я понял.. Попробую подкрутить код, спасибо.

Добавлено через 27 минут
Да - виноват был мусорный возврат !!! СПАСИБО!!!

Добавлено через 5 минут
Почему-то думал, что по-умолчанию функция "0" возвращает, туплюююю... )))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2020, 12:24

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

Передача переменных
Как передать переменную через через форму кнопкой без поле ввода.

передача переменных
мне надо передать переменную $p допустим переменная $p=date(&quot;dmY&quot;); мне надо её передать я...

Передача переменных
Доброго времени суток, на сайте имееться 10 страниц, на каждой странице выводиться из mysql 3...

Передача переменных
Добрый день. Есть несколько UserForm на которых находятся по два OptionButton, эти UserForm...

Передача переменных
Подскажите, пожалуйста, как с одного ViewController передать на другой несколько переменных? ...

Передача переменных.
Опыт в C# маленький. Вопрос простой. Собственно, от нетерпения возник. Прочитал 82 страницы книги...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.