Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie tablic o rozmiarze nieznanym podczas kompilacji

Ostatnio zmodyfikowano 2012-11-14 19:16
Autor Wiadomość
kaki2308
Temat założony przez niniejszego użytkownika
Tworzenie tablic o rozmiarze nieznanym podczas kompilacji
» 2012-11-14 16:22:40
Korzystając z VS 2012 i kompilując coś takiego;

C/C++
int n;
cin >> n;
int tab[ n ];

Otrzymuje expression must have a constant value. Ok to się zgadza z tym czego się uczyłem o C++, że nie można tak deklarować tablic, trzeba przez najlepiej new.
Ale dlaczego taki sam kod kompilowany w CodeBlocks 10.5 z GNU GCC 4.4.1 się kompiluje?
Tak samo jest w Dev C++, ten kod się kompiluje.
Natomiast np w Visual Studio 2005 się nie kompiluje.

Wszędzie wybieram projekt Console App i język C++.

Ktoś może mi to wytłumaczyć jak to w końcu jest?

P-69243
wojownik266
» 2012-11-14 16:27:19
Kod prawdopodobnie dlatego kompiluje się pod devem i codeblockiem, ponieważ codeblock i devcpp są nakładkami na jeden i ten sam kompilator czyli GCC(MinGw). Tak mi się wydaje ale wiem ze mogę się mylić.
P-69244
m4tx
» 2012-11-14 17:10:53
Nie każdy kompilator w takim samym stopniu trzyma się standardu C++ - po prostu. Code::Blocks i Dev-Cpp korzystają z tego samego kompilatora (Dev-Cpp z jego starszej wersji, o czym się niestety już niejednokrotnie, boleśnie przekonałem...) GCC (lub - w przypadku Windowsa - MinGW), a Visual ma własny, opracowany przez Microsoft kompilator.

Po prostu nie używaj tego ficzera i tyle - tym bardziej, że on i tak może nie działać. Używaj dynamicznej alokacji pamięci i będzie ok :)
P-69247
bingo009
» 2012-11-14 18:19:02
To co pokazałeś jest raczej z punktu widzenia standardu C++ nie prawidłowe. Kompilator rezerwuje pamięć dla takiej tablicy w trakcie kompilacji. Lepiej zrób to w ten sposób(dynamiczna tablica):
C/C++
cin >> n;
int * tab = new int[ n ];

//Gdzies na koncu w kodzie
delete[] tab;

Nawiasem mówiąc, zadaniem new jest zarezerwowanie pamięci, a nie utworzenie obiektu, czy zmiennej.
P-69253
Mrovqa
» 2012-11-14 19:16:48
Nawiasem mówiąc, zadaniem new jest zarezerwowanie pamięci, a nie utworzenie obiektu, czy zmiennej.
Mylisz się. Porównaj sobie new i malloc. malloc tylko rezerwuje pamięć - obiekt musisz utworzyć sam, new natomiast wywołuje konstruktor obiektu przy okazji = tworzy obiekt.
P-69263
« 1 »
  Strona 1 z 1