方法返回0

时间:2012-06-27 13:45:36

标签: objective-c calculator

我正在从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,而不是解决方案。毕竟,家庭作业是要学习的。)

3 个答案:

答案 0 :(得分:1)

您是否尝试过一次一行代码并检查变量值?

答案 1 :(得分:1)

可能的问题可以显示在:

 returnValue = [worker performOperation:term];

returnValue = worker.operand;

您应该在此行(或下面一行)中停止调试器,并观察returnValue更改的值。

Screen

你停止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];

我不确定是否会导致问题,但您的版本看起来不太好。