2013-08-22 2 views
1

Я использую Microsoft Visual Studio 2010. У меня проблема при попытке инициализировать этот двухмерный массив. - int A [480] [640] . Ужасно, что стек переполнен.Размер двумерного массива

Эта ошибка указывает на компилятор или что? Как я могу это исправить?

Спасибо!

+0

Сообщите свой код и его содержимое – Paddyd

+0

Если вы уменьшите размер своего двойного массива, чтобы сказать 'int A [50] [50]', вы все еще получаете ошибку? Вероятно, вы переполняете стек большим массивом. – Tricky12

+0

Нет, если я поставил несколько меньших чисел, я не получу эту ошибку. Даже с int A [500] [500] отлично работает. Но мне нужно разрешение 640x480. – Meteory

ответ

0

Какой язык вы используете? 2D-массив инициализируется следующим образом: (C#) int[,] A = new int[x,y];

+0

Я использую C++, где вы инициализируете вот так: int A [x] [y] – Meteory

1

Я считаю, что вы действительно переполняете стек. Есть несколько способов исправить это, но самые простые из них - либо сделать это static, либо переместить его за пределы вашей функции main.

static int A[480][640]; 

Делая это статический, вы в основном делает его использовать сегмент данных памяти, в отличие от стека (и перелива его в этом случае из-за большого выделения). На изображении ниже это будет в «инициализированных данных», где также хранятся глобальные переменные (причина, по которой работает второй вариант), за пределами стека/кучи.

или

int A[480][640]; 
int main(int, char **) { 
    //.... 
} 
+0

Да, отлично, с добавлением этого статического фронта я решил проблему. Хорошо, я сделаю вот так - но сначала должен увидеть, что делает этот «статический» в таком использовании :) – Meteory

+0

Я добавил немного больше информации к моему ответу, как небольшое объяснение того, почему это «статическое» работает. – Tricky12

+1

Создание динамического массива - лучшее и более общее решение. Сделать его статическим или глобальным просто quickfix. –

2

Как отмечают другие, вы переполнением стека, который имеет ограниченный размер. Большие массивы должны быть динамически распределены (в куче), а не помещены в стек. Вектор - это динамический массив. Вектор не поддерживает 2d напрямую, но вы можете имитировать его вектором векторов. Замените xsize и ysize своими размерами, которые больше не должны быть константами.

vector< vector<int> > A(ysize, vector<int>(xsize)); 

for (int y = 0; y < ysize; y++) 
{ 
    for (int x = 0; x < xsize; x++) 
    { 
     A[y][x] = x * y; 
    } 
} 

Обратите внимание, что индексы y и x обращены назад. Обычно это более эффективно.

+0

Это звучит как отличная идея. Я попробую. – Meteory

Смежные вопросы