запрос «атрибута» члена в «объекте», который имеет неклассовый тип «int»

arduino-uno arduino-ide object-oriented

Я пытаюсь создать простую игру про змей, используя 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


1 ответ


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

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.

,

Теперь это настолько очевидно, что я вижу это. Это была глупая ошибка, которую я не заметил. Также вы на 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