2013-02-25 94 views
0

我試圖編寫一個計算器程序,但是當按下與函數expressionEvaluation關聯的特定鍵時,我遇到了這個錯誤。我的計算器工作正常,但我試圖添加使用/存儲變量的功能。爲此,我使用expressionEvaluation按鈕。但是,只要我按下鏈接到該方法的按鈕,整個應用程序崩潰,xcode給我錯誤EXC_BAD_ACCESS code = 2。我是新來的Objective-C,所以我不知道如何調試這個錯誤。據我所知,問題是與行Objective-C麻煩:EXC_BAD_ACCESS code = 2

double result = [CalculatorBrain evaluateExpression:self.brain.expression usingVariableValues:testValues]; 

...在我的視圖控制器。我在這條線之前設置了一個斷點,但它沒有崩潰,但將它設置在這條線上導致了我遇到的崩潰。 我試圖在下面切下代碼,並且只包含直接鏈接到expressionEvaluation按鈕的東西。感謝您的幫助!

下面是我的大腦方法.H:

// CalculatorBrain.h 

#import <Foundation/Foundation.h> 

@interface CalculatorBrain : NSObject 
- (void) pushOperand:(double)operand; 
- (void) setVariableAsOperand:(NSString *)variableName; 
- (void) performWaitingOperation; 
- (double) performOperation:(NSString *)operation; 

@property (readonly) id expression; 
+ (double)evaluateExpression: (id)anExpression 
     usingVariableValues: (NSDictionary *)variables; 
+ (NSSet *)variablesInExpression:(id)anExpression; 
+ (NSString *)descriptionOfExpression:(id)anExpression; 

+ (id)propertyListForExpression:(id)anExpression; 
+ (id)expressionForPropertyList:(id)propertyList; 

@end 

這裏的.M:

// CalculatorBrain.m 

#import "CalculatorBrain.h" 
#define VARIABLE_PREFIX @"^" 

@interface CalculatorBrain() 
@property (nonatomic) double operand; 
@property (nonatomic, strong) NSString *waitingOperation; 
@property (nonatomic) double waitingOperand; 
@property (nonatomic) double storedOperand; 
@property (nonatomic) NSMutableArray *internalExpression; 
@end 

@implementation CalculatorBrain 
@synthesize operand = _operand;      //operand in use 
@synthesize waitingOperation = _waitingOperation; //waiting to be computed 
@synthesize waitingOperand = _waitingOperand;  //waiting to be used 
@synthesize storedOperand = _storedOperand;   //stored in memory 
@synthesize internalExpression = _internalExpression; //private expression stored 
@synthesize expression = _expression; 

- (id) expression {; 
    return [NSMutableArray arrayWithArray:self.internalExpression]; 
} 

//here I have instance methods that add objects to the array internalExpression 
//these work fine as far as I can tell 

+ (double) evaluateExpression:(id)anExpression usingVariableValues:(NSDictionary *)variables { 
    double result = 0; 
    int count = [anExpression count]; 
    CalculatorBrain *brain; 
    for (int i = 0; i < count; i++) { 
     if([[anExpression objectAtIndex:i] isKindOfClass:[NSNumber class]]) { 
      double operand = [[anExpression objectAtIndex:i] doubleValue]; 
      [brain pushOperand:operand]; 
     } 
     if([[anExpression objectAtIndex:i] isKindOfClass:[NSString class]]) { 
      NSString *string = [anExpression objectAtIndex:i]; 
      if([string characterAtIndex:0] == '^') { 
       NSString* variable = [NSString stringWithFormat:@"%c",[string characterAtIndex:1]]; 
       double valueOfVariable = [[variables objectForKey:variable] doubleValue]; 
       [brain pushOperand:valueOfVariable]; 

      } 
      else { 
       NSString* operator = [anExpression objectAtIndex:i]; 
       result = [brain performOperation:operator]; 
      } 
     } 
    } 
    return result; 
} 

@end 

下面是我的看法控制器.H:

// CalcViewController.h 

#import <UIKit/UIKit.h> 
//view controller for calculator 
@interface CalcViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UILabel *display;   //real-time display 
@property (strong, nonatomic) IBOutlet UILabel *miniDisplay; //past display 
@property (strong, nonatomic) IBOutlet UILabel *memDisplay;  //display stored digits 
- (IBAction)digitPressed:(UIButton *)sender; //pressed number 
- (IBAction)operandPressed:(UIButton *)sender; //pressed operation 
- (IBAction)variablePressed:(UIButton *)sender; //pressed variable 
- (IBAction)expressionEvaluation:(UIButton *)sender; //evaluate expression with variables 
@end 

這裏的.m:

// CalcViewController.m 

#import "CalcViewController.h" 
#import "CalculatorBrain.h" 

@interface CalcViewController() 
@property (nonatomic, strong) CalculatorBrain *brain; 
@property (nonatomic) BOOL userIsInTheMiddleOfTypingANumber; 
@end 

@implementation CalcViewController 
- (CalculatorBrain *) brain { 
    if (!_brain) _brain = [[CalculatorBrain alloc] init]; 
    return _brain; 
} 

- (IBAction)expressionEvaluation:(UIButton *)sender { 
    NSDictionary* testValues = [NSDictionary dictionaryWithObjectsAndKeys:@"x", 2, @"y", 3, @"z", 4, nil]; 
    double result = [CalculatorBrain evaluateExpression:self.brain.expression usingVariableValues:testValues]; 
    NSString *resultString = [NSString stringWithFormat:@"%g", result]; 
    self.display.text = resultString; 
} 


@end 

編輯:就像一個側面說明,我沒有得到任何錯誤,只有一個警告:不完整的實現。這是因爲我還沒有完成一對夫妻班的方法,但我不認爲這會導致車禍。

+0

打開異常斷點: http://developer.apple.com/library/mac/#recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html – lottscarson 2013-02-25 23:33:57

+0

@lottscarson我跟着步驟添加一個異常斷點,然後試圖運行它,但它在同一個地方墜毀,沒有提出任何例外。 – 2013-02-25 23:40:20

回答

0

通過在xCode中添加異常斷點,您將獲得有關引發異常的代碼行的更多信息。

+0

然而,給我例外的那一行是:0x10e5098:movl(%eax),%edx – 2013-02-25 23:34:45

+1

當你查看左邊的調用堆棧時,如果你停下來,你應該能夠在一個點上找到你自己的代碼(它應該是黑色文字而不是灰色)。 – Kirualex 2013-02-25 23:47:03

+0

謝謝!這幫了很多忙。 – 2013-02-26 00:37:27

1
NSDictionary* testValues = [NSDictionary dictionaryWithObjectsAndKeys:@"x", 2, @"y", 3, @"z", 4, nil]; 

原來是錯誤的一行。它應該是:

NSDictionary* testValues = [NSDictionary dictionaryWithObjectsAndKeys:@"x", [NSNumber numberWithInt:2], @"y", [NSNumber numberWithInt:3], @"z", [NSNumber numberWithInt:4], nil]; 

感謝所有幫助過的人!