0

カウントタイマー(ラベル上)とラベル整数値(countという名前)を含む変数を作成します。また、数値が7であるか、7で割ったか、7が含まれているかをチェックする関数を作成します。カウント値をチェック関数に渡そうとすると、アプリはスタックになります。スタックオーバーフローが発生する理由を長い間調べようとしましたが、成功しませんでした。どうすれば解決できますか?これが私のコードです:

-(IBAction)start:(id)sender
{
    timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];

    MainInt = 0;
    numbersTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(countup) userInfo:nil repeats:YES]; 
}
-(void)countup
{
    MainInt += 1;
    numbersLabel.text = [NSString stringWithFormat:@"%i", MainInt];
    count = numbersLabel.text.intValue;
    NSLog(@"num: %d", count);

   if ([self checknum:(count) == false]) {
   NSLog(@"BOOM");
   }

}
-(BOOL)checknum:(int)number
{
    while (number<10) 
    {
        if(number ==7)
        {
            NSLog(@"boom, i=%d", number);
            return true;
        }


    }

    while (number>=10 && number<1000) 
    {
        if(number % 7 == 0)
        {
            NSLog(@"boom i=%d", number);
            return true;

        }

        if([self revese:(number)])
        {
            NSLog(@"boom reverse num = %d", number);
            return true;

        }

    }

    return false;   
}


-(BOOL) revese:(int)number
{
    if(number < 10 && number != 7)
        return false;
    if(((number % 10) == 7) || ((number / 10) == 7))
        return true;
    else {
        [self revese:(number / 10)];
    }
    return false;

}

ありがとう!

4

3 に答える 3

2

ステートメント

if ([self checknum:(count) == false]) {
   NSLog(@"BOOM");
}

ナンセンスです。あなたは効果的に尋ねています

BOOL isLessThanOne = (count < 1);
if ([self checksum:isLessThanOne]) {
           NSLog(@"BOOM");
}

これを変更します

if ([self checksum:count] == NO) {
       NSLog(@"BOOM");
    }
于 2012-06-30T09:55:11.993 に答える
1

多くの問題がありますが、最初の問題は次のとおりです。

while (number<10) 

///

while (number>=10 && number<1000)

ここに if/else 型の条件文が必要です。現在の方法では、 の値を決して調整しないためnumber、コードの後半でテストする厳密な条件が満たされない場合、無限ループに陥ります。もっと似たもの:

if(number<10){ 
// do some tests

} else if (number<1000){
// do some other tests


}

他にも問題がありますが、それらは始まりです。

于 2012-06-30T09:23:00.647 に答える
0

あなたが何をしているのかを実際に見ることができないので、見分けるのは非常に困難ですが、スタックオーバーフローが発生した場合、問題reveseは再帰的な関数である可能性が非常に高くなります。revese条件ステートメントで使用しているいくつかの異常なロジックに基づいて、特定の値が渡され、それが何度も呼び出されていると思います。なぜこれが起こっているのかを特定するために、デバッガーでこの関数を慎重に実行する必要があります。

于 2012-06-30T09:26:44.723 に答える