Прежде всего
int a[dim];
, где dim
не является константой времени компиляции (например, constexpr
), не является стандартом C ++;возможно это возможно с некоторым расширением с некоторым компилятором, но не является стандартом C ++.
Итак, в вашем случае
int lcs[str1_size][str2_size];
int arrows[str1_size][str2_size];
, где str1_size
и str2_size
нормальные (не * 1013)*, а не const
инициализированные переменными), это ошибка.
Если бы вы могли переопределить str1_size
и str2_size
следующим образом
constexpt int str1_size = strlen(str1);
constexpr int str2_size = strlen(str2);
lcs
и arrows
определение может работать.
К сожалению (1) str1
и str2
не constexpr
и (2) std::strlen()
не constexpr
.
Ноесли объявить str1
/ str2
constexpr
и написать constexpr
альтернативу std::strlen
...
#include <iostream>
constexpr std::size_t lenStr (char const * str)
{
std::size_t ret{};
while ( *(str++) )
++ret;
return ret;
}
constexpr char str1[] = "6541254939322816220209974565477289648317";
constexpr char str2[] = "3142522751761601737419090933147067701840";
constexpr auto str1_size = lenStr(str1);
constexpr auto str2_size = lenStr(str2);
int lcs[str1_size][str2_size];
int arrows[str1_size][str2_size];
int main ()
{
}
К сожалению, предыдущий код требует C ++ 14 (в C ++ 11невозможно написать столь сложные constexpr
функции).
В C ++ 11 вы должны написать lenStr()
рекурсивным способом
constexpr std::size_t lenStr (char const * str, std::size_t ret = 0u)
{ return *str ? lenStr(++str, ++ret) : ret; }