2014-11-13 2 views
-1

С моей функцией коэффициентов возврата числа, я получаю сообщение об ошибке, которого я не должен быть.Индекс за пределами ошибки C#

Это мой код:

static void Main(string[] args) 
    { 
     foreach (int element in Factors(16)) 
     { 
      Console.Write(element.ToString() + ", "); 
     } 
    } 
    static Array Factors(double value) 
    { 
     int[] factors = new int[] { }; 
     int counter = 0; 

     for (int i = 1; i <= value; i++) 
     { 
      if (value % i == 0) 
      { 
       factors[counter] = i; 
       counter++; 
      } 
     } 
     return factors; 
    } 

Это ошибка, что я получаю:

Необработанное исключение типа 'System.IndexOutOfRangeException' произошло в TestSolver.exe

Дополнительная информация : Индекс находился вне границ массива.

+0

Вы не указали места для факторов ..... –

+0

'факторы' - пустой массив. Что нужно индексировать в нем? – J0e3gan

ответ

0

Вы инициализируете пустой массив, но затем пытаетесь присвоить значения индексам, которые не существуют. Для этого приложения вам может быть лучше подан с List<int>.

var factors = new List<int>(); 
    for (int i = 1; i <= (0.5 * value); i++) 
     if (value % i == 0) 
      factors.Add(i); 
    return factors.ToArray(); // returns int[] 
+0

Спасибо, теперь лучше понять, что я знаю больше о массивах – GriffinMite

+0

Рад, что он работает для вас @GriffinMite –

0

Линия

int[] factors = new int[] { }; 

создает массив с 0 элементами. Массивы в .NET - это фиксированный размер, поэтому позже, когда вы пытаетесь получить доступ к элементам с помощью factors[counter] = i;, он терпит неудачу, потому что не было выделено никаких элементов.

Вам нужно либо указать количество элементов при выделении factors (что-то вроде int[] factors = new int[16];) или использовать List<int>, который является динамическим массивом (вы можете использовать Add() для добавления новых элементов в конце).

-1

Проблема эта линия:

int[] factors = new int[] { }; 

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

factors[counter] = i; 

... исключение выбрано потому, что длина массива равна 0. Он не может содержать никаких элементов. factors[0] = i не является допустимым назначением, потому что factors[0] не существует.

Вы можете легко использовать List<int> вместо массива, чтобы выполнить это. Элементы могут быть добавлены в списки по мере необходимости. После того, как вы закончите со списком, вы можете преобразовать его в массив, используя ToArray. Таким образом, вы можете изменить Factors, как не следует:

static Array Factors(double value) 
{ 
    List<int> factors = new List<int>(); 

    for (int i = 1; i <= (0.5 * value); i++) 
    { 
     if (value % 1 == 0) 
     { 
      factors.Add(i); 
     } 
    } 
    return factors.ToArray(); 
} 

Обратите внимание, что counter больше не требуется.

+0

Ваш код по-прежнему выдает сообщение об ошибке. Список factors = new Список {}; должен быть список (); –

+0

Или вы можете пропустить «ToArray» и просто вернуть «Список » и пропустить его. – Tim

+0

@LouisMichael: Вы ошибаетесь. Оба действительны. – grovesNL

0
int[] factors = new int[] { }; 

создает массив без элементов в нем (нулевой размер). Это не волшебно расширить, когда вы делаете:

factors[0] = 42; 

Чтобы изменить размер массивов, вы можете использовать Array.Resize(ref arrName, newSize) или выбрать коллекцию, которая может изменение размера, таких как List<int>.

+0

'ArrayList' вместо' List '? Зачем?!? – Tim

+0

@Tim, «такой как», что означает «пример». Но, поскольку многие люди предпочитают родовые классы, я поменю на свой счет. – paxdiablo

-1

Вы не задали размер массива и который вызывает ошибку.То, что вы можете сделать в качестве обходного пути, - это иметь его в списке и перебирать параметр, который вы передаете. Вы можете попробовать что-то вроде этого.

static Array Factors(double value) 
    { 
     List<int> factors = new List<int>(); 

     for (int i = 1; i <= value; i++) 
     { 
      if (value % i == 0) 
       factors.Add(i);    
     } 
     return factors.ToArray(); 
    } 
+0

Если нет определенной причины, то OP нуждается в массиве, я не вижу значения 'ToArray()'. – Tim

+0

Я просто использовал то, что было дано в его коде. Мы также можем установить его в статический список Факторы (двойное значение) ... –

0

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

static void Main(string[] args) 
    { 
     foreach (int element in Factors(16)) 
     { 
      Console.Write(element.ToString() + ", "); 
     } 
    } 
    static Array Factors(double value) 
    { 
     int[] factors = new int[Convert.ToInt32(Math.Round(value,0))]; 
     int counter = 0; 

     for (int i = 1; i <= value; i++) 
     { 
      if (value % i == 0) 
      { 
       factors[counter] = i; 
       counter++; 
      } 
     } 
     Array.Resize(ref factors, counter); 
     return factors; 
    } 
Смежные вопросы