向后迭代数组抛出异常

时间:2013-08-28 21:02:27

标签: objective-c

我正在尝试制作一个像长时间添加一样的添加方法,所以我想从最后开始添加并向后工作,这样我就可以正确地使用等等。所以我目前正在努力开始工作向后翻过阵列。 例如,我想做什么。 两个数组,字符为123456789 我想从9 + 9开始添加它们然后移动到8 + 8

所以我很确定我正在使用正确的方法在数组上向后迭代,但每次我尝试时我只得到运行时错误,索引越界,我无法弄清楚原因。任何帮助都会很棒,我只是想弄清楚为什么它会一直抛出异常。

-(MPInteger *) add: (MPInteger *) x
{

    NSMutableArray *a = self->intString;
    NSMutableArray *b = x->intString;
    NSMutableArray *c = [NSMutableArray arrayWithCapacity:100];



    //for (int i  = 0; i < [a count]; i++) {
    for (NSInteger i = [a count] - 1; i > 0; i--) {
        int num = 10;
        NSNumber *ourNum = [NSNumber numberWithInt:num];
        NSNumber *total = [NSNumber numberWithInt:[[a objectAtIndex:i] intValue] + [[b objectAtIndex:i] intValue]];
        if ([total intValue] >= [ourNum intValue]) {
            total = [NSNumber numberWithInt:([total intValue] - [ourNum intValue])];
            [c addObject:[NSNumber numberWithInt:([total intValue])]];
        } else {
            [c addObject:[NSNumber numberWithInt:[[a objectAtIndex:i] intValue]+[[b objectAtIndex:i] intValue]]];
        }
        NSLog(@"%@", c[i]);
    }

    return x;
}

2 个答案:

答案 0 :(得分:4)

首先,让我们清理这段代码。

- (MPInteger *)add:(MPInteger *)x {
    NSMutableArray *a = self->intString;
    NSMutableArray *b = x->intString;
    NSMutableArray *c = [NSMutableArray arrayWithCapacity:100];

    for (NSInteger i = [a count] - 1; i > 0; i--) {
        int num = 10;
        NSNumber *ourNum = @(num);
        NSNumber *total = @([a[i] intValue] + [b[i] intValue]);

        if ([total intValue] >= [ourNum intValue]) {
            total = @([total intValue] - [ourNum intValue]);
            [c addObject:@([total intValue])];
        } else {
            [c addObject:@([a[i] intValue] + [b[i] intValue])];
        }

        NSLog(@"%@", c[i]);
    }

    return x;
}

接下来,让我们删除多余/重复的代码。

- (MPInteger *)add:(MPInteger *)x {
    NSMutableArray *a = self->intString;
    NSMutableArray *b = x->intString;
    NSMutableArray *c = [NSMutableArray arrayWithCapacity:100];

    for (NSInteger i = [a count] - 1; i > 0; i--) {
        int num = 10;
        NSNumber *total = @([a[i] intValue] + [b[i] intValue]);

        if ([total intValue] >= num) {
            total = @([total intValue] - num);
        }

        [c addObject:total];

        NSLog(@"%@", c[i]);
    }

    return x;
}

现在我们可以清楚地看到所有问题。

  1. 您将从[a count] - 1转到1。你应该一路走到0。
  2. ab可能有不同的尺寸,因此,如果您只[a count] - 10,那么,例如[b count] < [a count],您将获得尝试访问b[i]时,索引超出范围错误。
  3. 您要在c的末尾添加内容,但是您应该将其添加到c的开头,因为您正在向后迭代。
  4. 您不随身携带。
  5. 您正在访问不存在的c[i]

答案 1 :(得分:0)

你是从一个空数组'c'开始的,你的NSLog c [i]在第一次迭代时显然不在界限范围内。