2013-06-19 4 views
0

Я пытаюсь скомпилировать и запустить простой объектный код c, но я делаю это в Windows. Я использую GNU Step, и мне очень сложно отлаживать его и понимать, что происходит runtime.I я разработчик .NET, и я всегда использую Debugger в Visual Studio, чтобы следить за потоком данных и stuf, но здесь ...... это очень раздражает. У меня нет Mac Book, поэтому я не тоже есть XCode.Проблема с отладкой кода Objective C

Может кто-нибудь сказать мне, в чем проблема в этом мире кода? Это довольно просто, и было бы здорово, если бы кто-то, у кого есть Mac, мог отладить его для меня и сказать мне, что не так.

Идея кода является то, что он считывает текстовый файл построчно, а затем каждые 3 строки кода это делает объект NSMutableArray и добавляет его к другому NSMutableArray.Here это:

The 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 Исключение NSRangeException, причина: Индекс 0 выходит за пределы диапазона 0 (в 'objectAtIndex:')

ответ

1

Я предполагаю, что вы случайно удалили (пустую) строку в конце вашего входного файла, так как исключение, которое вы упомянули, не происходит с файлом в буквальном смысле, как указано. Я отредактировал ваш вопрос, чтобы отразить это. Затем, предположив, что файл зафиксирован таким образом:

Непосредственной причиной исключения является то, что tmpArray пуст, когда вызывается окончательный NSLog. Причина этого в том, что вы каждый раз используете один и тот же объект tmpArray через предыдущий цикл; вы добавляете tmpArray в resultObjectsArray, а затем очищаете tmpArray и начинаете добавлять к нему дополнительных членов. Причина, по которой это проблема, заключается в том, что элементы массива добавляются с ссылкой, не скопированы; вам нужно либо скопировать tmpArray каждый раз, либо создать новый временный объект.

Итак, когда вы достигнете финала NSLog, первый элемент в resultObjectsArray - это тот же объект, что и tmpArray; вы только что вызвали [tmpArray removeAllObjects] в if(i%4 == 3) условном, поэтому он пуст; таким образом, второй objectAtIndex:0 вызывает исключение.

Теперь, почему исходная версия входного файла (тот, который не содержит пустую строку в конце) не вызывает одно и то же исключение (но также не работает правильно): ваш цикл for проходит через строку line и добавляет каждую строку к tmpArray, пока не достигнет строки, индекс которой равномерно делится на 4, после чего она очищает tmpArray, чтобы он мог начать добавлять к ней больше в следующий раз.Исходная версия входного файла, который вы дали, имела 11 строк, поэтому tmpArray не был очищен в конце; таким образом, tmpArray, а также идентичные объекты, служащие элементами resultObjectsArray, содержали последние три строки, которые были прочитаны. Поскольку он не был пустым, objectAtIndex:0 не поднимал исключение. Но в то же время логика была неправильной, поскольку предполагается, что NSLog возвращает элемент в массиве, но, как это происходит, все элементы являются ссылками на тот же объект tmpArray, который содержит только последнюю строфу линий.