Массивы, объявленные глобально, выдают ошибку из области видимости в функциях - PullRequest
1 голос
/ 06 октября 2019

У меня есть эти массивы, объявленные глобально

char str1[] = "6541254939322816220209974565477289648317";
char str2[] = "3142522751761601737419090933147067701840";

int str1_size = strlen(str1);
int str2_size = strlen(str2);

int lcs[str1_size][str2_size];
int arrows[str1_size][str2_size];

Но когда я получаю доступ к этому внутри функции, это дает

lcs was not declared in this scope

также

array bound is not an integer constant before ‘]’ token
int lcs[str1_size][str2_size];

Что такоеЯ тут не так делаю?

1 Ответ

1 голос
/ 06 октября 2019

Прежде всего

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...