И снова о GOTO. Метки из массива.

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

Всем привет.
Делаю табло на адресных светодиодах и кнопках. Каждая кнопка посылает свою цифру, которую программа должна прибавить к сумме и вывести на табло. Для вывода каждой цифры есть группа операторов в функции, на эту часть функции есть метки (а, 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];
  }

Если что, я - чайник. Но не тупой (очень надеюсь).

b707
Offline
Зарегистрирован: 26.05.2017

интересно. а что у вас выражает эта строчка

void out_number(int z = 1) 

почему в заголовке функции z =1 ?

 

Что касается ваших меток - почитайте про оператор switch - это именно то, что вы хотите

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

Это со значением по умолчанию. Не помню что хотел, если честно. Про switch гляну, спасибо.

А вообще, мой способ рабочий? После доработки, естесснно. Думаю что-то с типом данных. Не совпадает char из массива с типом меток.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ВладимирТ пишет:

А вообще, мой способ рабочий? После доработки, естесснно. Думаю что-то с типом данных. Не совпадает char из массива с типом меток.

А зачем? Трусы можно и через голову надевать, только нужно ли? ))

swith - самое то, что вам нужно

b707
Offline
Зарегистрирован: 26.05.2017

ВладимирТ пишет:

А вообще, мой способ рабочий? После доработки, естесснно. Думаю что-то с типом данных. Не совпадает char из массива с типом меток.

нет, не рабочий

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ВладимирТ пишет:

А вообще, мой способ рабочий? После доработки, естесснно.

Ваш способ - нерабочий. А что будет после доработки, никто кроме Вас не знает.

Цитата:

Думаю что-то с типом данных. Не совпадает char из массива с типом меток.

Конечно: a и 'a' - это разные вещи.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот так работает, запускайте. Тока ... говнокод же ж! Если что, то вот в этой теме есть ещё пример и кое-какие пояснения.

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) {}

 

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

Значит есть вариант таки. Спасибо большое. Запомню.

Я в курсе, что goto - нехороший вариант. Но чисто для эрудиции...