0

我正在尝试编译和运行一个简单的目标 c 代码,但我是在 Windows 上进行的。我使用的是 GNU Step,我很难调试它并理解运行时发生的事情。我是一名 .NET 开发人员而且我总是使用 Visual Studio 中的调试器来跟踪数据流和 stuf,但在这里......真的很烦人。我没有 Mac Book,所以我也没有 XCode。

任何人都可以告诉我代码和平中有什么问题吗?这很简单,如果有 Mac 的人可以为我调试它并告诉我出了什么问题,那就太好了。

代码的想法是它逐行读出一个文本文件,然后在每 3 行代码中创建一个 NSMutableArray 对象并将其添加到另一个 NSMutableArray。这里是:

read_line 函数:

int read_line(FILE *in, char *buffer, size_t max)
{
  return fgets(buffer, max, in) == buffer;
}

文本文件的内容:

Sophie Ellis-Bextor
71222
5.01

Inna Morales
61223
6.00

Kortez Domingues
41231
3.25

主要代码:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    FILE *in;
        if((in = fopen("C:...\\Input.txt", "rt")) != NULL)
        {
            char line[256];

            NSMutableArray* resultArray     = [[NSMutableArray alloc] init];

            while(read_line(in, line, sizeof line))
            {
            NSString *currentLine = [[NSString alloc] initWithUTF8String:line]; 
            [resultArray addObject:currentLine];
            }

            NSMutableArray*resultObjectsArray =[[NSMutableArray alloc] init];
            NSMutableArray*tmpArray =[[NSMutableArray alloc] init];

            for(int i=0 ; i <[resultArray count];i++)
            {
                if(i%4 == 3)
                {
                    [resultObjectsArray addObject:tmpArray];
                    [tmpArray removeAllObjects];
                    NSLog(@"Here we add a new object");
                }
                else
                {
                    [tmpArray addObject:[resultArray objectAtIndex:i]];
                    NSLog(@"%@",[resultArray objectAtIndex:i]);
                }
            } 
            fclose(in);     
            NSLog(@"First object in the result Array: %@",[[resultObjectsArray objectAtIndex:0] objectAtIndex:0]);      
        }

[pool drain];

我所能看到的只是在

NSLog(@"First object in the result Array: %@",[[resultObjectsArray objectAtIndex:0] objectAtIndex:0]);

行我得到下一个错误: Uncaught Exception NSRangeException, reason:Index 0 is out of range 0 (in 'objectAtIndex:')

4

1 回答 1

1

我假设您不小心在输入文件的末尾留下了一个(空白)行,因为您提到的异常不会发生在给定的文件中。我已经编辑了您的问题以反映这一点。然后,假设文件以这种方式修复:

异常的直接原因是调用tmpArrayfinal 时为空NSLog。这样做的原因是您tmpArray每次通过前面的循环都重用同一个对象;您添加tmpArrayresultObjectsArray,然后清除tmpArray并开始向其中添加其他成员。这是一个问题的原因是数组元素是通过引用添加的,而不是复制的;您需要tmpArray每次复制或制作一个全新的临时对象。

所以,当你到达 final 时NSLog,第一个元素resultObjectsArray是与 ; 相同的对象tmpArray。你刚刚调用[tmpArray removeAllObjects]if(i%4 == 3)条件,所以它是空的;因此第二个objectAtIndex:0引发了一个例外。

现在,至于为什么输入文件的原始版本(末尾没有空行的那个)不会触发相同的异常(但也不能正常运行):您的for循环逐行遍历,并添加每个行到tmpArray,直到它到达索引可以被 4 整除的行,此时它会清除tmpArray,以便下次可以开始添加更多内容。您提供的输入文件的原始版本有 11 行,所以tmpArray最后没有清除;因此tmpArray,以及作为 的元素的相同对象resultObjectsArray,包含读取的最后三行。由于它不是空的,objectAtIndex:0所以没有提出异常。但同时,逻辑是错误的,因为NSLog应该返回第一个数组中的元素,但碰巧所有元素都是对同一tmpArray对象的引用,该对象仅包含最后一行。

于 2013-06-22T16:47:31.267 回答