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中有注释,但我不想使用动态内存分配。有想法吗?
答案 0 :(得分:4)
必须在编译时知道数组大小。
const
变量不能确保做到这一点。 const
限定符确保变量一旦初始化就无法修改。
在编译时可能知道const
变量的值。如果编译器可以检测到该变量,则可以使用该变量定义数组的大小。
通常,在编译时不知道const
变量的值。它在运行时用一个值初始化,该值在变量初始化后不能更改。这不适合用于定义数组的大小。
如果希望能够在编译时使用变量,请改用constexpr
。编译器将尽力在编译时评估该值。如果无法在编译时评估变量的值,则会失败。
答案 1 :(得分:2)
数组声明val sumRDD=kvRDD.groupByKey.map(rec=>(rec._1,(rec._2.map(_._1).sum,rec._2.map(_._2).sum)))
//Output
scala> sumRDD.collect
res11: Array[(String, (Int, Int))] = Array((Robert,(32,2)), (Chris,(65,2)))
中的大小N
必须是编译时常量表达式。
T[N]
答案 2 :(得分:0)
标记某物const
本身并不能使其成为constant expression。它使其成为只读。语句的右侧应满足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
。