12. oktober 2004 - 19:43Der er
14 kommentarer og 1 løsning
Store arrays får programmet til at dø i Windows
Jeg har et problem med at få et program til at køre under win - det dør simpelthen ("Programmet har udført en ulovlig handling og afsluttes").
Et eksempel der gør det er: - - - #include <iostream> using namespace std;
int main(){ cout << "Starting..." << endl;
int a[12][10][100][20]; int b[12][10][100][20]; int c[12][10][100][20];
cout << "Ending..." << endl; return 0; } - - - Hvis jeg fjerner deklarationen af det ene array kører det fint.
Jeg kunne tænke mig at det har noget at gøre med hvor meget plads win vil lade programmet bruge, for det kører fint under Linux, og som sagt under win hvis jeg laver færre arrays. Men hvad kan jeg gøre for at få win til at lade programmet køre og bruge mere plads? Der må da være nogle indstillinger som jeg kan skrue på et eller andet sted...
(som et lille tillægsspørgsmål undrer det mig forresten også lidt at den ikke skriver "Starting..." ud inden den dør...)
Som regel afsætter programmet plads til objekter på stakken når den går ind i funktionen, dvs inden den udfører noget i funktionen, derfor dør den inden den når at udskrive noget.
Man kan bestemme hvor meget plads der skal afsættes til stak med nogle kompilere, hvilken bruger du?
Man "bør" normalt ikke bruge så meget plads på stakken.
Så alternativer, udover at ændre på mulig stakplads for lokale variable kan være enten :
1) Erklære disse variable som globale.
#include <iostream> using namespace std;
int a[12][10][100][20]; int b[12][10][100][20]; int c[12][10][100][20];
int main(){ cout << "Starting..." << endl;
cout << "Ending..." << endl; return 0; }
2) Erklære dem static :
#include <iostream> using namespace std;
int main(){ cout << "Starting..." << endl;
static int a[12][10][100][20]; static int b[12][10][100][20]; static int c[12][10][100][20];
cout << "Ending..." << endl; return 0; }
I begge tilfælde vil rekursive kald til funktionen arbejde på samme datasæt ! Hvis rekursive kald skal arbejde på seperate sæt af variable - er mulighederne:
1) Finde en compiler switch (option) for stakplads. 2) Allokere selve hukommelsen vha. dynamisk allokering (malloc/free eller new/delete).
Nåede ikke at se stormys svar før. Det er helt fint at lave dem statiske i stedet, og det lader også til at køre. Hvordan kan det være at det ikke giver de samme problemer?
Fordi statiske variable bliver allokeret på samme måde som globale variable. Mens lokale variable bliver oprettet hver gang funktionen kaldes ( = på stakken ).
Takker begge to. stormy har ret: bertelbrander svarede på det spørgsmål jeg stillede, mens stormy gav mig det svar jeg havde brug for :). (Og det er jo altid godt når man nu ikke kan finde ud af at stille det rigtige spørgsmål selv...) Så jeg deler pointene, hvis bertelbrander også lige lægger et svar...
Så skidt da :). Jeg er bare træt af at folk lægger svar som kommentarer, så man som spørger ikke selv kan bestemme hvem der skal have pointene uden at skulle ud i en større diskussion for at få folk til at lægge et svar... (du er med andre ord ikke den første jeg har haft "problemer" med... :))
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.