запрос «атрибута» члена в «объекте», который имеет неклассовый тип «int»
Я пытаюсь создать простую игру про змей, используя Arduino UNO вместе с модулем MAX72XX, ЖК-модулем и модулем аналогового джойстика. Я хочу запрограммировать свою программу, используя объектно-ориентированное программирование. У меня нет опыта работы с C++, поэтому я довольно долго пытаюсь понять, что мне пытается сказать следующая ошибка: 'int'. Вот полный код:
#include "LedControl.h"
#include <LiquidCrystal.h>
LedControl lc=LedControl(12,10,11,1);
LiquidCrystal lcd(8, 13, 3, 5, 6, 7);
/*lcd.setCursor(0, 1);
// вывести количество секунд с момента сброса:
lcd.print(millis() / 1000);*/
class Snake_body
{
//частный:
public:
int following_direction;
int body_length[64];
int x;
int y;
int previous_x;
int previous_y;
Snake_body(int x_value, int y_value)
{
this->following_direction = 1;
this->x = x_value;
this->y = y_value;
this->previous_y = y_value;
this->previous_x = x_value;
}
/*void configure(int x_value, int y_value)
{
this->following_direction = 1;
this->x = x_value;
this->y = y_value;
this->previous_y = y_value;
this->previous_x = x_value;
}*/
};
class Power_up
{
private:
public:
virtual void init()
{
this->x = 0;
this->y = 0;
}
int x;
int y;
};
int snake[64];
int snakes_length;
Snake_body *snake_body;
Power_up *power_up;
void setup() {
lcd.begin(16, 1);
snakes_length = 1;
for(int z = 1; z < 64; z++)
{
snake[z] = 0;
}
snake[0] = new Snake_body(0,0);
//Snake_body змея[0] = new Snake_body();
//змея[0].configure(0,0);
// поместите сюда код установки для однократного запуска:
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
pinMode(2, INPUT);
digitalWrite(2, HIGH);
Serial.begin(9600);
power_up->x = random(0, 8);
power_up->y = random(0, 8);
}
int snake_direction;
void loop()
{
int x_axis = analogRead(A0);
int y_axis = analogRead(A1);
int switcher = digitalRead(2);
if(x_axis <= 400) //&& х < 7)
{
snake[0].following_direction = 0;
//х += 1;
//Serial.println("правильно");
}
else if(x_axis >= 600) //&& х > 0)
{
snake[0].following_direction = 1;
//х -= 1;
//Serial.println("слева");
}
else if(y_axis <= 400) //&& у > 0)
{
snake[0].following_direction = 2;
//у -= 1;
//Serial.println("вверх");
}
else if(y_axis >= 600) //&& у < 7)
{
snake[0].following_direction = 3;
//у += 1;
//Serial.println("вниз");
}
if(snake[0].following_direction == 0 && snake[0].x < 7)
{
snake[0].previous_x = snake[0].x;
snake[0].x += 1;
}
else if(snake[0].following_direction == 1 && snake[0].x > 0)
{
snake[0].previous_x = snake[0].x;
snake[0].x -= 1;
}
else if(snake[0].following_direction == 2 && snake[0].y > 0)
{
snake[0].previous_y = snake[0].y;
snake[0].y -= 1;
}
else if(snake[0].following_direction == 3 && snake[0].y < 7)
{
snake[0].previous_y = snake[0].y;
snake[0].y += 1;
}
for(int a = 1; a < 64; a++)
{
if(snake[i] != 0)
{
snake[i].x = snake[i-1].previous_x;
snake[i].y = snake[i-1].previous_y;
}
}
lc.setLed(0,power_up->x,power_up->y,true);
for(int w = 0; w < 64; w++)
{
if(snake[w] != 0)
{
lc.setLed(0,snake[w].x,snake[w].y,true);
}
}
if(snake[0].x == power_up->x && snake[0].y == power_up->y)
{
power_up->x = random(0, 8);
power_up->y = random(0, 8);
for(int i = 0; i < 64; i++)
{
if(snake[i] == 0)
{
Snake_body *snake[i];
//next_snake_body = new Snake_body();
snake[i] = new Snake_body(snake[i-1].previous_x, snake[i-1].previous_y);
//Snake_body next_snake_body;
//змея[i].configure(змея[i-1].previous_x, змея[i-1].previous_y);
}
}
}
/*Serial.print("x: ");
Serial.print(snake.x);
Serial.println();
Serial.print("y: ");
Serial.print(snake.y);
Serial.println();*/
if(switcher == 0)
{
delay(50);
}
else
{
delay(100);
}
lc.clearDisplay(0);
}
ошибка исходит из этой строки здесь:
else if(snake[0].following_direction == 3 && snake[0].y < 7)
но я думаю, что это происходит и во всех других линиях, которые похожи на эту.
Я попытался заменить .
в snake[0].following_direction
на ->
, но это только вызвало ошибку: базовый операнд '-> ' не является указателем
. У меня есть опыт программирования на java, python и некоторых других, но не на arduino C++.
1 ответ
Лучший ответ:
Проблема действительно в этой строке:
else if(snake[0].following_direction == 3 && snake[0].y < 7)
И особенно в:
snake[0].following_direction
змея определяется как
int snake[64];
Таким образом, snake[0]
имеет тип int
.
И вы не можете запросить элемент following_direction
из типа.
Поскольку вы создаете новые экземпляры с помощью:
snake[0] = new Snake_body(0,0)
Я предполагаю, что snake
должен быть массивом Snake_body.
Поэтому я предлагаю (как минимум) изменить тип на:
Snake_body snake[64];
Кроме того, я думаю, что один экземпляр Snake_body может занимать около 16 байт, а вы делаете их 64, в результате получается 1024 байта, что составляет половину памяти Arduino Uno. Кроме того, иногда библиотека занимает некоторое пространство, так что имейте это в виду, если вы собираетесь добавить дополнительные библиотеки/глобальные переменные или место в стеке.
Обновить
Кроме того, следующая строка кажется неправильной:
snake[0] = new Snake_body(0,0);
Вы уже создали 64 экземпляра Snake_body (и назначили snake
) после внесения моего изменения. Так что вам не нужно делать это самостоятельно; на самом деле вы не можете, если вы не создадите массив POINTERS на Snake_body
.
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
Теперь это настолько очевидно, что я вижу это. Это была глупая ошибка, которую я не заметил. Также вы на 100% правы, думая, что змея — это массив змеи_тела. Я, вероятно, сделал это, потому что я привык делать массивы целых чисел. Ты такая легенда! Ваше здоровье!, @The_Indestructible_Cat
Однако есть одна проблема: когда я делаю строку
Snake_body змея[64];
, она думает, что это функция., @The_Indestructible_CatМожете ли вы добавить строку и точную ошибку, которую вы получаете (она думает, что это функция, мне этого недостаточно, чтобы увидеть, что не так), @Michel Keijzers
Я добавил обновление., @Michel Keijzers
Разве
snake[64]
не просто массив, который принимает объекты-змеи. Как бы я точно определилsnake[0]
как новый объект змеи.змея[0]
должна быть передней частью змеи., @The_Indestructible_CatБудет ли указатель указывать на каждый объект змеи в массиве?, @The_Indestructible_Cat
Однако вы можете написать
snake[0] = new Snake_body(...)
, тогда вы должны объявить тип какSnake_body* змеи[64]';
и сохранить переменную, чтобы показать, сколько элементов заправлен/использован., @Michel KeijzersЯ уже создал механизм для просмотра количества элементов в списке. Вот тут-то и появляется
int змеи_длина;
., @The_Indestructible_CatПроблема теперь решена, но программа все еще работает над ней. Дело в том, о чем мой вопрос., @The_Indestructible_Cat
Да, эта переменная int — хороший способ отслеживать (так что это похоже на объект стека). Если решение помогло вам проголосовать за него, пожалуйста, и если оно решает вашу проблему, также примите ответ (вы можете нажать рядом с ответом). Удачи в вашей игре (наверное) и наслаждайтесь Arduino Stack Exchange., @Michel Keijzers