Avatar billede sqwer Nybegynder
12. oktober 2004 - 19:43 Der 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...)
Avatar billede bertelbrander Novice
12. oktober 2004 - 20:03 #1
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.
Avatar billede stormy Nybegynder
12. oktober 2004 - 20:16 #2
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).
Avatar billede sqwer Nybegynder
12. oktober 2004 - 20:17 #3
mingw (med og uden dev-cpp)
Avatar billede sqwer Nybegynder
12. oktober 2004 - 20:24 #4
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?
Avatar billede stormy Nybegynder
12. oktober 2004 - 20:27 #5
Fordi statiske variable bliver allokeret på samme måde som globale variable. Mens lokale variable bliver oprettet hver gang funktionen kaldes ( = på stakken ).
Avatar billede bertelbrander Novice
12. oktober 2004 - 20:30 #6
Man kan sætte stak størrelse med gcc kompilere med "--stack SIZE", default er 2M, der bør være nok.
Avatar billede stormy Nybegynder
12. oktober 2004 - 20:32 #7
Ikke når der skal allokeres 3 * 960000 bytes :) !
Avatar billede bertelbrander Novice
12. oktober 2004 - 20:34 #8
Nej, men som jeg var inde på før "bør" man ikke bruge mere end 2M stak.
Avatar billede stormy Nybegynder
12. oktober 2004 - 20:46 #9
Ja - og jeg er enig (ihvertfald for det aktuelle problem). Men det lader til at statiske variable er et udmærket alternativ.
Avatar billede stormy Nybegynder
12. oktober 2004 - 21:08 #10
Du bør også smide et svar bertelbrander - din løsning er svaret på det stillede spørgsmål. Hvorimod mit er et brugbart alternativ.
Avatar billede sqwer Nybegynder
12. oktober 2004 - 21:21 #11
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...
Avatar billede bertelbrander Novice
12. oktober 2004 - 21:31 #12
Jeg samler ikke på point.
Avatar billede sqwer Nybegynder
12. oktober 2004 - 22:23 #13
Men når jeg nu så gerne vil give dig dem...? ;)
Avatar billede bertelbrander Novice
12. oktober 2004 - 22:29 #14
Dette er, så vidt jeg kan se, første gang stormy deltager i et spørgsmål på eksperten, så jeg synes at du skal give dem til ham.
Avatar billede sqwer Nybegynder
13. oktober 2004 - 22:50 #15
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... :))
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester