Есть ли "неявное" распределение массивов в c ++ по объявлению? - PullRequest
0 голосов
/ 01 января 2019

Я хотел бы выделить память для массивов, когда их размеры неизвестны до времени выполнения, в C ++.

Я часто использую постоянное (время компиляции) выделение;но хотел бы добиться прогресса в направлении «всегда», используя распределение времени выполнения.Я на самом деле сходит с рук "неявное" распределение по декларации.(Моя терминология для того, что произошло.) И мне интересно, как это на самом деле называется и почему это работает.Фрагмент, который, я думаю, рассказывает историю:

std::ifstream infile;
infile.open("input_info");
if (infile.is_open()) {
  infile >> number;
  std::cout << number << "  " << std::endl;
}

std::pair<int, int> incident_subdomains[number]; 
int sd[number][2]; 

То есть;после чтения в нужном размере массивов, я объявляю массивы инцидент_субдомены и sd.Затем я использую эти массивы в последующем коде;например, чтобы прочитать информацию из "input_info", чтобы заполнить массивы.Программа скомпилирована и запущена.Это новая особенность C ++?Мне это нравится.(Я использовал «new» и «vector».) Я использую компилятор c ++: g ++ 7.3.0.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Спасибо всем за содержательные ответы.Я использую «вектор»;за исключением одной переменной.Хотя я мог настроить и использовать вектор пар, я не (не знал, как) передавать соответствующие указатели в функцию.Итак, я использовал «new», который прекрасно работает.

Я не могу себе представить, не используя распределения времени выполнения моих основных (релевантных для ячеек) массивов.Я прошел несколько версий кода.

В одном я попытался использовать «неявное» распределение - просто объявив размер массива во время выполнения;хотя это явно не стандартно, как вы все указали.Работа с ним была неожиданностью.

Кстати: я бы воспринял это как прогресс, потому что это проще.Но я стараюсь следовать стандарту.

Тим

0 голосов
/ 01 января 2019

И мне интересно, как это на самом деле называется

Массив переменной длины.

Это новая функция C ++?

Нет.Это не функция в стандарт C ++.В C ++ размер нединамически выделенного массива должен быть постоянной времени компиляции.

и почему он работает

Предположительно, потому что это расширение языка, предоставляемоетвой компилятор.Это особенность в C99 (и, возможно, в C11), поэтому некоторые компиляторы C ++, которые также совместимы с C99 (для компиляторов C ++ довольно часто также являются компиляторами C), вероятно, будут иметь такую ​​возможность.Вот что GCC говорит о вашей программе:

warning: ISO C++ forbids variable length array 'incident_subdomains' [-Wvla]

В то время как Clang говорит:

 warning: variable length arrays are a C99 feature [-Wvla-extension]

Самый простой способ создать динамическиразмер массива в стандарте C ++ должен использовать std::vector.

...