arc4random() перестал работать после обновления проекта, поток 1: EXC_ARITHMETIC
Я получил предупреждение на xcode 6.0.1, что мне нужно обновить мой проект, поэтому я сделал...
... но тогда у меня возникли проблемы с arc4random() %
До этого обновления все работало нормально, но теперь я получаю следующее сообщение: "Тема 1: EXC_ARITHMETIC (code = EXC_1386_DIV, Subcode = 0x0) и игра вылетает.
Я попытался с arc4random_uniform, но игра, кажется, "пауза", и ничего не происходит. Я имею в виду, что я мог видеть, что он вошел в оператор if(bType == pt || bType == pl), но, похоже, что он "останавливается" и зацикливается бесконечно.
какие-либо предложения?
-(void)placeInGrid:(CGPoint)place pt:(int)pt pl:(int)pl amount:(int)amountOfbricks{
CCLOG(@"BRICKS:placeInGrid");
//CCLOG(@"pt %d", pt);
//CCLOG(@"pl %d", pl);
int bType = arc4random() % amountOfbricks;
//int bType = arc4random_uniform(amountOfbricks);
if(bType == pt || bType == pl){
CCLOG(@"bType == pt || bType == pl");
[self placeInGrid:place pt:pt pl:pl amount:amountOfbricks];
return;
}
else{
CCLOG(@"else");
CCSpriteBatchNode * b = (CCSpriteBatchNode *)[theGame getChildByTag:kSSheet];
mySprite = [CCSprite spriteWithBatchNode:b rect:[self setBrickType:bType]];
[b addChild:mySprite z:1];
self.bricksType =bType;
[self.mySprite setPosition:place];
}
}
ОБНОВИТЬ:
оператор if-else, приведенный ниже, ищет сохраненные данные в начале игры, чтобы узнать, является ли это сохраненной игрой или новой игрой.
Проблема, как кажется, после обновления проекта заключается в том, что игра думает, что данные уже сохранены, и переходит к первому оператору if ( if(gameData)), в результате чего количество кирпичей становится равным 0, а не входит в else утверждение, где количество кирпичей равно 4.
Я не знаю, как решить эту проблему.
if ([[GameManager sharedGameManager] isContinuePressed] == NO && [[GameManager sharedGameManager] isNewPressed] == YES) {
if(gameData){
CCLOG(@"gameData && isContinuePressed == NO && isNewPressed == YES");
//Set the local instance of myobject to the object held in the gameState filler with the key "myObject"
level = 1;
[[GameManager sharedGameManager] setHScore:[decoder decodeIntegerForKey:@"HighScore"]];
highscore = [[GameManager sharedGameManager] ReturnHScore];
countTime = 300;
AmountOfBricks = [[GameManager sharedGameManager] ReturnAmountOfBricks];
BeginningOfGame = YES;
CCLOG(@"AmountOfBricks %d", AmountOfBricks);
}
else{
CCLOG(@"!gameData && isContinuePressed == NO && isNewPressed == YES");
if([[GameManager sharedGameManager]isThereASavedGame] ==YES){
CCLOG(@"isThereASavedGame == YES");
score = 0;
highscore = [[GameManager sharedGameManager] ReturnHScore];
level = 1;
countTime = 300;
AmountOfBricks = 4;
BeginningOfGame = YES;
CCLOG(@"AmountOfBricks %d", AmountOfBricks);
}
else{
CCLOG(@"isThereASavedGame == NO");
score = 0;
highscore = 0;
level = 1;
countTime = 300;
AmountOfBricks = 4;
BeginningOfGame = YES;
CCLOG(@"AmountOfBricks %d", AmountOfBricks);
}
}
}
ОБНОВЛЕНИЕ: я нашел проблему.
проблема была в моем файле manager.m
NSMutableData *gameData; NSKeyedUnarchiver *decoder = nil;
NSString *documentPath = [documentsDirectory stringByAppendingPathComponent: @"gameState.dat"];
gameData = [NSData dataWithContentsOfFile:documentPath];//before the update, I as using this line. was working perfectly. after the update I got a warning on this line "incompatible pointer" and xcode recommended to update to the line below but the line below started to return a zero value. which caused the game to crash.
//gameData = [NSMutableData dataWithData:[NSData dataWithContentsOfFile:documentPath]];
1 ответ
Я держу пари amountOfBricks
равно 0. Вы не можете по модулю 0, как вы не можете разделить на 0.