Visual C++ - niezrozumiały problem

0

Ostatnio pisałem programik w visual c++ ( na wstępie powiem, że ten sam błąd trafia się na wersji 2008 i 2005 ), trafił się fragmęt problematycznego kodu, istotę przedstawiam tutaj:

	int zmienna = 4;
	int lol[zmienna];

wcześniej pisałem w c++, ale z użyciem gcc na linuxie. Tam podobne fragmęty nie były problematyczne, tzn. działały. Dopisałem const przed int-em:

const int zmienna = 4;
	int lol[zmienna];

I wszystko poszło bez błędów. Ale wielkość tablicy będzie ustalana w trakcie pracy programu, więc to odpada. Na linuxie nie było takich błędów (niestety tym razem trzeba było użyć windy). Nie mam pojęcia, dlaczego kompilator narzeka na podanie rozmiaru tablicy w zmiennej. Dołączam treść błędów:

1>c:\documents and settings\stah\moje dokumenty\visual studio 2008\projects\test\test\main.cpp(11) : error C2057: expected constant expression
1>c:\documents and settings\stah\moje dokumenty\visual studio 2008\projects\test\test\main.cpp(11) : error C2466: cannot allocate an array of constant size 0
1>c:\documents and settings\stah\moje dokumenty\visual studio 2008\projects\test\test\main.cpp(11) : error C2133: 'tab' : unknown size

Z góry dziękuję za wyjaśnienie.

0

Jesli deklarujesz zmienna lokalnie to rezerwowana jest na stosie. Czyli powinna byc znana w trakcie kompilacji. Jesli uzyjesz do tego zmiennej, a nie stalej to nie bedzie. Uzyj dynamicznej alokacji. To, ze na linuksie dzialalo, nie znaczy, ze jest dobrze.

0

Chodzi o coś takiego:

int* zmienna;
int lol = 3;
zmienna = new int[lol];

Z użyciem wskaźnika? W sumie działa, dzięki...
A poza tym, to wspomniałeś że dotyczy to zmiennych deklarowanych lokalnie, tzn. czy poprawna jest metoda z mojego 1 posta, ale dotycząca zmiennych globalnych/modułowych?

0

Tak, przy czym powinienes po wykorzystaniu ta pamiec zwolnic :)

0
Digitaler napisał(a)

wcześniej pisałem w c++, ale z użyciem gcc na linuxie.

Tak to jest jak się używa zbugowanego gówna, nie kompilatora, które implementuje od cholery swoich rozszerzeń, wśród popularnych kompilatorów zaś ma najgorszą zgodność ze standardem języka. Proponowałbym jak już z GCC korzystasz używać przełącznika '-pedantic'.

0

Ludzie, a od czego wektory?

vector<int> lol(zmienna);
0

Cóż, gcc oferuje bardzo wiele możliwości, których nie oferują inne kompilatory. Chociażby kompilowanie c++ na mikrokontrolery avr. Nie słyszałem, żeby miał jakąś złą sławę, słyszałem o nim wiele pochlebnych opinii. Poza tym każdy kompilator ma jakieś niezgodności ze standardem...

0
Digitaler napisał(a)

Chociażby kompilowanie c++ na mikrokontrolery avr.

Istnieją inne, dedykowane uC kompilatory...

Digitaler napisał(a)

Poza tym każdy kompilator ma jakieś niezgodności ze standardem...

Na pewno Intel, Comeau i bodaj kompilator w C++ Builderze 2010 są w 100% zgodne ze standardem.

0

Nie ma ich wcale tak dużo, niektóre są płatne, a nie znam żadnego, który udostępnia c++ w avr-ach (poza gcc-avr). Co prawda jest to możliwość 'prototypowa', ale z pewnością warta uwagi. Dalej na wielu linuxach gcc domyślnie kompiluje pakiety, a linux jak wiadomo słynie z niezawodności.

0

Hm, jeszcze jedno:

Digitaler napisał(a)

Cóż, gcc oferuje bardzo wiele możliwości, których nie oferują inne kompilatory.

Jakie to unikatowe możliwości posiada gcc? Absurdalne błędy? Generowanie nieprawidłowego kodu/danych?

Digitaler napisał(a)

linux jak wiadomo słynie z niezawodności.

Aha, masz na myśli poważne stacje robocze czy superkomputery z TOP500? Tak się składa, że tam się najczęściej używa zabawek Intela lub specjalistycznych, dedykowanych kompilatorów...

Zresztą dlaczego powstał projekt dostosowania kernela Linuksa pod kompilatory Intela (LinuxDNA)? Wedle testów jądro zyskuje nawet 40% lepszą wydajność w porównaniu do kompilowanego GCC.

0

Powstaje wiele projektów na linuxie, a nawet jeśli powstało nowe, lepsze narzędzie, to nie znaczy że starsze było całkowicie do niczego, jak przez cały czas sugerujesz. Chcę po prostu powiedzieć, że z moich doświadczeń (i wielu innych userów linuxa - np. gentoo w moim przypadku, gdzie właściwie wszystko jest kompilowane ze źródeł z użyciem gcc) praca z gcc jest na całkiem wysokim poziomie ergonomicznie rzecz biorąc. I dziwię się, że słyszę nagle o ekstrymalnie negatywnej opinii o narzędziu, które paradoksalnie nie przysparzało mi wcale wielu błędów... Można rozprawiać o wyższości jednego kompilatora nad drugim, ale bez przesady...

0

OK, spróbuj skompilować to tym wspaniałym kompilatorem:

template < class Pala >
struct GccSsiePale {
     friend int main();
};
int main() { }

// wywali error, że main nie może być szablonem(!)

Generalnie pod paroma nickami to podawałem na tym forum kilkanaście podobnych idiotyzmów...

http://www.comeaucomputing.com/tryitout/ - formularz do testowania kompilatora Comeau, oficjalnej implementacji standardu C++ - przetestuj sobie ten kod.

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