Newsgroup: it.comp.programmare.win32
Titolo: Array con 100.000 elementi : come li istanzio ?

Salve a tutti,
dovrei scrivere un array che contiene 983 mila elementi circa !
Quando tento di generare l'array , mi va in crash appena eseguo il .exe
Perchč ?
Come rimediare ?
max

 Quando tento di generare l'array , mi va in crash appena eseguo il .exe
Ehm... in che linguaggio? C? C++? VB? C#?
E poi "elementi" non č molto preciso come descrittore di quello che
metti nell'array... sono byte o oggetti piů "grossi"?
Comunque a occhio e croce stai allocando sullo stack e, semplicemente,
non ci stai.
Prova a postare il pezzo di codice che fa l'allocazione.
-- 
Gerolamo

 Prova a postare il pezzo di codice che fa l'allocazione.
int a[983000];
max



prova con una malloc, qualcosa tipo:
int *a;
a=(int*)malloc(983000);
spero di non consigliarti male... cmq dovrebbe essere corretto
ciao
Luca

 a=(int*)malloc(983000 * sizeof(int));
if (a == NULL)
 // no buono.
Cmq non dovresti avere problemi. Sono meno di 4mb di roba.... Robetta
insomma.
Puoi anche provare ad aumentare la dimensione dello stack (č un'opzione del
linker). Se lavori in multithread okkio che lo stack di base dei thread č
molto piccolo (1mb)
--- bye

 
ops!
chissà perchè ero convinto fossero byte...

> chissà perchè ero convinto fossero byte...
ok , grazie a tutti .
Ho una domanda ancora :
a quanto ho capito non posso allocare più di una certa quantità di memoria .
In java lo fai in automatico , ecco il casino .
- L'allocazione è riferita per singola variabile o per la somma di tutte le
variabili ?
Cioè ,
se alloco un array di quelle dimensioni : ho un errore.
Se invece la somma di tutte le variabili che uso nel mio programma ,
è di 10 mega , avro' problemi di allocazione ?
non so se mi sono spiegato.
max

Lo stack è in comune per tutto il programma. Che tu lo allochi a pezzettini
o in monoblocco non cambia niente. Se ti serve più stack, dì al linker che
ti serve più stack, e lui te lo darà.
--- bye

> ti serve più stack, e lui te lo darà.
scusa :
ma io ho appena "catturato" lo schermo del mio PC .
Saranno almeno 8 mega di memoria ,
contro i 4 a cui volevo accedere prima .
Come è possibile che funzioni ?
Forse quelle GDI di windows utilizzano un meccanismo tutto loro per
"mettere" la memoria
da quelche altra parte ?
max

 ma io ho appena "catturato" lo schermo del mio PC .
cioe' printscreen e poi incolla e poi salva file?
...ma che c'entra quello con quanta memoria occupa un programma??
-- 
Kali

 ...ma che c'entra quello con quanta memoria occupa un programma??
non lo so ,
chiedevo.
max

Esistono vari pool di memoria a cui un programma può fare riferimento. La
dimensione massima di ognuno di questi pools non è presumibile in alcun
modo. Il programma inoltre può creare ulteriori suoi pools o può anche
manipolare direttamente lo spazio degli indirizzi (consiglio la lettura di
HeapCreate e VirtualAlloc). Inoltre, se usi il VC++, il flag che ti
interessa sono: /HEAP e /STACK
--- bye

 interessa sono: /HEAP e /STACK
ho cercato su WEB ma non ho trovato niente .
Mi potresti dire cosa devo scrivere direttamente nell'ide ?
max

 ha scritto nel messaggio news:c490g9$ppb$1...@news.ngi.it...

A) Che IDE hai?
B) Evidentemente non hai cercato bene, o non hai cercato nel posto giusto
--- bye

 B) Evidentemente non hai cercato bene, o non hai cercato nel posto giusto
DevC++ ,
ma ho provato a cercare l'equivalente con google di quello che hai detto .
Max

Uff... Ci ho messo mezz'ora per capire come caspita si fa. Dunque... Tu crea
un progetto con dentro il file che ti interessa. Poi vai nelle opzioni del
progetto, parametri del linker e mettici questo:
-Wl,"--stack=0x4000000"
(virgolette comprese)
dove 0x4000000 è la dimensione in esadecimale di quanta memoria ti serve.
Abbonda un minimo rispetto a quanta allochi per davvero.
Comunque la soluzione "principe" è quella di mallocare il tutto.
--- bye

> Comunque la soluzione "principe" è quella di mallocare il tutto.
Provo subito il tuo sistema .
La soluzione principe che tu dici , ho letto che potrebbe provocare
non riuscire :
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#malloc
Ora , visto che la mia è una semplice routine : gradirei che il pointer
funzionasse sempre !
Ma perchè mai dovrebbe dare "on failure" ?
grazie mille , mi sei stato gentilissimo : questo C mi ammazza .
Meglio Java :-)
max

 Ma perchč mai dovrebbe dare "on failure" ?
Perchč la memoria potrebbe essere insufficiente o troppo frammentata (quindi
impossibile allocare un blocco delle dimensioni richieste) oppure potresti
avere una implementazione semplicistica della malloc che, per esempio, puň
fare al massimo X allocazioni, o allocazioni di al massimo Y bytes.
Fondamentalmente perň, a meno che tu non usi un compilatore fatto in
burundi, solo perchč manca memoria :-)
In ogni caso č meglio, perchč se la malloc fallisce tu lo puoi sapere e puoi
uscire dal programma in maniera "pulita", se invece ti fallisce
un'allocazione sullo stack il programma salta e tanti saluti.
--- bye

 un'allocazione sullo stack il programma salta e tanti saluti.
Quindi ne deduco che anche la soluzione del linker potrebbe dare lo stesso
problema
di memoria ?
grazie massimiliano :-)))
max

Certo! Perchè magari sbagli tu i calcoli! Oppure perchè il computer su cui
esegui il programma non ha abbastanza memoria! O per finire perchè fai:
int Recurs(int lev)
{
    int a[1000000];
    if (lev > 0)
        return Recurs(lev - 1);
    return 0;
}
Questa funzione si richiama da sola, e a ogni passaggio decrementa lev (fino
a quando non arriva a 0) e alloca 1 mb. 4000 passaggi e DI SICURO crasha (4
gb). In realtà molti ma molti di meno. A priori tu non puoi sapere quanta
memoria userà questo programma (dipende da lev, che magari viene introdotto
dall'utente).
--- bye