IOS: Распространение (выпуск) ошибок конфигурации и сбоев - PullRequest
0 голосов
/ 22 января 2011

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

Здеськод ошибки:

- (int*)completeNb:(int[9][9])aMatrix {
    int n, nb;
    int cell[2];
    int *pcell;
    BOOL found = FALSE;
    BOOL pos = FALSE;
    for (int k = 1; k <= 9; k++) {
        n = 0;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (aMatrix[i][j] == k)
                    n++;
            }
        }
        if (n == 8) {
            found = TRUE;
            nb = k;
            break;
        }
    }
    if (found) {
        for (int l = 0; l < 9; l++) {
            for (int m = 0; m < 9; m++) {
                if ([self isPossibleValue:aMatrix value:nb line:l column:m]) {
                    cell[0] = l;
                    cell[1] = m;
                    pos = TRUE;
                    break;
                }
            }
            if (pos)
                break;
        }
        pcell = cell;
    }
    else {
        pcell = nil;
    }
    return pcell;
}

У меня есть специальная сетка судоку, где я должен найти {6,6} в качестве правильной позиции для числа 6 (6 должно быть в i = 6 и j = 6 в сетке).Он отлично работает в конфигурации отладки, но с Distrib Conf кажется, что у меня проблема с l и m vars -> цикл хорошо разрывается при l = 6 и m = 6 (следовательно, функция isPossibleValue , кажется, работает хорошо), но тогда моя переменная cell равна {1; 0}, вместоиз {6; 6}!

Я использую этот тип процесса (возвращая cell [2] ) со многими другими функциями, и у меня нет проблем с DistribConf.

Моя вторая проблема - и эта проблема провоцирует сбой приложения - связана со следующим кодом (опять же, отлично работает с конфигурацией отладки).

- (void)solver:(int[9][9])aMatrix {
    if (!Termine) {
        int *emptyCell = [self firstEmptyCell:aMatrix];
        if (emptyCell != nil) {
            int i = emptyCell[0];
            int j = emptyCell[1];
            for (int k = 1; k <= 9; k++) {
                if ([self isPossibleValue:aMatrix value:k line:i column:j]) {
                    aMatrix[i][j] = k;
                    [self solver:aMatrix];
                    aMatrix[i][j] = 0;
                }
            }
        }
        else {
            if (!Termine) {
                Termine = TRUE;
                for (int i = 0; i < 9; i++)
                    for (int j = 0; j < 9; j++)
                        res[i][j] = aMatrix[i][j];
            }
        }

    }
}

Примечание: однаРешение - я не уверен, что это лучший вариант - это изменить уровень оптимизации с «самого быстрого, самого маленького» на «нет».

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 22 января 2011

Для первого случая проблема в int cell[2];.Он имеет локальную область видимости, и после возврата из функции зона памяти, указанная этим массивом, с большой вероятностью будет перераспределена для других нужд.Быстрое решение - добавить спецификатор static:

static int cell[2];

Для второго фрагмента убедитесь, что emptyCell каждый раз присваивает значениям i и j, которые не превышают aMatrix bounds [0..8] [0..8].

...