Сортировка

Не работает. Почему? error C2057: expected constant expression error C2466: cannot allocate an array of constant size 0 error C2133: 'a' : unknown size
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
 int n = 12;
 int a[n];
 ifstream f("data.txt");
 for (int i = 0; i < n; ++i)
 {
 f >> a[i];
 cout << a[i] << endl;
 }
 // sorting
 for (int i = n - 1; i >= 1; --i)
 for (int j = 0; j < i; ++j)
 {
 if (a[j] > a[j + 1])
 {
	int foo = a[j];
	a[j] = a[j + 1];
	a[j + 1] = foo;
 }
 }
 cout << endl;
 for (int i = 0; i < n; ++i)
 cout << a[i] << endl;
}
9 ответов

int n = 12;
 int a[n];
В статической памяти так выделять нельзя. Нужно написать
const int n = 12;
 int a[n];
или вообще
#define n 12;
 int a[n];


В C++ лучше, конечно же, первое (с const).


некоторые компиляторы такое допускают, к примеру, g++


Дело не в компиляторе а в языке, эта возможность добавлена в стандарт C99, просто Visual Studio C99 не поддерживает, отсюда и мнение, что
некоторые компиляторы такое допускают, к примеру, g++
6.7.5.2 Array declarators C99 adds a new array type called a variable length array type. The inability to declare arrays whose size is known only at execution time was often cited as a primary deterrent to using C as 20 a numerical computing language. Adoption of some standard notion of execution time arrays was considered crucial for C’s acceptance in the numerical computing world. The number of elements specified in the declaration of a variable length array type is a runtime expression. Before C99, this size expression was required to be an integer constant expression.


... или вообще
#define n 12;
 int a[n];
или вообще STL контейнер
#include <iostream>
#include <iterator>
#include <fstream>
#include <algorithm>
#include <set>

int main()
{
	std::ifstream file("data.txt");
	std::set<int> data((std::istream_iterator<int>(file)), (std::istream_iterator<int>()));
	std::copy(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, "\n"));
}


Дело не в компиляторе а в языке, эта возможность добавлена в стандарт C99, просто Visual Studio C99 не поддерживает, отсюда и мнение, что
Отсюда не мнение, это был шутка и юмор Ибо шел 2010 год


Отсюда не мнение, это был шутка и юмор Ибо шел 2010 год
просто прозвучало как обвинение gcc в несоответствии, решил внести ясность


просто прозвучало как обвинение gcc в несоответствии, решил внести ясность
Пусть немного оффтопика: но таки gcc во многом уже держит C++0x( а нынешний стандарт наверное весь, кстати, совсем недавно таки выкинули iostream.h и иже с ним ), пусть он не самый быстрый компилятор( как и по быстроте кода, так и по скорости ), но это таки многое значит и ему бесспорный плюс.


Пусть немного оффтопика: но таки gcc во многом уже держит C++0x( а нынешний стандарт наверное весь.
ну откровенно говоря gcc не святой у него тоже не мало несоответствий (правда, не так много как в VC, но все же), а уж весь стандарт он точно не поддерживает, как минимум экспорт шаблонов там не поддерживается. Идеальных компиляторов не бывает :P очень хвалят comeau в этом вопросе, но посмотреть на него мне пока не посчастливилось. А компилятор gcc и вправду неплохой.