[C++] Tablica statyczna i rozmiar

Hej.

Chciałbym się dowiedzieć dlaczego rozmiar tablicy statycznej musi być stałą znaną w czasie kompilacji. Pewnie dlatego, że stałe trzeba inicjalizować od razu - a nie dopiero po momencie definicji. No OK, ale kompilator mógłby się zgadzać tez na coś takiego:

int size = 44; //ok od razu inicjalizacja

int array[size];

Bo size jest od razu inicjalizowane (nie zawiera “śmieci”, które czasem może stanowić liczba ujemna). Dlaczego tak robić nie można ?

Bo nie sądze, że rozmiar przechowywany w stałym obiekcie jest poprawny dlatego, że nie można zmienić wartości w tym obiekcie - wszystko można przeciez za pomocą const_cast :wink:

  1. W niektórych kompilatorach, np gcc i mingw taki kod sie skompiluje i będzie działać, ale to poza standardami.

  2. Sugerujesz że taki jak podałeś kod powinien przyjmować size jako stałą? No dobrze a taki:

int size = 44,x;

int array;

a taki:

int size = 44;

int x;

int array;

a taki:

int size = 44;

int x=fun();

int array;

a taki:

int size = 44;

int x=fun(&size);

int array;

kompilator musiał by przeprowadzać naprawdę skomplikowaną analizę, właściwie i bez twoich unowocześnień się nie nudzi.

  1. Nie wszystko zmienisz przez const_cast.
  1. Nie rozumiem - ja mówię że nie musi właśnie przyjmować. Mógłbyś wytłumaczyć słownie o co chodzi w Twoich przykładach ?

  2. Chyba nie zmienię tylko stałych dosłownych (+ wartości nazw z listy wyliczeniowej typu wyliczeniowego enum) :stuck_out_tongue:

  1. Zastanów się jak daleko (w twojej propozycji zmian C/C++) może być deklaracja zmiennej z inicjalizacją od deklaracji tablicy o rozmiarze zapisanym w tej zmiennej, i jakie operacje mogą być pomiędzy nimi.

    #include using namespace std;

No ale co z tego :stuck_out_tongue: (rozumiem, że chodzi Ci o to, że długo pracujemy na tej zmiennej i kompilator musi prześledzić całą pracę na tej zmiennej, żeby zainijalizować jej wartością rozmiar tablicy) ? Przecież przy linijce:

int array[size];

Kompilator dowiaduje się o adresie size (pewnie robi u siebie &size) i wyciąga wartość z komórki o takim adresie - i tworzy tablicę o takim rozmiarze. To samo mógłby robić jeżeli size nie byłoby stałą - jedno sięgnięcie pod adres i tyle…

:smiley:

Do jakiego z powyższych rodzajów zaliczasz:

f(“ala ma kota”);

?

Do stałych dosłownych będących C-stringami :slight_smile: A nie jest tak :?: