Локальные массивы переменной длины

Тема в разделе "MS Visual C++", создана пользователем DiRob, 26 май 2008.

Статус темы:
Закрыта.
  1. DiRob

    DiRob Гость

    Стандартом С99 предусмотрены локальные массивы переменной длины.

    void func(const int a)
    {
    double Arr[a];
    ...
    }

    Чем я активно пользовался.
    Но тут мне потребовалось написать кое какую ерунду под винды.
    Я использовал Microsoft Visual Studio .NET 2003 и понял, что ничего не понял.
    Конструкция описанная выше забраковывалась со следующим основанием:

    ..\VarArr.cpp(18): error C2057: expected constant expression
    ..\VarArr.cpp(18): error C2466: cannot allocate an array of constant size 0
    ..\VarArr.cpp(18): error C2133: 'Arr' : unknown size

    MSDN по этому поводу логичен и лаконичен, из чего я могу предположить, что такое не прокатит. Сама проблемма решается простым использованием динамического выделения, дело не в этом. Просто как то странно это...

    Вопрос:
    1. Почему???
    2. Какому стандарту принадлежит данный компилятор???

    P.S. Пробовал Visual Studio 2005, результат тот же... Может там чего настроить надо?
     
  2. Dimmuborgir

    Dimmuborgir Гость

    сделайте вызов этой функции. к примеру
    Код (Text):
    func(4);
    .
     
  3. DiRob

    DiRob Гость

    VarArr.cpp
    ------------------------------------------------
    #include "stdio.h"

    extern void func(const int a);

    int main(void)
    {
    func(20);
    return 0;
    }

    void func(const int a)
    {
    int Arr[a];
    }
    ------------------------------------------------

    При компиляции такого файлика, получаем:
    ..\VarArr.cpp(14): error C2057: expected constant expression
    ..\VarArr.cpp(14): error C2466: cannot allocate an array of constant size 0
    ..\VarArr.cpp(14): error C2133: 'Arr' : unknown size
     
  4. Dimmuborgir

    Dimmuborgir Гость

    "extern" - к чему бы это?)
     
  5. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    welcome to the real worl. так же как не все йогурты одинаково полезны, не все компилаторы одинаково хорошо держат стандарт. и спользование слабо переносимых фенечек считается плохим тоном. используй std::auto_prt(new ...) или еще лучше сразу std::vector
     
  6. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    можно пробовать bounded_array из буста, он на стеке выделяет память
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей