Существует проблема, когда я запускаю код Левенштейна - PullRequest
1 голос
/ 12 января 2020

При программировании Левенштейна возникает проблема. Это извлеченный код из Inte rnet.

Код выглядит следующим образом:

#define MIN3(a, b, c) ((a) < (b) ? ((a) < (c) ? (a) : (c)) : ((b) < (c) ? (b) : (c)))

int levenshtein(char *s1, char *s2) {
    unsigned int s1len, s2len, x, y, lastdiag, olddiag;
    s1len = strlen(s1);
    s2len = strlen(s2);
    unsigned int column[s1len + 1];
    for (y = 1; y <= s1len; y++)
        column[y] = y;
    for (x = 1; x <= s2len; x++) {
        column[0] = x;
        for (y = 1, lastdiag = x - 1; y <= s1len; y++) {
            olddiag = column[y];
            column[y] = MIN3(column[y] + 1, column[y - 1] + 1, lastdiag + (s1[y - 1] == s2[x - 1] ? 0 : 1));
            lastdiag = olddiag;
        }
    }
    return(column[s1len]);
}

Проблема заключается в утверждении: unsigned int column[s1len + 1]; on unsigned int s1len:

Ошибка: выражение должно иметь постоянное значение.

1 Ответ

0 голосов
/ 12 января 2020

Проблема в том, что язык C++ не поддерживает массивы переменной длины (VLA). Код, который вы извлекли из inte rnet, возможно / вероятно был написан как C, то есть другой язык из C++, а поддерживает поддержку VLA (так как Стандарт C99, IIR C).

Вы можете «исправить» свой код для работы с standard C++, используя контейнер std::vector вместо VLA. Обязательно включите заголовочный файл <vector>:

#include <vector>
//.. .
// unsigned int column[s1len + 1];  // NOT standard C++
   std::vector<unsigned int>column(s1len + 1);

Вы можете получить доступ к элементам вектора, используя его оператор [], поэтому вам не нужны никакие другие изменения в вашем коде.

Примечание: некоторые C++ реализации делают поддерживают VLA (я думаю, что GNU g ++ поддерживает) - но стандарт не делает.

...