Использование массива в качестве метки "goto" - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над проектом Arduino, и мне было интересно, возможно ли использовать значение из массива в команде goto.В принципе, если у меня есть массив строк, где каждый элемент соответствует метке в моем коде, есть ли способ поместить массив с соответствующим значением индекса в качестве метки для команды?Я включаю только часть своего неполного кода, чтобы, надеюсь, помочь донести свою точку зрения.

int power = 2;
String Labels[4] = {"chip_1", "chip_2", "chip_3", "end"};

chip_1: //label
power += 1;
for (int i = 0; i <= 2; i++) {

    buttonState[i] = digitalRead(buttonPins[i]);

    if (buttonState[i] != buttonLastState[i]){
      if (buttonState[i] == HIGH) {
        Serial.println("Button" + String(i) + "ON");
        digitalWrite(buttonPins[i], HIGH);
      }
      else {
        Serial.println("Button" + String(i) + "OFF");
        digitalWrite(buttonPins[i], LOW);
      }

      buttonLastState[i] = buttonState[1];
    }

  }
goto Labels[power]

chip_2: //next label

В основном у меня есть несколько интегральных схем MCP23017, каждая из которых будет работать по существу одинаково для цикла for на своих соответствующих выводах.Я хочу, чтобы у меня был способ сообщить микроконтроллеру, что нужно активировать циклы for микросхем расширения в определенном порядке.Мой план состоял в том, чтобы иметь массив, который имел разные метки, чтобы я мог изменить порядок меток на основе того, какие из них использовались совсем недавно, и, таким образом, изменить порядок выполнения циклов по мере необходимости.Я не исключал, что это не нужно, но подумал, что было бы интересно попробовать.

1 Ответ

0 голосов
/ 12 декабря 2018

Вы не можете сделать это в стандартном C ++, но GCC имеет Метки как значения * Расширение 1002 *:

#include <iostream>

int main()
{
    void *arr[3] = {&&label1, &&label2, &&label3};

    int i;
    for (i = 0; i < 3; i++)
    {
        goto *arr[i];
      ret:;
    }

    // Prints `123`

    return 0;

  label1:
    std::cout << 1;
    goto ret;
  label2:
    std::cout << 2;
    goto ret;
  label3:
    std::cout << 3;
    goto ret;
}

В стандартном C ++ вместо этого можно хранить массив целых чисели используйте switch для выбора действий на основе этих целых чисел.

В качестве альтернативы, вы можете попробовать использовать массив указателей на функции (или даже std::function s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...