Newsgroup: it.comp.lang.c++
Titolo: Sfruttare tutta la memoria

Ciao a tutti.
Premetto che le mie conoscenze di C++ sono piuttosto limitate e che uso
MS-Visual C++ 5 quasi esclusivamente per applicazioni di calcolo (console
application).
Il mio problema è il seguente: per un programma di simulazione ho bisogno di
utilizzare una matrice di numeri complessi piuttosto grande (il più grande
possibile, indipendente dal tempo di calcolo richiesto!!!).
Per i numeri complessi utilizzo una classe da me scritta "ad-hoc" e più
volte testata.
Il problema è che ogni numero complesso è rappresentato da una coppia di
reali di tipo "double" (8 byte ciascuno).
Quando la matrice supera la dimensione di 225*225=50625 numeri complessi =
101250 numeri "double" = 810 Kb
(al successivo passo è una matrice 256*256=.....=1,048 Mb)
Ho allora riscritto la classe utilizzando numeri in semplice precisione
("float") e ancora una volta quando la dimensione della matrice supera il Mb
il programma va in crash.
Mi sono fatto quindi l' idea che il compilatore sfrutti soltanto, salvo
diversa specificazione, il primo Mb di memoria direttamente accessibile con
l' indirizzamento a 16 bit.
Quello che vorrei sapere è come si può fare in modo di abbattere questa
fortissima limitazione.
Vi sarei estermamente grato se voleste anche segnalarmi qualche sito
(italiano o inglese) in cui la procedura sia ben spiegata.
Grazie anticipatamente a tutti
Andrea


Ciao,
non so se il Visual C++ 5 abbia limitazioni di memoria per quanto riguarda
applicazioni consolle.
Prova a eseguire il tuo programma compilandolo e linkandolo col DevC++ che
scarichi da 
http://www.bloodshed.net/dev/devcpp.html
, facendo un progetto
consolle anche li'.
Maurus

 consolle anche li'.
Confermo che con questo compilatore ho allocato centinaia di Mb in
applicazioni console (che comunque sono Win32).
Forse è il VC++ 5 che ha qualche problema.
Consiglio anche io l'uso del Dev-C++, è ottimo per applicazioni console ma
anche Win32, è ben ottimizzato perché le performance gli danno ragione (è
uno dei più utilizzati per scrivere videogames, che sono generalmente
applicazioni power demand) e soprattutto è freeware.
L'unica cosa, se vuoi una certa stabilità orientati sulla versione "stable"
e non la beta.
Per contro, ti mancherà il class-wizard e certe facilities però ci si abitua
(la beta invece le ha).

 ha scritto nel messaggio
news:mOdY9.104394$AA2.4...@news2.tin.it...

Da quanto scrivi non si capisce se la matrice viene allocata nello heap (
esempio : matrice = new complex[n*m]; ) o nello stack (esempio : complex
matrice[N][M]; ). Nel secondo caso : verifica le impostazioni del
compilatore riguardanti lo spazio riservato allo stack e se comunque non ci
stai dentro passa alla allocazione nello heap.
------
Sergio Bianchi


Preciso meglio ....
Un array di questo tipo viene allocato nello stack se dichiarato nel corpo
di una funzione, ad esempio nel main.
Nel caso sia tra i dati membro di una classe, se l' oggetto finisce nello
stack, pure la matrice finisce nello stack
-----
Sergio Bianchi

 Sergio Bianchi
In tutta sincerità questo lo ignoro.
La matrice è di dati di tipo "Azz_complex" (definiti nella mia classe) e,
almeno in questa prima versione del programma NON viene allocata
dinamicamente. La dimensione è definita (#define DIM 225) subito dopo la
dichiarazione degli headers e la matrice è dichiarata all' interno del main
con una riga tipo
Azz_complex A[DIM][DIM] ;
Mi potresti gentilmente spiegare in quale dei due casi da te proposti ricado
e come posso alternativamente allocare la matrice A senza incorrere in
questi problemi?

 ha scritto nel messaggio
news:yNsY9.107959$AA2.4...@news2.tin.it...

In C++ ci sono tre modi di utilizzo della memoria.
memoria statica , memoria automatica e memoria dinamica.
La memoria statica  viene riservata all' inizio del programma per le
variabili globali e le variabili dichiarate static e rilasciata solo al
termine del programma.
La memoria automatica viene usata dal programma per le variabili locali e
gli argomenti delle funzioni. Utilizza il meccanismo dello stack.
La memoria dinamica viene riservata tramite l' operatore new  e liberata
tramite l' operatore delete. E' il programmatore a decidere come e quando
usarla.
Nel tuo caso il problema è probabilmente dovuto ad uno stack overflow. Una
dichiarazione di array del tipo Azz_complex A[DIM][DIM] ; nel main fa si che
il compilatore riservi nello stack spazio per l' array ma tu stai usando un
array molto grande e quindi stai consumando tutto lo spazio riservato allo
stack. Lo spazio riservato allo stack non è infinito ma viene definito al
momento della compilazione e di solito è modificabile con qualche direttiva
o parametro ma generalmente non si può estendere oltre un certo limite. (Io
non conosco il compliatore VC++5 e quindi non posso esserti di aiuto in
questo senso)
In generale la soluzione migliore sarebbe quella di allocare dinamicamente
l'array con  new(). In questo modo viene utilizzata la memoria dello heap e,
quando non serve più, liberata con delete [] in modo da poter essere
riutilizzata dal tuo programma per altri usi. Questo penso però comporterà
modifiche al  tuo codice.
Alternativamente, per non modificare il codice, dichiarara l'array come
variabile globale (al di fuori del main) o nel main come:  static
Azz_complex A[DIM][DIM] ;
Questo eviterà l'allocazione nello stack ma terrà occupata la memoria fino
alla fine del programma e se devi utilizzare consecutivamente diversi array
all' interno del tuo programma consumerai molta più memoria.
Spero di essere stato di aiuto.
----
Sergio Bianchi
-----
Sergio Bianchi

 ha scritto nel messaggio
news:ceuY9.44693$ZE.12...@twister2.libero.it...



Sono contento che tu abbia capito Andrea.
Se poi la prossima volta ci fai il piacere di quotare per bene siamo
contenti anche noi.
Cerca di riportare in alto un pezzo del messaggio a cui rispondi e in basso
il tuo messaggio.
Grazie.
Maurus


Purtroppo sono un neofita di news-group e affini.
Va meglio cosě?
Grazie anche di questo consiglio e a presto.

 Grazie anche di questo consiglio e a presto.
Di nulla.
Maurus