Регистрация
15 Ноя 2013
Сообщения
76
Репутация
0
Спасибо
0
Монет
0
Я очень начинающий и прошу помощи решения задачи не полностью, а именно в инициализации одномерного массива с количеством элементов введенных пользователем. #include



using namespace std;



int main()

{

setlocale(LC_ALL, "ru");



int inp;



cout > inp;



const int a = inp;



int arr[a];

} это все что я успел написать, но компилятор считает за ошибку инициализацию массива.
 
Что бу понять проблему нужно обратить внимание на два очевидных факта. Перед тем как исполнить программу компилятор должен ее скомпилироватьЧто бы узнать размер массива (для компиляции) программа должна быть запущенна что бы запросить размер массива у пользователя.
Такие задачи решают с помощью указателя, на этапе компиляции программы просто объявляют указатель на массив данных нужного типа а на этапе выполнения программы (рантайме) запрашивают блок памяти нужного размера и указатель на него присваивают ранее объявленному указателю. Дальнейшая работа с массивом ничем не отличается от обычного объявления массива на этапе компиляции, за исключением того что запрошенную память необходимо будет вернуть системе иначе она будет помечена как занятая до окончания работы приложения. В стандартной библиотеке есть классы делающие это автоматически std::vector.

т.е. вместо «int arr[a];» можно использовать запись «int *arr = malloc( sizeof(int) * a );»

ну и как замечание не стоит объявлять переменные в коде реализующем логику это очень очень плохо.
 
int arr[a]размер массива должен быть на момент компиляции известен. Либо потребуется динамическое выделение памяти (начиная с C++11).

Поэтому динамически лучше объявить через контейнер std::vector

#include
#include

int main() {
int inp;
std::cout > inp;
std::vector arr(inp);
return 0;
}
 
Размер статического массива должен быть известен к началу компиляции, поэтому нельзя определить предельный размер массива во время выполнения. Но есть выход. Можно задать буфер, размер которого будет достаточным для тех данных, которые будут использоваться. Например, в системе Windows размер буфера консоли составляет 4 килобайта. Больше вам с клавиатуры за один раз ввести не удастся. Но и этого вполне предостаточно, так как если вводить с клавиатуры однозначные числа, то для типа данных int можно задать предельный размер в 2048 элемента. Вводить такое количество руками и ни разу не ошибиться вам придётся мучительно долго, да и незачем.Определив предельный размер массива, теперь вы можете задать необходимый размер под данные, определив его переменной во время выполнения, при этом запретив создавать массив нулевого размера и размера большего, чем его предельный размер.Так как вводить данные в массив вы можете и далее в программе, то изначально установленного размера на 2048 элементов вам может не хватить. В этом случае вы можете задать предельный размер большего размера, но и здесь не всё так гладко. Размер стека данных под процесс система также ограничивает и в какой-то момент может вам отказать в вашем желании. Поэтому статические массивы нужно использовать в тех редких случаях когда проблема производительности является определяющей. Во всех остальных случаях нужно использовать std::vector #include
using namespace std;
int main() {
system("chcp 1251 > nul");
constexpr size_t buffer = 2048;
int sequence[buffer]{};
size_t length = 0;
while (!length || length > buffer) {
cout > length;
}
cout > sequence;
}
system("pause > nul");
}
 
#include
using namespace std;

int main()
{
setlocale(LC_ALL, "ru");

int size; // Лучше использовать более понятные имена переменных

cout > size;

if(size > 0) { // Проверяем, что размер массива больше нуля
// Динамически выделяем память для массива
int* arr = new int[size];

// Далее можете работать с массивом arr, например, заполнить его или обработать
// ...

// После использования массива не забудьте освободить память
delete[] arr;
} else {
cout
 
Назад
Сверху