2016-06-14 2 views
3

Обычно я трачу свое время на чтение и пытаюсь ответить на вопросы Excel VBA, но сейчас я пытаюсь изучить C#. Может ли кто-нибудь помочь мне понять, почему я получаю ошибку StackOverflowException во второй-последней строке в моем коде?
Я пытаюсь заполнить массив с помощью метода.StackoverflowException при заполнении массива

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int[] numbers = GenerateNumbers(); 
      Console.WriteLine(numbers); 
      Console.ReadKey(); 
     } 
     static int[] GenerateNumbers() 
     { 
      int[] num = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
      return GenerateNumbers(); 
     } 
    } 
} 
+5

Как вы думаете, 'возврата GenerateNumbers(); 'делает? Это важно знать, чтобы исправить ваше недоразумение. – usr

+3

Подсказка: бесконечная рекурсия –

+7

используйте 'return num;' или просто 'numbers = Enumerable.Range (1,10);' – Plutonix

ответ

10

Вы путаете странный способ возврата VBA с помощью C#. Вы возвращаете бесконечную рекурсию, которая может быть легко исправить с помощью этого:

static int[] GenerateNumbers() 
    { 
     int[] num = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
     return num; //you don't return the function name but a variable 
    } 
4

переполнение стека является нежелательным состояние, в котором конкретная компьютерная программа пытается использовать больше памяти, чем стек вызовов имеется. В программировании стек вызовов представляет собой буфер, в котором хранятся запросы , которые необходимо обработать. http://whatis.techtarget.com/definition/stack-overflow

static int[] GenerateNumbers() 
{ 
    int[] num = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    return GenerateNumbers(); //Here is where the problem happens 
} 

Проблема заключается в обратной части. Вы вызываете одну и ту же функцию в одной и той же функции, создавая стек той же функции снова и снова и ... Вы получаете изображение.

Изменить его

return num; 
+1

@Mafii Спасибо за головы. Я отредактировал ответ. – Twahanz

0

Позвонив return GenerateNumbers() в конце вашей функции, вы работаете, что функция снова и снова бесконечно, потому что нет никакого способа сломать рекурсию, вызывая переполнение стека. Вместо этого вы должны использовать return num

0

Это то, что вы делаете esentially:

void Main() 
{ 
    FlipPage(); 
} 

void FlipPage() 
{ 
    FlipPage(); 
} 

Так как этот белокурый вы держите листать эту страницу в вечности

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