Форум программистов, компьютерный форум CyberForum.ru

динамические массивы в wxDev-C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
paramount2u
Сообщений: n/a
23.02.2010, 16:40     динамические массивы в wxDev-C++ #1
у меня такая проблема ... код
C++
1
2
3
4
5
6
7
8
    int n;
    cout<<"n=";
    cin>>n;
    char c[n];
    for (int i=0; i < n; i++){
        c[i]=i+48;
        cout<<c[i];
    }
в wxDev-C++ ( в GCC ) работает а вроде не должно ...
а в VS 2008 не компилируеться даже ...
ПОЧЕМУ ?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
23.02.2010, 16:45     динамические массивы в wxDev-C++ #2
Цитата Сообщение от paramount2u Посмотреть сообщение
а в VS 2008 не компилируеться даже ...
В VS размер объявляемого массива должен быть константой, а иначе нужно будет выделять память динамически
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
23.02.2010, 17:15     динамические массивы в wxDev-C++ #3
C++
1
2
3
4
5
6
7
8
    int n;
    cout<<"n=";
    cin>>n;
    char c[n];
    for (int i=0; i < n; i++){
        c[i]=i+48;
        cout<<c[i];
    }
заменить на
C++
1
2
3
4
5
6
7
8
    int n;
    cout<<"n=";
    cin>>n;
    char c[] = new char[n];
    for (int i=0; i < n; i++){
        c[i]=i+48;
        cout<<c[i];
    }
странно как GCC такое пропускает, у меня wxDev-C++ и он меня не раз на этом подстрекал..
paramount2u
Сообщений: n/a
23.02.2010, 23:15     динамические массивы в wxDev-C++ #4
Во всех книгах ( которые читал ) пишут что размер объявляемого массива должен быть константой ( согласен ! память для массивов резервируется во время компиляции а не выполнения программы) и для создания динамических массивов используют специальные механизмы (массив создается в куче ) при помощи операторов new и delete .
внимание вопрос : а в GCC почему вообще нам нужны операторы new и delete или может чего то мы не понимаем ?

Добавлено через 10 минут
Цитата Сообщение от outoftime Посмотреть сообщение
char c[] = new char[n];
Между прочим так работать не будет нигде , надо писать
C++
1
char * c = new char[n];
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.02.2010, 23:33     динамические массивы в wxDev-C++ #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от paramount2u Посмотреть сообщение
Во всех книгах ( которые читал ) пишут что размер объявляемого массива должен быть константой
Вот кусок из "Полный справочник С" Шилдта:
Массивы переменной длины

В С89 размерности массивов необходимо объявлять при помощи выражений из целых констант, причем размер массива фиксируется во время компиляции. В силу определенных обстоятельств, в С99 это правило было изменено. В С99 можно объявить массив, размерности которого определяются любыми допустимыми целыми выражениями, в том числе и такими, значения которых становятся известны только во время выполнения. Такой массив называется массивом переменной длины (variable-length array, VLA). Однако такими массивами могут быть только локальные массивы (то есть те, у которых область видимости — прототип или блок). Вот пример массива переменной длины:

void f(int diml, int dim2)
{
int matrix[diml][dim2]; /* двумерный массив переменной длины */
/* ... */
}

В данном случае размер matrix определяется значениями, передаваемыми функции f() через переменные dim1 и dim2. Таким образом, в результате каждого вызова f() может получиться массив matrix с самыми разными измерениями.

Важно понять, что массивы переменной длины за время "своей жизни" не меняют своих размеров. (Иными словами, они не являются динамическими.) На самом деле массив переменной длины создается с другим размером каждый раз, когда встречается его объявление.

Можно указать массив переменной длины неуказанного размера, используя в качестве размера звездочку, *.

Появление массивов переменной длины вызвало небольшое изменение в операторе sizeof. Вообще говоря, sizeof — это оператор, который вычисляется во время компиляции. То есть во время компиляции он обычно превращается в целую константу, значение которой равно размеру типа или объекта. Однако если sizeof применяется к массиву переменной длины, то свое значение он получает только во время выполнения. Это изменение было необходимо потому, что размер массива переменной длины нельзя узнать до времени выполнения.

Одной из главных причин появления массивов переменной длины является желание упростить программирование численных методов. Конечно, это средство применяется довольно широко. Но помните — массивы переменной длины не поддерживаются Стандартом С89 (и в языке C++).
Учитывая последнее предложение - наверное gcc это, как конструкцию ANSI C 99 воспринимает, потому и не ругается...
Yandex
Объявления
23.02.2010, 23:33     динамические массивы в wxDev-C++
Ответ Создать тему
Опции темы

Текущее время: 12:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru