繁体   English   中英

EXC_BAD_ACCESS,简单的计算器,Objective-C

[英]EXC_BAD_ACCESS, simple calculator, Objective-C

大家好,我一直在为 iOS 编写一个简单的计算器教程,因为我的几个朋友希望我教他们一些基本概念。 我想我花了太多时间对我已经编写的应用程序进行微调,因为当我编写这段代码时,它被错误所困扰。

我会发布代码; 之后会解释它是如何工作的。

#import "_23ViewController.h"

@interface _23ViewController ()
{
    NSMutableArray* stack;
    NSMutableString *stringA;
    NSMutableString *stringB;
    NSMutableString *operation;
    NSUInteger *aorb;
}

@end

@implementation _23ViewController

- (void)viewDidLoad
{
   [super viewDidLoad];

   // Do any additional setup after loading the view, typically from a nib.
   [stack addObject: stringA];
   [stack addObject: stringB];
}

- (void)didReceiveMemoryWarning
{
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

- (IBAction)zero:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"0"];
}

- (IBAction)one:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"1"];
}

- (IBAction)two:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"2"];
}

- (IBAction)three:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"3"];
}

- (IBAction)four:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"4"];
}

- (IBAction)five:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"5"];
}

- (IBAction)six:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"6"];
}

- (IBAction)seven:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"7"];
}

- (IBAction)eight:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"8"];
}

- (IBAction)nine:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"9"];
}

- (IBAction)decimal:(id)sender
{
   [[stack objectAtIndex:*(aorb)] stringByAppendingString:@"."];
}

- (IBAction)equals:(id)sender
{
   float a = [[stack objectAtIndex:0] floatValue];
   float b = [[stack objectAtIndex:1] floatValue];
   float answer;

   if ([operation isEqualToString:@"addition"])
   {
       answer = a + b;
   }
   if ([operation isEqualToString:@"subtraction"])
   {  
       answer = a - b;
   }
   if ([operation isEqualToString:@"multiplication"])
   {
       answer = a * b;
   }
   else
   {
       answer = a / b;
   }
   self.disp.text = [NSString stringWithFormat:@"%f",answer];
}

- (IBAction)clear:(id)sender
{
    for (int i = 0; i < 2; i++)
    {
        [stack insertObject:@"0" atIndex:i];
    }
}

- (IBAction)plus:(id)sender
{
    aorb++;
    [operation setString: @"addition"];
}

- (IBAction)minus:(id)sender
{
    aorb++;
    [operation setString: @"subtraction"];
}

- (IBAction)div:(id)sender
{
    aorb++;
    [operation setString: @"division"];
}

- (IBAction)mult:(id)sender
{
    aorb++;
    [operation setString: @"multiplication"];
}

@end

现在,理想情况下,这段代码应该做的是在加载视图时,将stringAstringB添加到名为stack的数组中。 每个按下的数字都应附加到位于 NSUInteger aorb指定的数组索引处的字符串。 最初这是零,但是当按下操作按钮时,它会增加,并将operation NSString 设置为特定操作。 一旦 NSUInteger 增加,数字键就会附加到stringB而不是stringAequals IBAction会考虑到这一点并相应地旋转结果。

问题是,每当我模拟这个时,我都会收到EXC_BAD_ACCESS error, code 2, address 0x0在我首先按下的任何键上的EXC_BAD_ACCESS error, code 2, address 0x0 ,特别是在理想执行的行上。 我之前必须调试SIGABRT ,但没有任何帮助可以真正解决此错误。 这是我第一次抛出这样的内存异常,所以我真的不知道该怎么做。

如果这还不够详细/如果您需要更多代码( .h文件),请告诉我,我会将其发布。 谢谢大家。

将此添加到您的viewDidLoad

[super viewDidLoad];

stack = [NSMutableArray array];
stringA = [NSMutableString string];
stringB = [NSMutableString string];

[stack addObject: stringA];
[stack addObject: stringB];

你还需要初始化aorb (并给它一个更好的名字)。 它也可能不需要是指针。

将其更改为NSUInteger aOrB; 并将aOrB = 0添加到viewDidLoad

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM