Kwestie techniczne definiowania tablicy/switch'a

0

Wiemy, ze takie kody:

int a;
cin>>a;
int T[a];
int a;
cin>>a;
switch(a)
{
   ...
}

są niepoprawne, bo

  1. kompilator musi znać rozmiar tablicy już w czasie kompilacji
  2. switch jest używany tylko do const-zmiennych
    Jednak coś takiego sie kompiluje i działa bez zarzutu. Dlaczego zatem używanie tego nie jest poprawne? Gdzie może ujawnić sie błąd, o ile kiedyś sie ujawni?
0
  1. O.o Na czym to się skompilowało?
    Kompilator musi znać rozmiar tablicy, żeby wiedzieć ile pamięci zaalokować. Dynamiczna alokacja w C++ jest niedostępna z poziomu kompilacji. Teoretycznie jest to możliwe, ale w praktyce niedostępne (zmienne są alokowane na stosie - miłej lektury ;) ).

  2. Takie coś jest jak najbardziej prawidłowe. Gdyby nie można było wybierać dynamicznej zmiennej switch nie miałby sensu. Nie można natomiast skakać do dynamicznej wartości:

int a, n;
cin>>a>>n;
switch(a) //Poprawnie
{
case 1: /**/ //Tutaj musi być stała - poprawnie
case n: /**/ //Tutaj musi być stała - błąd
}
0

Fakt, z tym switchem pomyliłem. Jeśli chodzi o tablice, to takie coś kompiluje sie wszedzie. Na gcc, visual, mingw. Z tym miałem styczność. Wiem, w jaki spsób alokowane są zmienne jak i tablice, jednak ciekawi mnie, dlaczego to się kompiluje i działa mimo to, że jest "niby źle".

0

No ja tego skompilować nie mogłem (VS2010).

0

Z jakiego IDE korzystasz?

0

http://ideone.com/cMcSRj

Dynamicznie alokowana tablica zwróci rozmiar 4 (zwykły wskaźnik). Wnioskuję zatem, że ideone traktuje standardowe wejście jako stałe przekazywane do programu przed kompilacją dzieki czemu akurat w tym wypadku to zadziała. Normalny kompilator zwróci błąd przy próbie zrobienia czegoś takiego.

0
Ola Nordmann napisał(a):

http://ideone.com/cMcSRj

Dynamicznie alokowana tablica zwróci rozmiar 4 (zwykły wskaźnik). Wnioskuję zatem, że ideone traktuje standardowe wejście jako stałe przekazywane do programu przed kompilacją dzieki czemu akurat w tym wypadku to zadziała. Normalny kompilator zwróci błąd przy próbie zrobienia czegoś takiego.

Nie do końca się zgodzę. w VS2013 od razu mi błąd wyskoczył, ale pod Dev v5.5 i Code::Block kompilneło się.

0

http://ideone.com/A0cOXb

Na ideone to działa nawet na stricte C99 ...

0

U mnie też działa z "mnożnikiem" 4 przy int, oraz 8 przy long int. Tak wiec to jakiś rodzaj dynamicznej tablicy.

3

Taki sposób tworzenia tablicy jest całkowicie poprawny w C (od C99) oraz będzie poprawny w C++14. Nazywa się to Variable-length array - VLA. GCC dopuszcza VLA w C++ jako rozszerzenie.

1

Yep, VLA jest legalne w najnowszych standardach, ale w zasadzie nie powinno się tego używać (alokacja na stosie brzmi ryzykownie - więcej: http://gynvael.coldwind.pl/?id=300).

Sizeof dla VLA jest wyrażeniem obliczanym w czasie wykonania programu btw.

1 użytkowników online, w tym zalogowanych: 0, gości: 1