2013-06-19 4 views
2

Я вычислительными некоторые ценности и чулок их в переменной с помощью функции, как то, что находится ниже:StackOverflow массивы массивов

array<array<double,1000>,1000> index; 
sum(double A, ..., array<array<double, 1000>,1000> & index); 

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

Но! Как только я вызвать другую функцию, в которой я использую массив индексов, чье заявление выглядит следующим образом:

average(..., array<array<double,1000>,1000> index, ...) 

Я получаю исключение Необработанного (переполнение стеки), который перенаправляет меня в файл ассемблерного (CHKSTK.ASM):

test dword ptr [eax],eax  ; probe page. 

Любая идея, как решить эту проблему?

ответ

3

Динамический способ (чтобы избежать переполнения стека) об объявлении 1000 х 1000 двойников в 2d моды

std::vector<std::array<double,1000>> index(1000); 

-edit- Как Майк Сеймур уже предложил в комментариях. Честь, которой честь честь ...;)

Индекс относится к типу std::vector<std::array<double,1000>>, и поэтому вам нужно будет иметь такие аргументы.

void average (..., std::vector<std::array<double,1000>> & index, ...) 
+1

+ добавить часть, которую она, вероятно, не должна передавать по значению функции ... –

+0

Имейте в виду, что '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Вам понадобится '>>' –

+0

@BalogPal. Вы имеете в виду, что среднее значение принимает индекс (по значению), а не & index (по ссылке, что может быть связано с const &)? – doctorlove

3

По умолчанию каждый поток в Win32 имеет 1 МБ пространства для стека, а миллион удваивается, занимает 8 МБ пространства стека. Решение состоит в том, чтобы выделить их из кучи, используя new.

+0

Итак, решение заключается в выборе динамических массивов массивов, как может массив <...<...,..>> можно записать в этом случае с новым? – MelMed

+2

@MelMed: Я бы предложил 'vector > index (1000);' Использование 'new' напрямую - это, как правило, плохая идея. –

+0

@MelMed: решение заключается в изменении средней функции для получения указателя. – Rimio

0

Ну, так как вы не передаете указатель на «указатель» на среднюю функцию, ваш объект (т. Е. Массив) будет восстановлен (скопирован) в стек. Я не знаю точно, что размер стека по умолчанию, но вы используете ~ 8 МБ только для своего массива, что является плохим идеей.

0

Хорошо, давайте собрать все части:

  • SizeOf (массив, 1000>) составляет около 8Mbytes
  • обычных стек меньше, поэтому вы сталкиваетесь с проблемами при
    1. создать такие местная переменная
    2. передать ее по значению

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

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

Если вы не можете избежать перечисленных проблемных задач, вы должны уменьшить размер класса. Самое простое решение состоит в том, чтобы сделать его vector<array<double,1000>>, который вы создаете с помощью конструктора размеров, сразу же имеющего весь размер.

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