[ Durst @ 22.07.2003. 02:27 ] @
Pozdrav narode,

Imam jedno pitanje:
Program koji je ukljucivao definisanje array-a preko string funkcije size() nisam uspeo da kompajliram pod borlandom 5.5 i Visual C++ 6.0, ali je zato perfektno radio sa gcc i MinGW.

Pa, ko odstupa od ISO C++ standarda u ovom pitanju i koliko je to rasprostranjeno po ostalim delovima kompajlera koji su prisutni. Hocu reci da li postoje vece razlike u razlicitim kompajlerima ili je sve to zanemarljivo.

[ Dragi Tata @ 22.07.2003. 05:15 ] @
Možeš li da tačno navedeš kod koji je pravio probleme? U principu, VC 6.0 nije preterano u skladu sa standardom (što i nije čudno s obzirom da je objavljen pre standarda), ali nikad se ne zna.
[ leka @ 22.07.2003. 10:45 ] @
Da, bilo bi lepo ako kritikujes da to obrazlozis sa primerom, pa da vidimo da li gresis ili ne, ovako sve ostaje samo na tvojim (za sada praznim) recima.
[ tvucko @ 22.07.2003. 13:40 ] @
Posalji kod pa cemo da vidimo.
[ Durst @ 22.07.2003. 18:29 ] @
Nije mi bila namera da kritikujem ni VC ni Borland ni GCC ni MinGW. Tek pocinjem da ucim C/C++ i ne treba mi nikakav flame vec konkretno koji od ova 4 kompajlera je najpriblizniji standardu, da bih znao koji od njih da koristim.

Kod izgleda ovako otprilike:

Code:


#include <iostream>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
     string line = string (argv[1]);
     int l [line.size()];

     return 0;
}



Molim vas ako nesto ovde nije dobro ispravite me, jer sam manje vise radio po Eckelovoj knjizi. Ako vi niste naisli na ovako nesto i ako je ovaj kod tacan da li je moguce da su kod mene nekako osakaceni kompajleri?

Ponavljam ovo nije kritika vec pitanje koji od ova 4 kompjalera najpribliznije odgovara standardu, da bih taj koristio (ne vredi da ucim po necemu sto nije tacno, zar ne?).

PS:
Dao sam samo segment koda jer je ostatak manje vise nebitan (Borland i VC mi gresku prijavljuju kod int l [line.size()], dok GCC i MinGW prolaze).
[ Dragi Tata @ 22.07.2003. 18:37 ] @
Ova linija

int l [line.size()];

Nije ispravna po C++ standardu. Dužina ovako definisanog niza mora biti poznata u vreme kompajliranja - dakle konstanta.

Međutim, po C99 standardu (koji je C, a ne C++ standard), ovako nešto je dozvoljeno i verovatno zato prolazi sa gcc-om (uzgred, nisi napisao koja verzija). Međutim, pošto je tvoj program očigledno C++ a ne C, definitivno bi kompajler trebalo da prijavi grešku. No, sad ću da probam da kompajliram sa gcc-om, pa da vidim šta se zaista dešava.

[Ovu poruku je menjao Dragi Tata dana 22.07.2003. u 09:56 GMT]
[ Dragi Tata @ 22.07.2003. 18:45 ] @
Hmmmmm...

Code:

E:\arraytest>g++ main.cpp -o array.exe

E:\arraytest>dir
 Volume in drive E is 19gb
 Volume Serial Number is DC54-815F

 Directory of E:\arraytest

07/22/2003  08:26a      <DIR>          .
07/22/2003  08:26a      <DIR>          ..
07/22/2003  08:26a             449,085 array.exe
07/22/2003  08:24a                 189 main.cpp
07/22/2003  08:22a                   0 main.cpp~
               3 File(s)        449,274 bytes
               2 Dir(s)  11,420,049,408 bytes free

E:\arraytest>array.exe

abnormal program termination

E:\arraytest>g++ -v
Reading specs from C:/MinGW/bin/../lib/gcc-lib/mingw32/3.2/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
-languages=f77,c++,objc,ada --disable-win32-registry --disable-shared
Thread model: win32
gcc version 3.2 (mingw special 20020817-1)

E:\arraytest>


Leko?
[ Dragi Tata @ 22.07.2003. 18:55 ] @
Ako sam dobro ukapirao, to je bag u gcc-u:

http://gcc.gnu.org/ml/gcc/2002-09/msg00579.html
[ filmil @ 22.07.2003. 19:22 ] @

Na gcc 3.2.2, linux kompajliranje prolazi i to se slaže sa Tatinom primedbom.

Samo mi nije jasno šta se dešava kada se program pokrene bez argumenata pa je line.size()==0? Inače to proizvodi abnormal program termination, odn. Aborted poruku, a ne mešanje standarda.

Druga stvar koja je možda bitna jeste da metod size() vraća veličinu strukture koja pamti string, a da se dužina stringa dobija sa length()!

f
[ Durst @ 22.07.2003. 19:52 ] @
OK znaci int l [line.size()] je ilegalno i ne bi trebalo da prodje ni kod jednog.

Puno hvala, ljudi!

PS:
Kod je bio za vezbu, pa nisam hteo da se petljam sa uslovima, i zato nisam pokrio situaciju kada je bez argumenata.

PPS:
Gde moze da se nadje neka referenca sa tim standardom da vise ne moram da razbijam glavu o tome sto ovo radi pod gcc-om, a ne pod borlandom i obrnuto, vec da pogledam tamo oko ovih i slicnih propusta.
[ Dragi Tata @ 22.07.2003. 20:08 ] @
Inače, da odgovorim na tvoje pitanje o kompajlerima i standardu. Koliko znam, postoji samo jedan kompajler koji je 100% u skladu sa standardom, a to je Comeau 4.3.0. Međutim, moj je savet da se držiš dva kompajlera, a to su Visual C++ 7.1 (besplatna verzija kompajlera je uključena u .NET SDK 1.1) i gcc (mingw) od verzije 3 pa naviše (ne mogu da verujem da nekom preporučujem GNU software, mora da sam ostario :) ). Oba su dosta dobro usklađena sa standardom a koriste se mnogo više nego Comeau.
[ dust @ 23.07.2003. 03:14 ] @
Cini mi se da je ovo gnu ekstenzija, mislim da je radilo i sa starim verzijama.

Trebalo bi da postoji opcija koja zahteva iso kompatibilnost koda (ne secam se tacno koja je)
pogledaj info gcc

pozdrav,
Dule