Почему это дает мне ошибку? - PullRequest
0 голосов
/ 23 октября 2010

Это:

bool grid[1280][1024];
for (int x = 0; x<1280; x++)
{
    for (int y = 0; y<1024; y++)
    {
        grid[x][y] = false;
    }
}

отлично работает, но

bool grid[1280][1024];
bool grid2[1280][1024];

for (int x = 0; x<1280; x++)
{
    for (int y = 0; y<1024; y++)
    {
        grid[x][y] = false;
        grid2[x][y] = false;
    }
}

дает мне ошибку. Почему?

Ответы [ 4 ]

5 голосов
/ 23 октября 2010

Вероятно, недостаточно места в стеке, ваш второй пример также дает сбой на моем ПК.Попробуйте выделить в куче или, что еще лучше, использовать правильный класс контейнера:

#include <array>
#include <vector>

typedef std::array<bool, 1280> line;

int main()
{
    std::vector<line> grid(1024);
    std::vector<line> grid2(1024);

    // no initialization to false necessary
}

Обратите внимание, как я переключил ширину и высоту.Возможно, вы хотите, чтобы ваши элементы были выровнены таким образом, чтобы обеспечить быстрый линейный доступ.

2 голосов
/ 23 октября 2010

Я думаю, sizeof(bool) определяется как sizeof(char).Предполагая, что char занимает один байт в системе, в которой вы находитесь, этот второй пример пытается выделить 2*1280*1024 байтов в стеке. Это 2,5 МБ. Ваша система может не обеспечить такого большого пространства стека.

Используйте один из компонентов из стандартной библиотеки, которые используют пространство кучи для хранения своих данных.

1 голос
/ 23 октября 2010

Возможно переполнение стека.Создайте массив динамически, он будет работать (потому что он будет создан в куче).Или вместо этого используйте std::vector< std::vector< char > >.(будьте очень осторожны, если вы решите использовать std::vector< bool > .. если вы не знаете, что именно точно вы делаете (это не нормальный STL)контейнер, содержащий только bools), используйте его с char).

Использование std::vector< std::vector< char > > позволит вам использовать объект как обычный двумерный массив.


РЕДАКТИРОВАТЬ:
std :: vector :"Эта специализация предназначена для оптимизации распределения пространства: в этой специализации шаблона,каждый элемент занимает только один бит (что в восемь раз меньше, чем наименьший тип в C ++: char).

Ссылки на элементы вектора bool, возвращаемые членами вектора, не являются ссылками на объекты bool, носпециальный тип члена, который является ссылкой на один бит, определенный внутри специализации векторного класса как ". CPlusPlus

1 голос
/ 23 октября 2010

Работает нормально для меня, никаких ошибок при использовании g ++ 4.2.1, вы пробовали только эти примеры?

...