我正在尝试编译并运行一个简单的目标c代码但我在Windows上这样做。我正在使用GNU Step,我很难调试它并了解运行时的情况。我是一个.NET开发人员和我总是使用Visual Studio中的调试器来跟踪数据流和stuf,但这里......真的很烦人。我没有Mac Book,所以我也没有XCode。
有人可以告诉我代码安静的问题是什么?这很简单,如果有Mac的人可以为我调试它并告诉我什么是错误的话会很棒。
代码的想法是它逐行读出一个文本文件,然后在每3行代码中创建一个NSMutableArray的Object并将它添加到另一个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]);
我遇到下一个错误: 未捕获异常NSRangeException,原因:索引0超出范围0(在'objectAtIndex:'中)
答案 0 :(得分:1)
我假设你不小心在输入文件的末尾留下了一个(空白)行,因为你提到的异常并没有按字面意思给出。我已编辑了您的问题以反映这一点。然后,假设文件以这种方式修复:
异常的直接原因是,在调用最终tmpArray
时,NSLog
为空。原因是每次通过前一个循环重用相同的tmpArray
对象;您将tmpArray
添加到resultObjectsArray
,然后清除tmpArray
并开始向其中添加其他成员。这是一个问题的原因是数组元素是由引用添加的,而不是复制的;您需要每次都复制tmpArray
或制作一个全新的临时对象。
因此,当您到达最终NSLog
时,resultObjectsArray
中的第一个元素与tmpArray
是同一个对象;你刚刚在[tmpArray removeAllObjects]
条件中调用了if(i%4 == 3)
,所以它是空的;因此第二个objectAtIndex:0
引发了异常。
现在,至于为什么输入文件的原始版本(最后没有空行的那个)不会触发相同的异常(但也无法正常运行):你的for
循环变为逐行,并将每行添加到tmpArray
,直到它到达索引可被4整除的行,此时它会清除tmpArray
,以便下次可以开始添加更多行。您提供的输入文件的原始版本有11行,因此最后未清除tmpArray
;因此,tmpArray
以及用作resultObjectsArray
元素的相同对象包含最后三行读取。由于它不是空的,objectAtIndex:0
没有提出一个除外。但与此同时,逻辑是错误的,因为NSLog
应该返回数组中的 first 元素,但是当它发生时,所有元素都是对同一个元素的引用{ {1}}对象,仅包含最后一行的行。