Airseb
Airseb

Reputation: 13

trying to understand this random error i get //swift

class Personnage {
    var vie = arc4random_uniform(10) + 1;
    var force = arc4random_uniform(8) + 1;
    var chance = arc4random_uniform(2);
    func attaquePar(joueur1:Personnage) ->String {
        var differenceForce = self.force - joueur1.force
        var coup = differenceForce + chance
        if coup >= self.vie {
            return "tu mas eu"
        } else if coup < self.vie {
            self.vie = self.vie - coup
            return "jai rien senti macaque \(self.vie)"
        } else {
            return "heu?"
        }
}
}
let toto = Personnage()
let cafard = Personnage()
toto.attaquePar(cafard)

Hi, I am having an error message at line 6. It works some times and other it does not. Here it is : Execution was interrupted, reason EXC_BAD_INSTRUCTION (code=EXC I386_INVOP subcode=0x0). I imagine that there is an invalid operation, but i don't undestant why i get this.

Upvotes: 1

Views: 69

Answers (2)

Airseb
Airseb

Reputation: 13

Thank you Martin. You were totally right.

Converting the variable type from UInt32 to Int was the solution.

var life = arc4random_uniform(10) 💀
var life = int(arc4random_uniform(10)) 😎

Upvotes: 0

Martin R
Martin R

Reputation: 539745

The return type from arc4random_uniform() is UInt32, and computing the difference

var differenceForce = self.force - joueur1.force

will abort with a runtime exception the second operand is greater that the first operand, i.e. the result is not representable as the (unsigned) UInt32. Unlike in some other programming langages, results are not implicitly promoted to Int or wrapped around.

A simple example:

let a = UInt32(3)
let b = UInt32(5)
let c = a - b // 💣

A possible solution is to convert all numbers to Int, so that differences can be computed without problems:

var vie = Int(arc4random_uniform(10)) + 1
var force = Int(arc4random_uniform(8)) + 1
// etc 

Upvotes: 1

Related Questions