Ошибка: invalid types 'int[int]' for array subscript

Я пытаюсь заставить Arduino работать с некоторыми щитами Adafruit Motor. Вроде бы все работало нормально, но при попытке создать функцию получаю ошибку в теме. Насколько я могу судить, все было объявлено правильно (массив инициализируется и без проблем индексируется в другом месте). Кажется, проблема связана только с функцией.

Кто-нибудь догадается, в чем дело?

    //////// Импорт
    #include <Wire.h>
    #include <Adafruit_MotorShield.h>
    #include "utility/Adafruit_PWMServoDriver.h"

    ////////Мои глобальные переменные. Время указано в миллисекундах
    unsigned long currentTime = 0;
    unsigned long elapsedTime = 0;
    unsigned long startTime = 0;
    byte currentMotor = 1;
    byte currentShield = 1;
    byte motorRunning = 0;

    //// Настройки

    // Сколько секунд между моторами
    unsigned long endTime = 4000;

    // Сколько щитов и моторов на щит
    const int nShields = 1;
    const int nMotorsPerShield = 3;

    /////////Глобальные переменные MicroManager
    unsigned int version_ = 2;
    const unsigned long timeOut_ = 1000;
    byte currentPattern_ = 0;
    unsigned long time;

    /////////Глобальные данные Adafruit
    Adafruit_MotorShield afms[nShields];
    Adafruit_DCMotor *motor[nShields][nMotorsPerShield];

    ////////////Настраивать
    void setup() {
      Serial.begin(57600);

      unsigned char address = 96;

      for (int i = 0; i < nShields; i++) {
        afms[i] = Adafruit_MotorShield(address);
        address = ++address;
        afms[i].begin();
      }

      for (int i = 0; i < nShields; i++) {
        for (int j = 0; j < nMotorsPerShield; j++) {
          motor[i][j] = afms[i].getMotor(j + 1);
          motor[i][j]->setSpeed(255);
        }
      }

      pinMode(13, OUTPUT);
    }

    ////////////////////Основной
    void loop() {
      currentTime = millis();
      elapsedTime = currentTime - startTime;

      if (elapsedTime > endTime) {
        startTime = currentTime;
        currentMotor = currentMotor + 1;
        if (currentMotor > nMotorsPerShield) {
          currentMotor = 1;
        }
      }

      if (Serial.available() > 0) {
        int inByte = Serial.read();

        switch (inByte) {
          case 1:
            if (waitForSerial(timeOut_)) {
              currentPattern_ = Serial.read();
              if (currentPattern_ == 0) {
                for (int i = 0; i < nShields; i++) {
                  for (int j = 0; j < nMotorsPerShield; j++) {
                    motor[1][j]->run(RELEASE);
                  }
                }
              }
              else {
                switchMotor();
              }
              Serial.write( byte(1));
              digitalWrite(13, HIGH);
            }
            break;

          case 30:
            Serial.println("MM-Ard");
            break;

          case 31:
            Serial.println(version_);
            break;
        }
      }

      digitalWrite(13, LOW);
    }


    ////////////////Определения функций

    bool waitForSerial(unsigned long timeOut)
    {
      unsigned long starTime = millis();
      while (Serial.available() == 0 && (millis() - starTime < timeOut) ) {}
      if (Serial.available() > 0)
        return true;
      return false;
    }

    void switchMotor()
    {
      int shield = currentShield - 1;
      int motor = currentMotor - 1;
      for (int i = 0; i < nShields; i++) {
        for (int j = 0; j < nMotorsPerShield; j++) {
          if (i == shield && j == motor)
            motor[i][j]->run(FORWARD);
          else
            motor[i][j]->run(RELEASE);
        }
      }
    }

, 👍1

Обсуждение

Пожалуйста, опубликуйте полное сообщение об ошибке компилятора. И код, где это происходит., @Mikael Patel


2 ответа


Лучший ответ:

2

Внимательно посмотрите на эту строку:

motor[1][j]->run(RELEASE);

Похоже, так и должно быть:

motor[i][j]->run(RELEASE);

Иначе это недопустимый индекс (поскольку щит только один).

Следующая ошибка — в функции switchMotor(). Опять же, внимательно посмотрите на определение слова «мотор». Существует локальная переменная с таким именем, но вы также хотите получить доступ к глобальному массиву с тем же именем.

void switchMotor()
{
  int shield = currentShield - 1;
  int motor = currentMotor - 1;
      ^
  for (int i = 0; i < nShields; i++) {
    for (int j = 0; j < nMotorsPerShield; j++) {
      if (i == shield && j == motor)
        motor[i][j]->run(FORWARD);
        ^
      else
        motor[i][j]->run(RELEASE);
    }
  }
}

Я предполагаю, что именно здесь компилятор выдает вам сообщение об ошибке!

Удачи!

,

Чтобы иметь возможность помочь, вы должны добавить вывод ошибки компилятора со строкой, файлом и кодом. Это слишком много, чтобы предполагать обратное., @Mikael Patel

Изменение int Motor = и j == Motor на xmotor вместо motor позволяет мне прекрасно компилироваться. Просто избавьтесь от этого конфликта имен переменных, и все будет в порядке., @Majenko

Спасибо, Микаэль, проблема была в конфликте названий двигателей!, @Pedro Almada


0

Я получаю предупреждение в UECIDE для строки:

address = ++address;

‣ операция с адресом может быть неопределенной [-Wsequence-point]

Увеличьте адрес, а затем присвойте новое значение из адреса в адрес. Мне это кажется немного странным. Я думаю, вы просто хотели увеличить:

address++;

Или

address = address + 1;

Также он помечает 1 вместо i, который нашел Микаэль:

‣ индекс массива находится за пределами массива [-Warray-bounds]

И, конечно же, есть (несколько трудно заметить — спасибо Микаэлю за его нахождение — мне потребовалось некоторое время, чтобы увидеть это самому) конфликт имен:

‣ недопустимые типы 'int[int]' для индекса массива

Только когда я использовал расширенные возможности редактирования UECIDE, чтобы выделить все вхождения motor, я обнаружил, что были лишние слова, которых не должно было быть, вызывающих проблему.

Поэтому простое изменение имени целочисленной переменной с motor на что-то другое исправляет ситуацию:

void switchMotor()
{
  int shield = currentShield - 1;
  int thismotor = currentMotor - 1;       // ПЕРЕИМЕНОВАН МОТОР
  for (int i = 0; i < nShields; i++) {
    for (int j = 0; j < nMotorsPerShield; j++) {
      if (i == shield && j == thismotor)  // ПЕРЕИМЕНОВАН МОТОР
        motor[i][j]->run(FORWARD);
      else
        motor[i][j]->run(RELEASE);
    }
  }
}
,

Приветствую, в этом была проблема!, @Pedro Almada