C++-ban hogyan kell érteni azt, hogy egy tömb elemszáma fordítási időben ismert kell, hogy legyen? Hiszen a felhasználótól is bekérhetjük a tömb méretét, és az csak futási időben lesz ismert.
Kedves Tanár Úr!
Egy vita során merült fel, hogy a C++ szabvány szerint a tömbök méretének fordítási időben ismertnek kell lennie. Akkor viszont hogyan oldjuk meg szabványosan, hogy a felhasználó adhassa meg az értékek elemszámát? Ezen megoldások közül egyik sem szabványos? És ha nem szabványos, attól még használható, vagy nem javasolt?
Esetleg úgy kell eljárni, hogy egy const int "változóban" olyan méretet adunk meg a tömbnek, amit biztosan nem lépünk túl?
int elemszam;
cout << "Kerem adja meg az elemszamot: " << endl;
cin >> elemszam;
double tomb_3[elemszam];
int elemszam;
cout << "Kerem adja meg az elemszamot: " << endl;
cin >> elemszam;
double * tomb_3;
tomb_3 = new double[elemszam];
Eszerint a link szerint egy új szabvány óta az első megoldás is szabványosnak számít. Vagy ez csak a Visual C++ esetén van így?
Válaszát előre is köszönöm!
----
A C++11 ota a lokalis, automatikus (tehat nem statikus) tarolasi osztalyu tombok lehetnek dinamikus meretuek. Ezek a VLA-k (Variadic Length Array).
A g++ es mas forditok eleg regen tamogadtak ezt, de csak a C++11 ota lett szabvanyos. Globalis, es lokalis statikus tombok tovabbra sem lehetnek VLA-k. A TAMOP-os linken megadott definicio egeszen kivalo.
Az On altal megadott ket pelda kozul (ha fuggvenyen belul vagyunk), akkor mindketto szabalyos C++11-ben. Az elso, tehat a VLA a preferalt, mert a masodik potencialis memory leak-kel jarhat (pl. valami miatt elmarad a delete[] es nem szabaditja fel a new[]-val lefoglalt memoriat). A VLA-k, akarcsak a tobbi automatikus tarterulet automatikusan felszabadul, amikor kilep a deklaralo blokkbol (innen a neve). Tovabbi elonye a VLA_nak, hogy a heap muveletek (new, delete) meglehetosen lassuak es koltsegesek a veremben letrehozott VLA tombokhoz kepest.
Sok C++ programozo persze a szabvanyos std::vector-t hasznalja, mert az menet kozben is boviheto, ellentetben a VLA-kkal.
udv
gsd
Egy ilyen compiler-rel néztem egy példát:
g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Akár 11-es, 14-es és 17-es szabvány szerinti fordításnál a -pedantic kapcsoló esetében az alábbi figyelmeztetést kapom (a függvényen belül egy lokális tömböt hoztam létre, melynek mérete fordítási időben nem ismert):
v.cpp: In function ‘void f()’:
v.cpp:7:12: warning: ISO C++ forbids variable length array ‘v’ [-Wvla]
int v[ i ];
Az alábbi linken szintén ezt lehet olvasni:
Továbbra is azt látom, hogy a C 99-es szabványa bevezette, a C++ szabványa viszont nem.
(Az std::array is olyan STL-kompatibilis adatszerkezet, melynek a méretét fordítási időben ismerni kell.)
Pataki Norbert
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!