Я написал фрагмент кода для реализации алгоритма LCS для моего приложения. В этом алгоритме я реализовал массив с использованием malloc. Но я не уверен, что делаю что-то не так. Я не смог найти какое-либо конкретное сообщение с указанием причины. Я не мог найти выход.
Примечание: у меня есть дуга на
мой код указан ниже
- (IBAction)buttonAction:(id)sender
{
[self getInlineDiffofFragment1:[NSArray arrayWithObjects:@"line1", @"line2", @"line3", @"line4", @"line5", nil] andFragment2:[NSArray arrayWithObjects:@"line1", @"line2", @"line4", @"line6", nil]];
}
- (void)getInlineDiffofFragment1:(NSArray*)fragment1 andFragment2:(NSArray*)fragment2
{
int row = fragment1.count + 1;
int col = fragment2.count + 1;
int *lcs = (int*)malloc(sizeof(int) * row * col); //2d array
NSString *str;
for (int i = 0; i <= fragment1.count; i++) {
lcs[i * row] = 0;
}
for (int j = 0; j <= fragment2.count; j++) {
lcs[0 + j] = 0;
}
for (int i = 1; i < row; i++) {
str = [NSString stringWithFormat:@""];
for (int j = 1; j < col; j++) {
int xy = i * row + j;
if ([[fragment1 objectAtIndex:i - 1] isEqualToString:[fragment2 objectAtIndex:j - 1]]) {
lcs[xy] = lcs[(i - 1) * row + (j - 1)] + 1;
} else {
lcs[xy] = MAX(lcs[(i - 1) * row + j], lcs[i * row + (j - 1)]);
}
str = [str stringByAppendingFormat:@"%d ", lcs[xy]];
}
NSLog(@"%@", str);
}
free(lcs);
NSLog(@"freed");
}
Функция отлично распечатывает результат как положено и выходит из блока. Результат приведен ниже
2012-09-26 16:14:18.727 TestDiff[56178:11303] 1 1 1 1
2012-09-26 16:14:18.733 TestDiff[56178:11303] 1 2 2 2
2012-09-26 16:14:18.734 TestDiff[56178:11303] 1 2 2 2
2012-09-26 16:14:18.735 TestDiff[56178:11303] 1 2 3 3
2012-09-26 16:14:18.736 TestDiff[56178:11303] 1 2 3 3
2012-09-26 16:14:18.736 TestDiff[56178:11303] freed
после распечатки результата и выхода из блока происходит сбой. Отчет о сбое следующий
Программа была в порядке для следующей функции теста
#define WIDTH 4
#define HEIGHT 5
#define INDEXOF(x,y) ((y*WIDTH) + x)
- (void)testArray
{
NSString *str;
int *myArray = (int *) malloc(sizeof(int) * 5 * 4); // 4 * 5 array
for(int x=0; x<WIDTH; x++){
str = [NSString stringWithFormat:@""];
for(int y=0; y<HEIGHT; y++){
myArray[INDEXOF(x,y)] = y;
str = [str stringByAppendingFormat:@"%d ", myArray[INDEXOF(x, y)]];
}
NSLog(@"%@", str);
}
free(myArray);
}
Спасибо за вашу помощь
Вы пытались поставить точку останова на линии с free(myArray);
? Успешно ли он дошел до этой точки, а затем потерпел крах, когда перешагнул через него?
Кроме того, если вы получаете EXC_BAD_ACCESS, вы должны попробовать Включение зомби и посмотреть, если что-то уже выпущено.
Перейдите в настройки сборки и найдите элемент под названием «Compile Source As». Измените его значение на «Objective C ++».