Объявление массива внутри функции путем передачи его длины - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу иметь функцию, которая принимает положительное целое число, затем объявляет массив, инициализирует его и печатает.Следующий код работает с компилятором GCC, но он не работает с компилятором MSVC.Я получаю ошибку

Ошибка (активная) E0028 выражение должно иметь постоянное значение.Значение параметра «Длина» (объявленное в строке 5) не может быть использовано как константа

  1. Что такое хороший способ сделать это с компилятором MSVC?и
  2. Есть ли веская причина для такой разницы?

Мой код:

#include <iostream>

using namespace std;

void Print(const int Length)
{
    int Array[Length];
    for (int i = 0; i <= Length - 1; i++)
    {
        Array[i] = i;
        cout << Array[i];
    }
}

int main()
{
    const int L = 5;
    Print(L);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Если вы действительно хотите динамически распределенный массив фиксированного размера, используйте std :: unique_ptr вместо std :: vector.

#include <iostream>
#include <memory>

void Print(const int Length){
    std::unique_ptr<int[]> Array = std::make_unique<int[]>(Length);
    for (int i = 0; i < Length; ++i){
        Array[i] = i;
        std::cout << Array[i];
    }
    Array.reset();
}
0 голосов
/ 24 апреля 2019

Как было отмечено в комментариях, вам обязательно следует использовать std::vector<int>.

Если вы хотите, чтобы массив жил только внутри вашей функции Print, вы можете объявить динамический массив в стеке.используя new.Однако помните об использовании памяти, поскольку Print можно вызывать с большим числом, и вы получите переполнение стека (опять же, используйте вектор, чтобы избежать этого).

#include <iostream>

using namespace std;

void Print(const int Length)
{
    int *Array = new int[Length];
    for (int i = 0; i < Length; i++)
    {
        Array[i] = i;
        cout << Array[i];
    }
    delete [] Array;
}

int main()
{
    const int L = 5;
    Print(L);
    return 0;
}

РЕДАКТИРОВАТЬ: Вотвекторное правильное решение:

#include <iostream>
#include <vector>

using namespace std;

void Print(const int Length)
{
    vector<int> Array;
    Array.resize(Length);
    for (int i = 0; i < Length; i++)
    {
        Array[i] = i;
        cout << Array[i];
    }
}

int main()
{
    const int L = 5;
    Print(L);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...