Инициализация двумерного массива с классом stati c const integer - PullRequest
2 голосов
/ 05 марта 2020

Я объявляю трехмерный массив как член класса, используя stati c const членов класса в качестве первых двух границ:

class A
{
    static const uint8_t screenWidth = 256;
    static const uint8_t screenHeight = 240;

    uint8_t buffer[screenHeight][screenWidth ][3];
}

в Visual Studio 2019 я получаю следующее (странно ?) ошибка:

Error (active)  E0098   an array may not have elements of this type

если я прибегну к "хаку перечисления", чтобы объявить целочисленные константы времени компиляции класса, это работает:

class A
{
    enum { SH = 240, SW = 256};
    uint8_t buffer[SH][SW][3];
}

не должно быть первым пример быть C ++ 11-совместимым кодом? (Я думаю, компилятор Visual Studio 2019 есть.)

Ответы [ 3 ]

4 голосов
/ 05 марта 2020

Я думаю, что объект типа uint8_t не может содержать значение 256.:)

Почему бы просто не использовать тип size_t вместо типа uint8_t?

static const size_t screenWidth = 256;
static const size_t screenHeight = 240;
2 голосов
/ 05 марта 2020

Ваша проблема с переполнением uint8_t

static const uint8_t screenWidth = 256;//effectively 0

и представляет собой большой круглый НОЛЬ. См. .

Чтобы исправить, переключитесь на eg. size_t (также больше подходит для размеров)

2 голосов
/ 05 марта 2020

Проблема, с которой вы столкнулись, заключается в том, что в объявлении:

static const uint8_t screenWidth = 256;

значение 256 недопустимо для типа uint8_t (диапазон от 0 до 255), и оно «переворачивается» 'дать фактическое значение ноль - что недопустимо для измерения массива.

Сделайте ваше измерение «константами» большего типа, и ваш код будет работать:

class A {
    static const uint16_t screenWidth = 256;
    static const uint16_t screenHeight = 240;

    uint8_t buffer[screenHeight][screenWidth][3];
};
...