Tworzenie tablic o rozmiarze nieznanym podczas kompilacji
Ostatnio zmodyfikowano 2012-11-14 19:16
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; 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? |
|
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ć. |
|
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 :) |
|
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): cin >> n; int * tab = new int[ n ];
delete[] tab;
Nawiasem mówiąc, zadaniem new jest zarezerwowanie pamięci, a nie utworzenie obiektu, czy zmiennej. |
|
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. |
|
« 1 » |