Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > проблемы с памятью


Автор: ksili 23.12.2005, 10:13
Есть такой код:
Код

#define MaxX 2000
#define MaxY 345
#define MaxZ 340

void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned short Otsek[MaxX][MaxY][MaxZ];
Byte zOtsek[MaxX][MaxY];

...
}


При нажатии на кнопку происходит исключение "Stack overflow". Причем программа прерывается ещё на заголовке функции, т.е. на строке void __fastcall TForm1::Button1Click(TObject *Sender).

Если объявления массивов вынести из тела функции, т.е. поместить их сразу за директивами #define, то ещё на этапе линковки проекта происходит ошибка "Assertion failed: !"Bad error code", file VMem.c, line 715". После этого Builder зависает или выгружается.

Есть какой-то выход? Или придётся объвлять указатель и динамически выделять память под массивы?

Автор: _hunter 23.12.2005, 11:17
а не жирно ли 224 метра на стеке???
само-собой на куче выделять нужно

Автор: abrekos 23.12.2005, 14:00
[censored 6] фигня! Правь в настройках компилера размер стека и будет тебе счастье. smile

Автор: Partizan 23.12.2005, 19:24
зачем рыться в настройках...конечно массив надо в куче заводить...

Автор: JoyEx 23.12.2005, 19:27
а можно объявить массив как const и он попадет в секцию exeшника smile

Автор: ksili 27.12.2005, 05:46
Размер большой не спорю. Но при чём здесь вообще стек? Разве память под объявляемые переменные выделяется в нём?

Автор: Neitron 27.12.2005, 10:39
ksili
А где?smile

Автор: ksili 28.12.2005, 06:39
Ну типа в куче
Под прогу выделяется память. В начале сегмент кода и сегмент данных. С другого конца растёт стек. А посередине куча. По-моему там и берётся память под все динамически выделяемую переменные

Автор: _hunter 28.12.2005, 11:21
под динамические -- да, но с каких это пор unsigned short Otsek[MaxX][MaxY][MaxZ]; стало объявлять динамические массивы?

Автор: ksili 28.12.2005, 12:11
Прошу прощения, попутал. Так как уже стал выделять динамически.
И всё же стек и сегмент данных - это разные вещи.

Автор: _hunter 28.12.2005, 12:48
разные -- никто и не спорит.
только ты это к чему?..

Автор: chaos 28.12.2005, 12:55
Цитата(ksili @ 28.12.2005, 06:39)
Ну типа в куче

это только ява все запихивает в кучу(кроме помоиму простейших типов) но это я отвлекся smile

Цитата

Так как уже стал выделять динамически

юзай векторы раз устал
Добавлено @ 12:57
типо
Код

typedef vector<UINT> ONEDIM;
typedef vector<ONEDIM> TWODIM;
typedef vector<TWODIM> THREEDIM;

Автор: Neitron 30.12.2005, 13:31
Он сказад Стал,а не устал smile

Автор: NixoL 30.12.2005, 20:01
Переменная-то объявляется внутри функции -
а все локальные переменные размещаются в стеке...
Если я не прав - поправте.

Автор: Partizan 31.12.2005, 00:56
Цитата(NixoL @ 30.12.2005, 20:01)
Переменная-то объявляется внутри функции -
а все локальные переменные размещаются в стеке...
Если я не прав - поправте.

Чувак smile Здесь самого начала об этом и твердят...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)