константная переменная не распознается как размерность массива - PullRequest
0 голосов
/ 08 сентября 2018
long AnsiString::pos(const char* plainString) const {
const size_t patternLength = strlen(plainString);
if (patternLength == 0) return -1;

size_t stringLength = count;
int partialMatch[patternLength]; // int* partialMatch = new int[patternLength];

KMPBuildPartialMatchTable(plainString, partialMatch);

int currentStringCharacter = 0;
int currentPatternCharacter = 0;
while (currentStringCharacter < stringLength) {
    if (currentPatternCharacter == -1) {
        currentStringCharacter++;
        currentPatternCharacter = 0;
    }
    else if (items[currentStringCharacter] == plainString[currentPatternCharacter]) {
        currentStringCharacter++;
        currentPatternCharacter++;
        if (currentPatternCharacter == patternLength) return currentStringCharacter - currentPatternCharacter;
    } else {
        currentPatternCharacter = partialMatch[currentPatternCharacter];
    }
}

// delete(partialMatch);

return -1;
 }

Я получаю ошибку при реализации этого метода claas с использованием Visual C ++.

int partialMatch[ patternLength ] ; // expression must have a constant value 

(я использую VS на другом языке, чтобы вы могли найти некоторые различия).

Я объявил patternLength константой, как вы можете видеть. Решение комментируется в коде, но я не хочу использовать динамическое выделение памяти. Какая-то идея?

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Размеры массива должны быть известны во время компиляции.

Переменная const не гарантирует этого. Спецификатор const гарантирует, что переменная не может быть изменена после ее инициализации.

Возможно, значение переменной const будет известно во время компиляции. Если компилятор может обнаружить это, то переменная может использоваться для определения размера массива.

Чаще всего значение переменной const неизвестно во время компиляции. Он инициализируется значением во время выполнения, которое нельзя изменить после инициализации переменной. Это не позволяет использовать его для определения размера массива.

Если вы хотите использовать переменную во время компиляции, используйте вместо нее constexpr. Компилятор сделает все возможное, чтобы оценить значение во время компиляции. Он потерпит неудачу, если значение переменной не может быть оценено во время компиляции.

0 голосов
/ 08 сентября 2018

Маркировка чего-либо const не делает его константным выражением как таковым.Это делает его только для чтения.Правая часть вашего утверждения должна удовлетворять требованиям constexpr , что не соответствует выражению strlen(plainString).Вы можете создать свою собственную функцию, которая будет оцениваться во время компиляции:

constexpr size_t constexprlength(const char* s) {
    return strlen(s);
}

и использовать ее вместо этого:

constexpr size_t patternLength = constexprlength(plainString);
int partialMatch[patternLength];

VLA и массивы символов evil .Вместо этого используйте std::vector и std::string.

0 голосов
/ 08 сентября 2018

Размер N в объявлении массива T[N] должен быть константным выражением во время компиляции.

std::size_t const a{42}; // is one,

std::size_t foo{std::rand() % 100};
std::size_t const b{foo}; // is not, because it depends on foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...