2

アプリに 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);
}

ご協力いただきありがとうございます

4

2 に答える 2

1

の行にブレークポイントを配置しようとしましたfree(myArray);か? その地点まで無事に到達し、それをまたぐとクラッシュしますか?

また、EXC_BAD_ACCESS を取得している場合は、ゾンビをオンにして、何かが既にリリースされているかどうかを確認してください。

于 2012-09-26T22:58:31.400 に答える
1

Go to your build settings and look for an item called 'Compile Source As'. Change it's value to 'Objective C++'.

于 2012-09-26T22:50:40.633 に答える