Array [n] vs Array [10] - Inicjalizacja tablicy ze zmienną a liczbą rzeczywistą

90

Mam następujący problem z moim kodem:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Zwraca następujący błąd:

error: variable-sized object 'tenorData' may not be initialized

Natomiast używanie double tenorData[10]działa.

Czy ktoś wie, dlaczego?

msmf14
źródło
4
Pomogłoby dać język. W C ++ tablice w tej postaci muszą mieć stałą wielkość w czasie kompilacji.
OrangeAlmondSoap
C ++, używając Codeblocks z kompilatorem mingw32-g ++!
msmf14
Dzięki, Justin i @AndrewVarnerin, to rozwiązało problem! dodane const przed int: const int n = 10; Rozwiązany!
msmf14

Odpowiedzi:

188

W C ++ tablice o zmiennej długości nie są dozwolone. G ++ pozwala na to jako „rozszerzenie” (ponieważ C na to pozwala), więc w G ++ (bez konieczności -pedanticprzestrzegania standardu C ++) możesz:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

Jeśli chcesz mieć „tablicę o zmiennej długości” (w C ++ lepiej nazywaną „tablicą o zmiennej długości”, ponieważ tablice o zmiennej długości są niedozwolone), musisz samodzielnie przydzielić pamięć dynamicznie:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

Lub, jeszcze lepiej, użyj standardowego pojemnika:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

Jeśli nadal chcesz mieć odpowiednią tablicę, możesz użyć stałej , a nie zmiennej , podczas jej tworzenia:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

Podobnie, jeśli chcesz uzyskać rozmiar z funkcji w C ++ 11, możesz użyć constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression
Łodygi kukurydzy
źródło
1
Dziękuję, to kolejne dobre rozwiązanie. To, czego naprawdę potrzebuję na końcu, to wektor, a nie tablica!
msmf14
1
@ msmf14: Tak, standardowe kontenery vectorsą niesamowicie przydatne.
Cornstalks
Czy rozwiązanie wektorowe inicjalizuje każdy element, gdy wywołujesz "std :: vector <[jakaś klasa]> a (n);"?
Justin
3
Jeśli nie alokujesz dużo (jeśli jest mały w porównaniu z rozmiarem stosu), wolałbym używać pamięci stosu z przydzielaniem (3) i umieszczaniem new. W ten sposób nie musisz martwić się o zwolnienie pamięci, a alokacja pamięci jest znacznie szybsza.
holgac
2
+1 za wspomnienie, że g ++ na to pozwala. Ponieważ nie zauważyłem tego błędu i to wyjaśnia różnicę.
gebbissimo