Инициализация массива внутри класса

Я делаю игру змеи на щите Неофикселя adafruit и сталкиваюсь с проблемой. Как вы заполняете массив (в данном случае массив 5 * 8) со значениями после вызова класса. Это мой код до сих пор

H файл

#include <Arduino.h>
#include <Adafruit_NeoMatrix.h>
#include <streaming.h>

class Snake : public Adafruit_NeoMatrix 
{
    public:
    Snake();
    void drawSnake();

    private:
    int snakeBoard[5][8];
};

Файл CPP

#include "Snake.h"

Snake::Snake() : Adafruit_NeoMatrix(8, 5, D6,
  NEO_MATRIX_TOP        + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS       + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB               + NEO_KHZ800)
{
  begin(); // start the matrix
  show();

  int snakeBoard[5][8] = {{1,1,0,0,0,0,0,0},
                        {0,0,1,0,0,0,0,0},
                        {0,0,1,0,1,1,-1,0},
                        {0,0,1,1,1,0,0,0},
                        {0,0,0,0,0,0,0,0}};
}

void Snake::drawSnake()
{
  for(int y = 0; y < 5; y ++)
  {
    for(int x = 0; x < 8; x ++)
    {
      Serial << "X: " << x << " Y: " << y << " Value" << snakeBoard[x][y] << endl;
      delay(100);
    }
  }
  drawPixel(5,5,Color(0,0,255));
  show();
}

Когда я запускаю программу, на серийном мониторе печатается случайный мусор.

1 голос | спросил Matt 2 PMpMon, 02 Apr 2018 16:56:54 +030056Monday 2018, 16:56:54

1 ответ


1

Как уже упоминалось в @chrisl, вы создаете новую локальную переменную, которая затмевает вашего члена класса.

Простым способом получить то, что вы хотите, является memcpy ваши начальные значения в массив:

Snake::Snake() : Adafruit_NeoMatrix(8, 5, D6,
  NEO_MATRIX_TOP        + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS       + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB               + NEO_KHZ800)
{
  begin(); // start the matrix
  show();

  int initialSnakeBoard[5][8] {{1,1,0,0,0,0,0,0},
                        {0,0,1,0,0,0,0,0},
                        {0,0,1,0,1,1,-1,0},
                        {0,0,1,1,1,0,0,0},
                        {0,0,0,0,0,0,0,0}};
  memcpy(snakeBoard, initialSnakeBoard, sizeof(initialSnakeBoard));
}

Вы можете добиться того же, используя списки конструкторов C ++ 11 для инициализации своих членов ( см. здесь ):

Snake::Snake() : Adafruit_NeoMatrix(8, 5, D6,
  NEO_MATRIX_TOP        + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS       + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB               + NEO_KHZ800), 
  snakeBoard {{1,1,0,0,0,0,0,0},
                        {0,0,1,0,0,0,0,0},
                        {0,0,1,0,1,1,-1,0},
                        {0,0,1,1,1,0,0,0},
                        {0,0,0,0,0,0,0,0}}
{
  begin(); // start the matrix
  show();
}

У вас также есть ошибка в вашей подпрограмме drawSnake: вы путаете порядок индексов. С помощью snakeBoard[5][8] вы объявляете двухмерный целочисленный массив с 5 строками, содержащими по 8 элементов. Затем snakeBoard[0] будет указателем на первую строку (которая содержит 8 элементов). Таким образом, первый индекс y и должен находиться только от 0 до 4 включительно. Функция должна быть:

void Snake::drawSnake() {
    for(int y = 0; y < 5; y ++)
    {
        for(int x = 0; x < 8; x ++)
        {
            Serial.println("X: " + String(x) + " Y: " + String(y) + " Value " + String(snakeBoard[y][x]));
            delay(100);
        }
    }
}

Затем он печатает все ожидаемые элементы массива в порте Serial, как проверено на моем Arduino Nano.

ответил Maximilian Gerhardt 2 PMpMon, 02 Apr 2018 17:38:15 +030038Monday 2018, 17:38:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132