2016-09-23 1 views
0

Ich erhalte den Fehler, "Thread 1: EXC_BAD_INSTRUCTION (code = EXC_1386_INVOP, Subcode = 0x0)" wenn sie versuchen, zufällige Array-Elemente in ein neues Array anzuhängen.Swift: Erste EXC_BAD_INSTRUCTION wenn sie versuchen, zufällige Array-Elemente anhängen

Die Debug-Protokoll sagt "fatale Fehler: Index außerhalb des zulässigen Bereichs"

//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, die Arbeit macht, um die Zufallszahl zu erzeugen.

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) 
    } 
} 

Um ein besseres Verständnis zu bekommen, ich versuche, ein Stück von einem „Team making“ Programm, in dem die Spieler in Veranstaltungen sortiert werden automatisch zu schreiben, aber sie können, welche Ereignisse wählen sie priorisieren möchten.

kann ich nur 6 Personen pro Veranstaltung jedoch so das Ziel, die bestehenden garudaLocations Array zu nehmen ist, wählen Sie einen zufälligen 6 Index Standorte, und wird der Rest der Spieler zu befreien.

Ich bekomme den Fehler erst, nachdem ich mehr als 6 Spieler zum selben Ereignis einreiche.

Jede Hilfe wird sehr geschätzt!

Antwort

1

Sie können nie sprechen von einem nicht vorhandenen Index. Wenn du das tust, wirst du zusammenstürzen, genau wie du jetzt stürzt.

Also, Sie sagen:

garudaLocations[randomGarudaPrioritiesIndex] 

Nun, ich weiß nicht, was garudaLocations ist. Aber ich kann Ihnen sicher sagen, dass, wenn randomGarudaPrioritiesIndex ist kein existierender Index innerhalb garudaLocations, Sie absolut abstürzen werden.

So können Sie dies leicht debuggen, indem Sie (print) randomGarudaPrioritiesIndex.

Beachten Sie, dass der größte vorhandene Index nicht garudaLocations[garudaLocations.count] ist. Es ist garudaLocations[garudaLocations.count-1]. Vergleichen Sie also randomGarudaPrioritiesIndex mit garudaLocations.count-1. Wenn es größer ist, stürzen Sie ab, wenn Sie es als Index auf garudaLocations verwenden.

+0

garudaLocations ist das Array, das die Spieler enthält, die das Ereignis als Priorität ausgewählt haben. randomGarudaPrioritiesIndex ist eine Variable, die eine Zufallszahl enthält (die mit der randomSequenceGenerator-Funktion generiert wird). Normalerweise, um ein * spezifisches * Index-Element aufzulisten, würden Sie (Array [X]) verwenden, um beispielsweise das Element X im Array aufzulisten. Ich dachte, ich könnte den Zufallsgenerator an der Stelle der 0 verwenden, um ein * zufälliges * Array-Element zu finden. Ist das nicht der Fall? –

+0

und wenn ich debugPrint (randomGarudaPrioritiesIndex) bekomme ich 6 zufällige Ganzzahlen, wie erwartet (nicht in einem Array). –

+0

All das ist großartig. Aber es scheint irrelevant zu sein; Die Frage ist, ob eine dieser zufälligen Integer im Ausdruck "garudaLocations [randomGarudaPrioritiesIndex]" zulässig ist. Klar ist es manchmal nicht. – matt

Verwandte Themen