const变量无法识别为数组维

时间:2018-09-08 17:11:40

标签: c++ arrays visual-c++ 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中有注释,但我不想使用动态内存分配。有想法吗?

3 个答案:

答案 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::vectorstd::string