C++ kiakad "nagy" számoktól, mint pl 2000?
Évfolyam zh-ra gyakorlok és belefutottam ebbe a problémába, hogy ha a programot tesztelésnél teleírom olyan számokkal, mint 2-3-4-5 stb, akkor tökéletesen lefut, azonban ha mondjuk valahova 2000-et írok, az már nagy neki és nem fut le a program. Olyan feladatok, ahol meg kell adni, hogy hányféle különböző adat lett megadva. Ha az ezt vizsgáló részt kiszedem a programból, akkor tökéletesen lefut nagy számokkal is. Ami felettébb érdekes, hogy több ilyen feladatot megírtam már, az első ilyennél egyik haverom segítségét kértem, sikerült is megírni egy ilyen feladatot, azonban akármikor máskor megpróbáltam ilyen feladatot megoldani az alapján, ez történik, hogy lefagy. Megírtam "kicsiben" is ezt a programrészt, ugyanúgy lefagy, ha 2000-et írok be. Mi lehet a gond? Ti találkoztatok már ilyennel? Még annyi, hátha segít, hogy Code::Blocks-ot használok, 16.01 és GNU CCC compiler.
Spórolás végett az int main() előtti meg return 0; utáni dolgokat nem másoltam be.
int n;
cerr<<"n= ";
cin>>n;
int tomb[100],hanyfele;
bool vizsgal[100];
for (int i=0;i<n;i++)
{
vizsgal[i]=false;
cerr<<i+1<<". elem= ";
cin>>tomb[i];
}
hanyfele=0;
for (int i=0;i<n;i++)
{
if (vizsgal[tomb[i]-1]==false)
{
vizsgal[tomb[i]-1]=true;
hanyfele++;
}
}
cout<<hanyfele<<endl;
#15
Te olvasod is amit linkelsz? Így kezdődik: "Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++."
#22: a #14-es hozzászólásra válaszoltam ezzel, ugyanis ő azt állította, hogy a C++-ban egyáltalán nincs erre lehetőség. Viszont a (kérdező által is használt) GCC ezt - a C-ben elérhető lehetőséget - megengedi, mint azt te is citáltad.
Sőt a C++14-ben is lehet hasonlót csinálni - runtime-sized array néven:
* [link]
de ha nagyon ragaszkodunk a régebbi C++ szabványokhoz/a nem-GCC-fordítókhoz, a #20-as hozzászólásban van egy példa a tömb méretének megadására.
#23
Amit linkeltél az csak egy javaslat, hogy mi kerüljön be a szabványba, és az jelenleg még nem lett elfogadva, még a C++17 -es szabványba sem került be idáig. A C++ szabvány része nem is volt soha, csak a C szabványban amit a GCC enged C++ kódban is mint kiegészítés, de mivel nem szabvány így nagyon nem javalott a használata.
Normális fordítói flagekkel ki is írja: /main.cpp:27: warning: ISO C++ forbids variable length array ‘arr’ [-Wvla]
int arr[i];
^
"A C++ szabvány része nem is volt soha"
Nem is állítottam ezt, csak hogy a C++-ban a (kérdező által használt!) GCC által támogatva van a VLA, illetve a C++14 szabványtervezet tartalmaz hasonló módszert.
"Normális fordítói flagekkel"
Ami opcionális.
"szerintem nem szép dolog a 'dinamikus' méretű tömböket a stackben tárolni"
Ezzel amúgy részben egyet tudok érteni, amit viszont senki nem hozott fel, és nekem sokkal jobban fáj a kódodban: ha a cout.operator<<() exceptiont dob, akkor kész is a memory leak..
Ha elte bíró, akkor a cerr-t ne javítsd cout-ra,mert ki fog akadni.
Igazuk van a válaszolóknak, hogy az lenne az elegáns, de a bíró csak a cerr-el megy, ahogy scináltad.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!