И снова о GOTO. Метки из массива.
- Войдите на сайт для отправки комментариев
Ср, 16/12/2020 - 00:14
Всем привет.
Делаю табло на адресных светодиодах и кнопках. Каждая кнопка посылает свою цифру, которую программа должна прибавить к сумме и вывести на табло. Для вывода каждой цифры есть группа операторов в функции, на эту часть функции есть метки (а, b, c и т.д.). Эти метки лежат в массиве. Параметр функции говорит ей какую цифру надо выводить. Короче, примерно так:
char number_for_out[] = {'j', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'};
//ЕДИНИЦЫ
void out_number(int z = 1) {
if (z < 10) {
goto *number_for_out[z];
}
a:
for (int i = 0; i < 2; i++ ) { // вывод "1"
strip.setPixelColor(seg[1][i], 0xff0000);
strip.setPixelColor(seg[2][i], 0xff0000);
strip.show(); // отправить на ленту
delay(100);
}
{
return;
}
b:
for (int i = 0; i < 2; i++ ) { // вывод "2"
strip.setPixelColor(seg[6][i], 0xff0000);
strip.setPixelColor(seg[1][i], 0xff0000);
strip.setPixelColor(seg[7][i], 0xff0000);
strip.setPixelColor(seg[4][i], 0xff0000);
strip.setPixelColor(seg[3][i], 0xff0000);
strip.show();
delay(100);
}{
return;
}
и т.д.
Но это не работает. Скажите, рабочая ли такая конструкция? Я вызываю out_number(1), и мечтаю, что goto увидит 2 ячейку массива с меткой "а" и пошлёт на неё.
void out_number(int z = 1) {
if (z < 10) {
goto *number_for_out[z];
}
Если что, я - чайник. Но не тупой (очень надеюсь).
интересно. а что у вас выражает эта строчка
почему в заголовке функции z =1 ?
Что касается ваших меток - почитайте про оператор switch - это именно то, что вы хотите
Это со значением по умолчанию. Не помню что хотел, если честно. Про switch гляну, спасибо.
А вообще, мой способ рабочий? После доработки, естесснно. Думаю что-то с типом данных. Не совпадает char из массива с типом меток.
А вообще, мой способ рабочий? После доработки, естесснно. Думаю что-то с типом данных. Не совпадает char из массива с типом меток.
А зачем? Трусы можно и через голову надевать, только нужно ли? ))
swith - самое то, что вам нужно
А вообще, мой способ рабочий? После доработки, естесснно. Думаю что-то с типом данных. Не совпадает char из массива с типом меток.
нет, не рабочий
А вообще, мой способ рабочий? После доработки, естесснно.
Ваш способ - нерабочий. А что будет после доработки, никто кроме Вас не знает.
Думаю что-то с типом данных. Не совпадает char из массива с типом меток.
Конечно: a и 'a' - это разные вещи.
Вот так работает, запускайте. Тока ... говнокод же ж! Если что, то вот в этой теме есть ещё пример и кое-какие пояснения.
void setup(void) { Serial.begin(57600); void * lab[] = {&&kaka, &&mumu, &&kuku, &&fin}; // это массив меток const int totalLabels = sizeof(lab)/sizeof(lab[0]); int i = 0; beg: // // Ходим по всем меткам в цикле // while (i < totalLabels) goto *lab[i++]; kaka: Serial.println("Kaka Label Area"); goto beg; mumu: Serial.println("Mumu Label Area"); goto beg; kuku: Serial.println("Kuku Label Area"); goto beg; fin: Serial.println("fin Label Area"); } void loop(void) {}Значит есть вариант таки. Спасибо большое. Запомню.
Я в курсе, что goto - нехороший вариант. Но чисто для эрудиции...