使用数组作为“转到”标签

时间:2018-12-12 04:12:23

标签: c++ arrays arduino goto

我正在研究一个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扩展器IC,每个IC在其各自的引脚上的for环路​​运行基本相同。然后,我希望能够有一种方法告诉微控制器以一定顺序激活扩展器芯片的for循环。我的计划是拥有一个具有不同标签的数组,以便我可以根据最近使用的标签来更改标签的顺序,从而根据需要更改执行循环的顺序。我没有排除这是不必要的可能性,但认为尝试会很有趣。

1 个答案:

答案 0 :(得分:2)

您无法在标准C ++中做到这一点,但GCC具有Labels as Values扩展名:

#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)。