我正在从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];
这样的显示,导致我的双重因为错误的演员而显示为0。
我通过使用调试器发现了这一点,所以建议实际解决它的人。 (我要求hints
,而不是解决方案。毕竟,家庭作业是要学习的。)
答案 0 :(得分:1)
您是否尝试过一次一行代码并检查变量值?
答案 1 :(得分:1)
可能的问题可以显示在:
returnValue = [worker performOperation:term];
和
returnValue = worker.operand;
您应该在此行(或下面一行)中停止调试器,并观察returnValue
更改的值。
你停止app点击它在屏幕上的位置,app停止,然后用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]);
因此,您可以考虑如何分配变量。在上面的示例中,释放内存不应该影响返回值,但是通过使用带有返回对象的自动释放,您不必分配任何内容。
答案 2 :(得分:0)
我在代码中看到一点内存泄漏:
所以,而不是这个:
[worker release];
试试这一行:[worker autorelease];
我不确定是否会导致问题,但您的版本看起来不太好。