const 变量未被识别为数组维度
const variable not recognized as array dimension
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;
}
我在使用 Visual C++ 实现此 claas 方法时遇到错误。
int partialMatch[ patternLength ] ; // expression must have a constant value
(我使用的是其他语言的 VS,因此您可以找到一些差异)。
如您所见,我将 patternLength 声明为常量。在 ccode 中注释了一个解决方案,但我不想使用动态内存分配。一些想法?
数组声明 T[N]
中的大小 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
数组大小必须在编译时已知。
A const
变量不能确保这一点。 const
限定符确保变量一旦初始化就不能被修改。
const
变量的值可能在编译时已知。如果编译器可以检测到,则该变量可用于定义数组的大小。
更常见的是,const
变量的值在编译时是未知的。它在 运行 时用一个值初始化,变量初始化后不能更改。这不适合用于定义数组的大小。
如果您希望能够在编译时使用该变量,请改用constexpr
。编译器将尽最大努力在编译时评估该值。如果无法在编译时评估变量的值,它将失败。
标记某些内容 const
不会使其成为 constant expression per se. It makes it a read only. The right hand side of your statement should satisfy constexpr function 要求,而 strlen(plainString)
表达式则不会。您可以创建自己的函数,在编译期间对其进行评估:
constexpr size_t constexprlength(const char* s) {
return strlen(s);
}
并改用它:
constexpr size_t patternLength = constexprlength(plainString);
int partialMatch[patternLength];
VLA 和字符数组是邪恶的。请改用 std::vector
和 std::string
。
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;
}
我在使用 Visual C++ 实现此 claas 方法时遇到错误。
int partialMatch[ patternLength ] ; // expression must have a constant value
(我使用的是其他语言的 VS,因此您可以找到一些差异)。
如您所见,我将 patternLength 声明为常量。在 ccode 中注释了一个解决方案,但我不想使用动态内存分配。一些想法?
数组声明 T[N]
中的大小 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
数组大小必须在编译时已知。
A const
变量不能确保这一点。 const
限定符确保变量一旦初始化就不能被修改。
const
变量的值可能在编译时已知。如果编译器可以检测到,则该变量可用于定义数组的大小。
更常见的是,const
变量的值在编译时是未知的。它在 运行 时用一个值初始化,变量初始化后不能更改。这不适合用于定义数组的大小。
如果您希望能够在编译时使用该变量,请改用constexpr
。编译器将尽最大努力在编译时评估该值。如果无法在编译时评估变量的值,它将失败。
标记某些内容 const
不会使其成为 constant expression per se. It makes it a read only. The right hand side of your statement should satisfy constexpr function 要求,而 strlen(plainString)
表达式则不会。您可以创建自己的函数,在编译期间对其进行评估:
constexpr size_t constexprlength(const char* s) {
return strlen(s);
}
并改用它:
constexpr size_t patternLength = constexprlength(plainString);
int partialMatch[patternLength];
VLA 和字符数组是邪恶的。请改用 std::vector
和 std::string
。