Консультация № 67576
18.12.2006, 20:15
0.00 руб.
0 5 4
Добрый день, сам я новичек в С++, и сразу возникли вопросы:
int i [180] [180] [7]: - проходит
int i [180] [180] [8]: - Stack Overflow

два раза по int i [180] [180] [5]: - Stack Overflow
Есть ли возможность использовать всю или хотя-бы половину моей памяти в начальных декларациях?

и второе можно ли в функции rand() получить диапазон от 0 до 256?
С глубоким уважением Александр Трет.

Обсуждение

Неизвестный
18.12.2006, 20:50
общий
это ответ
Здравствуйте, Александр Трет!
во-первых, не стоит использовать стек для выделения памяти таких объемов. всегда есть GlobalAlloc, VirtualAlloc или то же new.
ну если уж надо, то вопрос такой - чем ты компилируешь программу? если это VC, то в свойствах проекта есть параметр, задающий размер стека (Linker - System - "Stack reserve size"). Впиши туда сколько надо и вперед. Если другой компилятор, скорее всего у него есть аналогичный параметр.
Неизвестный
18.12.2006, 20:54
общий
да, забыл про rand. Подели rand () на (RAND_MAX/256) - получишь числа в диапазоне [0, 256]. если нужно [0, 256) - то дели на 255.
Неизвестный
19.12.2006, 01:37
общий
это ответ
Здравствуйте, Александр Трет!

Когда вы пишете

int i [180] [180] [7]

, то память под переменную выделяется в стеке. Объём стека ограничен, так как он, в общем-то, не предназначен дял хранения большого объёма данных.
Изменить объём стека можно где-то в настройках компилятора.

В любом случае, это не выход. Выход - выделять память под даннsе из кучи, а не из стека (т.е. при помощи оператора new). Но придётся следить за тем, чтобы не забыть освободить выделенную память.

А ЕЩЁ ЛУЧШЕ, раз уж вы пишете на С++, а не на С, использовать стандартную библиотеку шаблонов stl. Это защитит от утечек памяти.
Например, так:

#include <vector>

using namespace std;
....

vector<vector<vector<int> > > i; //тут надо поаккуратнее с пробелами! их удалять нельзя.
i.resize(180);
for (int j=0;j<i.size();++j){
i[j].resize(180);
for (int k=0;k<i[j].size();++k){
i[j][k].resize(7);
}
}
....

не лучший код, но идея понятна, надеюсь. Забыл я, честно говоря, можно ли у vector задачать начальный объём... Давно на с++ не пишу, если честно ^_^
Неизвестный
19.12.2006, 08:29
общий
это ответ
Здравствуйте, Александр Трет!

1. Если компилятор для DOS, то нужно сделать 2 вещи:
а) Настроить компилятор - сделать модель памяти huge (для Borland C это будет меню "Options"-"Compiler"-"Code generation"-"Model"-"Huge"). Это даст возможность использования больших массивов (без этого массивы будут иметь максимум размера 1Мб).
б) Обозначить свой массивы как большие и статические:
static int huge i[180][180][20];
Используя обе эти вещи вы спокойно можете работать с этим массивом. (Только если используете ссылки на этот массив - лучше используйте дальние - это на будущее).
Неизвестный
20.12.2006, 11:05
общий
это ответ
Здравствуйте, Александр Трет!

В ответах экспертов был незаслуженно забыт rand()...:)
Восполняю пробел:

#include <stdlib.h>

unsigned int randomDigit;

void main(void) {
randomDigit = rand()% 256;// % - это взятие остатка от деления.
};

Форма ответа