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?


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.