1

私はcs193pコースから基礎計算機の宿題をしていますが、私の
+evaluateExpression:usingVariables:方法は機能しません。常に0を返します。

これが私の方法です:

+ (double)evaluateExpression: (id)anExpression usingVariablevalues: (NSDictionary *)variables {
CalculatorBrain *worker = [[[CalculatorBrain alloc] init] autorelease];
double returnValue = 10.0;
if ([anExpression isKindOfClass:[NSMutableArray class]]) {
    for (id term in anExpression) {
        NSLog(@"%f", returnValue);         // breakpoint
        if ([term isKindOfClass:[NSString class]]) {                                    // string
            if ([term hasPrefix:@"%"] && [term length] == 2) {                          // variable
                double value = [(NSNumber *)[variables objectForKey:[term substringFromIndex:1]] doubleValue];
                NSLog(@"Variable: %@, value: %d", [term substringFromIndex:1], value);
                [worker setOperand:value];
            }
            else if ([term length] == 1) {                                              // operation
                returnValue = [worker performOperation:term];
            }
            else {
                NSLog(@"Invalid expression.\n\tMultiple character operation found: %@", term);
            }
        }
        else if ([term isKindOfClass:[NSNumber class]]) {                                   // operand
            double value = [term doubleValue];
            [worker setOperand:value];
        }
        else {
            NSLog(@"Invalid expression.\n\tWrong type in expression: %@, The value is: %@.",[term class], term);    // Wrong type in expression
        }

    }
}
else {
    NSLog(@"Invalid expression.\n\tThe expression is of the wrong type: %@.", [anExpression class]);    // expression is of wrong type
}
//returnValue = worker.operand;
return returnValue;
}

ヒントはありますか?常に0を返します。

/* Ouput from Console */
2012-06-27 20:01:05.487 Calculator[2823:207] 0
2012-06-27 20:01:05.488 Calculator[2823:207] 0
2012-06-27 20:01:05.489 Calculator[2823:207] 0
2012-06-27 20:01:05.490 Calculator[2823:207] Variable: x, value: 0
2012-06-27 20:01:05.490 Calculator[2823:207] 0
2012-06-27 20:01:05.491 Calculator[2823:207] 0
2012-06-27 20:01:05.491 Calculator[2823:207] 0

注:最初にreturnValueを10.0に設定して、変更されているかどうかを確認します。

アップデート:

辞書から0になることがわかりました。私は呼び出し元のコードが原因だと思います:

- (IBAction) performSampleExpression {
    NSMutableArray *expr = [[NSMutableArray alloc] init]; 
    [expr addObject:[NSNumber numberWithDouble:3.0]];
    [expr addObject:@"+"];
    [expr addObject:@"%x"];
    [expr addObject:@"*"];
    [expr addObject:[NSNumber numberWithDouble:4.0]];

    NSDictionary *varsdict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithDouble:10.0], @"x", nil];

    double result = [CalculatorBrain evaluateExpression:expr usingVariablevalues:varsdict];
    if (!result) NSLog(@"result = nil");
    NSLog(@"%f", result);

    display.text = [NSString stringWithFormat:@"%f", result];
    [expr release];
}

しかし、結果はゼロではありません。

アップデート2:

デバッガーを使用する(良いヒント。これで解決するかもしれません。)何か奇妙なことがわかりました。

この行で:(初めて)

returnValue = worker.operand;

returnValueはまだ10であり、3ではない(worker.operand IS)と表示されます。
割り当ては失敗していますか、それともこれはどうあるべきですか?(ただ疑問に思う)。

更新3:

さて、ここで非常に奇妙なことが起こっています。returnステートメントの最後の行にブレークポイントを設定すると+evaluateExpression:usingVariables:、と表示されます
returnValue = 4
つまり、実際の問題はにあります-performSampleExpression。私は何が間違っているのですか?

更新4:

に変更@"%d", doubleすること@"%f", doubleは大いに役立ちました。それは奇妙なコンソール出力を説明しています。[setText:@"%d", result];しかし、キャストが間違っていたためにdoubleが0として表示される原因となった、displayのような表示を更新したため、問題は解決しました。
デバッガーを使ってこれを発見したので、それを提案した人は実際にそれを解決しました。(そして私はhints解決策ではなく、を求めました。結局のところ、宿題はそこから学ぶことです)。

4

3 に答える 3

1

考えられる問題は次の場所に表示されます。

 returnValue = [worker performOperation:term];

returnValue = worker.operand;

この行(または下の行)でデバッガーを停止し、returnValue変更の値を確認する必要があります。

画面

画面上の位置をクリックしてアプリを停止し、アプリを停止してから、F6(またはFn + F6)で次の行にジャンプします。以下(コンソール内)に値が表示されます。

編集

このソリューションを試すことができます-割り当てを次のように変更します:

CalculatorBrain *worker = [[[CalculatorBrain alloc] init] autorelease];

そして行を削除します:

 [worker release];

返品直前のこのリリースでは、NSCopying@protocolがないと問題が発生する可能性があります。

自動リリースとNSCopying

理解を深めるために、このコードをコンパイルしてください。

NSMutableArray *arrOne = [[NSMutableArray alloc] initWithObjects:@"1",@"2", nil];
NSMutableArray *arrTwo = [[NSMutableArray alloc] init];

arrTwo = arrOne;
[arrOne addObject:@"3"]; //After that arrTwo "shold" be 1,2 and arrOne 1,2,3. No! There both 1,2,3!

for(int i=0;i<[arrTwo count];i++)
    NSLog(@"%@",[arrTwo objectAtIndex:i]);

したがって、変数の割り当て方法を検討することができます。上記の例では、メモリを解放しても戻り値に影響はありませんが、戻りオブジェクトで自動解放を使用することにより、何も割り当てる必要はありません。

于 2012-06-27T14:15:23.870 に答える
1

コードを1行ずつステップ実行して、変数値を調べてみましたか?

于 2012-06-27T14:08:44.390 に答える
0

コードに少しメモリリークがあります。

したがって、これの代わりに: [worker release];

この行を試してください:[worker autorelease];

問題が発生したかどうかはわかりませんが、お使いのバージョンは間違いなく見栄えがよくありません。

于 2012-06-27T15:29:07.520 に答える