2016-09-23 3 views
0

Я получаю сообщение об ошибке, «Тема 1: EXC_BAD_INSTRUCTION (код = EXC_1386_INVOP, субкодовые = 0x0)» при попытке добавить случайные элементы массива в новый массив.Swift: Получение EXC_BAD_INSTRUCTION при попытке добавить случайные элементы массива

журнал

отладки говорит: «Фатальная ошибка: индекс вне диапазона»

//If there are more than 6 players prioritizing the event, make a random choice. garudaLocations is an array containing the players who prioritized the event "Garuda". 

    if garudaLocations.count > 6 { 

     var finalGarudaPlayers : [Int] = [] 
     let getRandom = randomSequenceGenerator(1, max: garudaLocations.count) //Tell RNG how many numbers it has to pick from. 
     var randomGarudaPrioritiesIndex = Int() 
     for _ in 1...6 { 
      randomGarudaPrioritiesIndex = getRandom() //Generate a random number. 
      finalGarudaPlayers.append(garudaLocations[randomGarudaPrioritiesIndex]) //ERROR: Thread 1: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP, subcode=0x0) 
     } 
     debugPrint(finalGarudaPlayers) //Print array with the final priority Garuda members. 

randomSequenceGenerator is a function I got from here, который делает работу для генерации случайных чисел.

func randomSequenceGenerator(min: Int, max: Int) ->() -> Int { 
    var numbers: [Int] = [] 
    return { 
     if numbers.count == 0 { 
      numbers = Array(min ... max) 
     } 

     let index = Int(arc4random_uniform(UInt32(numbers.count))) 
     return numbers.removeAtIndex(index) 
    } 
} 

Чтобы получить лучшее понимание того, что я пытаюсь написать кусок программы «команда решений», где игроки автоматически сортируется в событие, но они могут выбрать, какие события они хотели бы приоритеты.

Я могу только 6 человек в случае, однако, таким образом цель состоит в том, чтобы принять массив существующих garudaLocations, выбрать случайные 6 расположения индексов, и избавиться от остальных игроков.

Я получаю сообщение об ошибке только после того, как отправил более 6 игроков на одно и то же событие.

Любая помощь очень ценится!

ответ

1

never говорить о несуществующем индексе. Если вы это сделаете, вы потерпите крах, как только вы рухнете сейчас.

Итак, вы говорите:

garudaLocations[randomGarudaPrioritiesIndex] 

Теперь, я не знаю, что garudaLocations есть. Но я могу вам точно сказать, что если randomGarudaPrioritiesIndex не является существующим индексом в пределах garudaLocations, вы абсолютно сработаете. (print) randomGarudaPrioritiesIndex.

Имейте в виду, что самый большой существующий индекс не является garudaLocations[garudaLocations.count]. Это garudaLocations[garudaLocations.count-1]. Так сравните randomGarudaPrioritiesIndex с garudaLocations.count-1. Если он больше, вы обрушаетесь, когда используете его в качестве индекса на garudaLocations.

+0

garudaLocations - это массив, содержащий игроков, которые выбрали событие в качестве приоритета. randomGarudaPrioritiesIndex означает переменную, которая содержит случайное число (генерируемое функцией randomSequenceGenerator). Обычно, чтобы указать * специальный элемент * Index, вы должны использовать (массив [X]) для отображения элемента X в массиве, например. Я думал, что смогу использовать генератор случайных чисел вместо 0, чтобы я мог найти элемент * random * array. Разве это не так? –

+0

и когда я debugPrint (randomGarudaPrioritiesIndex), я получаю 6 случайных целых чисел, как и ожидалось (не в массиве). –

+0

Все это замечательно. Но это кажется неуместным; вопрос заключается в том, является ли любое из этих случайных чисел законным для использования в выражении 'garudaLocations [randomGarudaPrioritiesIndex]'. Ясно, что иногда это не так. – matt

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