Ошибка: 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);
}
}
}
@Pedro Almada, 👍1
Обсуждение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
Я получаю предупреждение в 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Пожалуйста, опубликуйте полное сообщение об ошибке компилятора. И код, где это происходит., @Mikael Patel