2015-01-28 2 views
-4

Я использую struct как возвращаемое значение fucntion, но это не работает, и я не знаю почему. Сбой программы при запуске этой программы. Я получил RTE. Что не так с этим кодом:Использование struct как возвращаемое значение программы сбоя функции

#include <iostream> 

using namespace std; 
    struct Tablica{ 
     int T[201][201]; 
    }; 

    Tablica test(Tablica A, int m){ 
     if(m==1)return A; 
     if(m%2 ==1){ 
      return test(A, m-1); 
     }else{ 
      cout <<" #1 m " << m<<endl; 
      Tablica B = test(A,m/2); 
      cout <<" #2 m " << m<<endl; 
      return B; 
     } 

    } 
int main(){ 
    Tablica T; 
    test(T,10); 

} 

enter image description here

+3

выглядят как stackoverflow. И 'Tablica' никогда не затрагивается функцией, поэтому я сомневаюсь в ее релевантности ... – UmNyobe

+0

Windows говорит, что программа остановила работу после того, как я запустил это. – peterSweter

+0

Что произойдет, если вы попробуете 'test (T, 1);'? – Beta

ответ

6

Позволяет делать математику: структура почти 160KB размера (201 * 201 * 4 (sizeof(int))), каждый вызов создает два из этих случаев на стек, один для аргумента A, один для переменной B, что означает, что каждый вызов использует около 320 КБ стека. У вас три вызова, так что это 960 КБ. Plus Исходная переменная T в функции main увеличивает размер стека, используемого для 1120kB, что превышает размер стека по умолчанию 1024kB, используемый в Windows. Преодоление переполнения стека и вашего сбоя.

Абсолютное простейшее решение? Сделать аргумент функции постоянной эталонным, то есть

Tablica test(const Tablica& A, int m) 

Проблема в том, что вы до сих пор, по крайней мере, один раз, например каждый вызов в стеке, переменную B, так что просто дает вам несколько больше рекурсивный вызовы до истечения срока действия стека.

Более сложным решением было бы использовать std::vector для данных в структуре, которые помещают данные в кучу и уменьшают структуру на несколько величин. Это, вместе с вышеприведенным решением для использования ссылки для аргумента, является более долгосрочным решением и позволит вам довольно много рекурсивных вызовов до окончания стека. Это не будет длиться вечно, хотя стек - это ограниченный ресурс, и рано или поздно вы все равно закончите.

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