2013-02-09 3 views
0

Я разрабатывал программу с использованием библиотеки SDL. Все сделано в Linux и работает отлично, проблема возникает при переносе в Windows. Когда я создаю и запускаю сбои программы (программа остановлена ​​работа) и закрывается, я сначала подумал, что это как-то связано с SDL, но я выделил ошибку для строки, в которой я просто определяю двухмерный массив или объекты класса , Класс prototipe определен в файле заголовка, как это:Массив объектов и авария

#ifndef PARTICULA_H 
#define PARTICULA_H 

class particula { 
    public: 
    particula(); 
    particula(const particula& orig); 
    virtual ~particula(); 

    int x,y; 
    int vx,vy; 
    int tipo; 
    int tipo2; 
    int peso; 
    int empuje; 
    bool update; 
    bool update_temp; 
    int contador; 
    int temperatura; 
}; 

#endif 

Теперь конструкторы класса определены в файле .cpp

particula::particula() { 
    vx = 0; vy = 0; tipo = 0; peso = 0; empuje = 0; 
    update = true; contador = 0; temperatura = 0; 
    update_temp = true; tipo2 = 0; 
} 

particula::particula(const particula& orig) { 
} 

particula::~particula() { 
} 

Ok, в главной функции(), только в начале я определяю массив этого класса:

particula matriz[400][220]; 

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

+1

«Это не может быть ничего другого». О, это возможно! –

+0

Я имею в виду, что это должно быть что-то связанное с этой линией, поскольку это единственное, что выполняется. – MyUserIsThis

ответ

2

Я думаю, что вы выделяете такой большой массив на стек, чтобы вы получили сбой. Вы написали эту строку в главной функции, и я не вижу нового оператора. Таким образом, вы выделяете память для своей структуры в стеке. Стек не может вместить столько данных ... используйте новое ключевое слово, чтобы распределить память в куче и не забудьте освободить ее позже. Read this article.

+0

hmm. что я делаю? использовать динамическую память? – MyUserIsThis

+0

обновил мой ответ. – Leonidos

+0

Не уверен в ограничениях для стека в окнах, но этот массив немного превышает 3 М. Не уверен, что должно хватить, чтобы закончилось пространство стека ... –

0

Максимальное количество пространства стека в Windows по умолчанию равно 1 МБ, но для этого массива требуется около 4 МБ. Таким образом, вы должны передать его в куче:

particula (*matriz)[220] = new[400][220]; 

Или:

vector<vector<particula>> matriz; 

А потом просто добавить элементы по мере необходимости.

+0

Второй подход имеет совершенно другую область памяти (то есть каждая строка будет выделена в несмежном блоке памяти). Вам лучше писать класс-помощник, который выделяет один вектор «» и сопоставляет координаты. –

+0

Да, я не сказал, что они распределяли память одинаково. Но любой подход будет работать для целей MyUserIsThis. – user1610015

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