string tomb [350000][6];
hogy lehet megoldani, hogy ne dobjon szegmenshibát? akár még nagyobb számra? köszi
- 2004 megtekintés
Hozzászólások
Miert akarsz ilyen hulyeseget csinalni?
Amugy globalis valtozokent nekem mukodott, csak lokaliskent nem. Ami azt jelenti, hogy a stack-en nem szeretne ekkora tombot foglalni - ami teljesseggel ertheto. Szoval az adatszegmensben elfer, de teheted heap-re is.
Amugy mire jo ez az egesz? Ha tenyleg erre van szukseged, akkor ott valamit nagyon elszurtal. Ha nem kell fixen ekkora tomb, akkor ott vannak a C++-os vector, map, hashed_map, meg hasonlo template-ek. Ha adatbazisra van szukseged, akkor szinten rossz uton jarsz.
Ha biztos vagy benne, hogy ez kell neked, akkor add meg a forditonak valahogy, hogy nagyobb stack-re van szukseged. Bar ezt ketlem.
--
"ne támogasd az erdők kiírtását mozijeggyel, töltsd le a netről!" - killllll, asva.info
- A hozzászóláshoz be kell jelentkezni
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector< vector<string> > tomb(350000, vector<string>(6,"xxx"));
//Ciklussal
int i, j;
for(i=0; i < 350000; ++i)
{
for(j=0; j < 6; ++j)
{
cout << tomb[i][j] << endl;
}
}
//Iteratorokkal (ha modositod a tombelemeket, akkor a "const_"
//nem kell)
vector< vector<string> >::const_iterator iter_i; //kulso
vector<string>::const_iterator iter_j; //belso
for(iter_i = tomb.begin(); iter_i != tomb.end(); iter_i++)
{
for(iter_j = (*iter_i).begin(); iter_j != (*iter_i).end(); iter_j++)
{
cout << *iter_j << endl;
}
}
return 0;
}
Előnye, hogy dinamikusan méretezhető és csomó STL függvény van hozzá,
ami megkönnyítheti az ember életét.
--
A gyors gondolat többet ér, mint a gyors mozdulat.
- A hozzászóláshoz be kell jelentkezni
new es delete a barataid :)
- A hozzászóláshoz be kell jelentkezni
Ahogy az elottem szolok mar leirtak, ez egy nagyon rossz programozasi megkozelites, hogy ilyen nagy meretu tombot a stack-re pakolsz. En is inkabb a heap hasznalatat javaslom dinamikus memoriafoglalassal vagy egy statikus valtozo bevezetesevel.
Ha mindenkeppen a jelenlegi megoldast akarod tovabbvinni, akkor a gcc linkerenek a --stack kapcsolojaval beallithatod, hogy mekkora stack-et hasznaljon a program.
- A hozzászóláshoz be kell jelentkezni
Mi lesz, ez szótárprogram? Én dinamikus helyfoglalással hoznék létre egy ekkora tömböt, kétlem hogy mindíg full tele lenne 350000 db stringgel.
- A hozzászóláshoz be kell jelentkezni
Sőt, 350000 * 6 = 2100000 stringgel.
- A hozzászóláshoz be kell jelentkezni
Csatlakoznek az elottem szolokhoz, erre nem valo a stack (lokalis valtozo fvben). Megoldas a heap (new/delete) ill. az adatszegmens (globalis, statikus valtozo).
Alternativa meg a hianyos matrix megkozelites, ahol minden oszlopot es sort egy lancolt listaval abrazolsz igy a nem letezo elemekre nem kell referenciat eletben tartani. (350000*6 elem helyett 350000+6+n referenciat tarolsz n letezo elem eseten).
--
The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni
köszi, végülis dinamikus cucc lett benne
- A hozzászóláshoz be kell jelentkezni