私は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
解決策ではなく、を求めました。結局のところ、宿題はそこから学ぶことです)。