Создание массива C в Objective C - Ошибка при сбое - неверная контрольная сумма для освобожденного объекта - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь настроить многомерный массив в стиле C. Это массив значений 301 на 16 с плавающей точкой. Я использую следующий код:

float ** animationArray;

animationArray = (float **)calloc(16, sizeof(float*));
    for (int i=0; i<301; i++) {
        animationArray[i] = (float*)calloc(301, sizeof(float));
    }

    int i;

    for (i=0; i<301;i++) {

    NSArray * animationEntry = [Animations objectAtIndex:i];

    animationArray[i][0] = [[animationEntry objectAtIndex:0]doubleValue];
    animationArray[i][4] = [[animationEntry objectAtIndex:1]doubleValue];
    animationArray[i][8] = [[animationEntry objectAtIndex:2]doubleValue];
    animationArray[i][12] = [[animationEntry objectAtIndex:3]doubleValue];
    animationArray[i][1] = [[animationEntry objectAtIndex:4]doubleValue];
    animationArray[i][5] = [[animationEntry objectAtIndex:5]doubleValue];
    animationArray[i][9] = [[animationEntry objectAtIndex:6]doubleValue];
    animationArray[i][13] = [[animationEntry objectAtIndex:7]doubleValue];
    animationArray[i][2] = [[animationEntry objectAtIndex:8]doubleValue];
    animationArray[i][6] = [[animationEntry objectAtIndex:9]doubleValue];
    animationArray[i][10] = [[animationEntry objectAtIndex:10]doubleValue];
    animationArray[i][14] = [[animationEntry objectAtIndex:11]doubleValue];
    animationArray[i][3] = [[animationEntry objectAtIndex:12]doubleValue];
    animationArray[i][7] = [[animationEntry objectAtIndex:13]doubleValue];
    animationArray[i][11] = [[animationEntry objectAtIndex:14]doubleValue];
    animationArray[i][15] = [[animationEntry objectAtIndex:15]doubleValue];

    }

}

Однако этот код вызывает сбой с ошибкой «неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения».

Может ли кто-нибудь определить, что не так?

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Вы переключили 16 и 301 в своем цикле for в отношении своего вызова распределения.

1 голос
/ 24 февраля 2012

Вы перевернули 16 и 301 в своих декларациях.Поэтому измените его на:

float ** animationArray = (float **) calloc(301, sizeof(float*)); // Array of 301 float arrays
for (int i=0; i<301; i++) {
    animationArray[i] = (float*)calloc(16, sizeof(float)); // Array of 16 floats
}

Также обратите внимание, что вы можете упростить цикл for следующим образом:

1 голос
/ 24 февраля 2012

Кажется, проблема здесь:

for (int i=0; i<16; i++) {
        animationArray[i] = (float*)calloc(301, sizeof(float));
}

Переменная i должна быть 16 вместо 301, вы только что выделили 16 пробелов.

...