Buonasera a tutti. (ripetuto per 2 volte)
(ripetuto per 1 volta)
(ripetuto per 7 volte)
(riga finale)
Posto l'ossatura del codice.
Grazie a quanti risponderanno. |
Lo sai che stai allocando una matrice di double (sul mio pc occupa 8B), che in totale richiede uno spazio in memoria maggiore di 7GiB (8 * 30603 * 30603)? Diminuisci la dimensione e usa un tipo intero (o float, in base a quel che vuoi fare). EDIT: Se si ha necessità di usare matrici così grandi, allora lo stack del sistema non è sufficiente (ne puoi controllare la dimensione nel tuo sistema tramite ulimit -s), devi usare lo heap (memoria libera che vedi su free); alloca tramite malloc la matrice:
con la prima malloc allochi un vettore di puntatori di dimensione N e grandezza di ogni elemento grande quanto un puntatore; nella malloc all'interno del ciclo invece, ad ogni puntatore del vettore allochi un vettore di double, quindi come risultato hai una matrice accessibile tramite i modi che conosci. La malloc non memorizza nello stack ma nello heap, ragion per cui devi usare la free quando non ti serve più quello spazio allocato: basta fare
Se vuoi (cosa che, date le grosse dimensioni, conviene fare) puoi controllare il valore di ritorno della malloc per verificare che lo spazio è disponibile al tempo dell'esecuzione. @dslul i double sono 64bit l'uno, quindi 8 byte sono corretti :) Ma il compilatore ritorna errori sulla matrice OFFSET, non sulla A, no? Il problema è proprio quando si deve allocare la matrice A, la OFFSET non sembra che abbia problemi Buongiorno. dadaix86, il compilatore che uso è "gcc", mentre la versione corrente e quella di ubuntu sono: Linux version 3.13.0-46-generic (buildd@orlo) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #79-Ubuntu SMP Tue Mar 10 20:06:50 UTC 2015 Per quanto riguarda dslul sono ben consapevole dell'occupazione della memoria, ma purtroppo non ne posso fare a meno (mi servirebbero anche una matrice più grande, in verità). Tuttavia credo che dslul mi abbia fatto capire il problema: Ubuntu ce l'ho su una partizione da 14 GB, di cui 7(circa) sono già occupati e si trova che i restanti 7(circa) non siano sufficienti per allocare la matrice. Cerco di modificare il seizing della partizione e poi posterò il risultato. Grazie a coloro che hanno commentato. Buona giornata, a presto. Il problema è la RAM, non lo spazio su disco :) E per favore a meno di rispondere alla (tua) domanda principale usa i commenti non le risposte, grazie. Scusatemi. Cmq la RAM disponibile è 15.6 GB. Per sicurezza aumenta comunque lo spazio su disco disponibile. Comunque non mi hai detto quali parametri usi per compilare. Allora lo stack del sistema non è sufficiente (ne puoi controllare la dimensione nel tuo sistema tramite ulimit -s), devi usare lo heap (se non sbaglio corrisponde alla memoria libera che vedi su free); alloca tramite malloc la matrice:
Se vuoi (cosa che, date le grosse dimensioni, conviene fare) puoi controllare il valore di ritorno della malloc per verificare che lo spazio è disponibile al tempo dell'esecuzione.
Mem: 15977 1676 14301 334 67 769 -/+ buffers/cache: 838 15138 Swap: 16308 0 16308 2) ulimit già lo conoscevo e controllato, è settato su "unlimited" 3) il codice che mi hai postato mi fa compilare il programma e viene eseguito in toto senza warning. Vorrei sapere se ho capito bene quello che hai fatto: tramite il ciclo for, ad ogni elemento dell'array [N], corrisponde un array di [N] elementi tipo "double", senza puntatore. La mancanza di "*" nel secondo malloc è giustificata dal fatto che basta il puntatore "al primo elemento dell'array" che in questo caso è il primo elemento di ogni riga della matrice? Perdonatemi se mi sono spiegato male e vi ringrazio per l'attenzione prestata. con la prima malloc allochi un vettore di puntatori di dimensione N e grandezza di ogni elemento grande quanto un puntatore; nella malloc all'interno del ciclo invece, ad ogni puntatore del vettore allochi un vettore di double, quindi come risultato hai una matrice accessibile tramite i modi che conosci. La malloc non memorizza nello stack ma nello heap, ragion per cui devi usare la free quando non ti serve più quello spazio allocato: basta fare free(puntatore); Modifico la risposta principale in modo da essere più facilmente consultabile. Se hai risolto, accettala come risposta.
5 su 10
mostra altri 5 commenti
|
Segui questa domanda
Via email:Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui
Via RSS:Basi di markdown
- *corsivo* o __corsivo__
- **grassetto** o __grassetto__
- collegamento:[testo](http://url.com/ "titolo")
- immagine?
- elenco numerato: 1. Foo 2. Bar
- per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
- è supportato anche semplice HTML
Tag:
domanda posta: 19 Aug '15, 01:29
domanda visualizzata: 4,303 volte
ultimo aggiornamento: 10 Sep '15, 23:53
Mancano alcune informazioni fondamentali.
Con quale compilatore stai compilando e quali parametri gli passi? Versione del compilatore? Versione di Ubuntu?
Buonasera a tutti. Riprendendo il programma che stavo realizzando quando ho postato la domanda, mi sono accorto di un problema. In pratica, ho bisogno di trasferire i dati dalla matrice A[N][N] ad una matrice B[N][N+1]. Le quali sono del tutto uguali a meno dell'ultima colonna di B, costituita da un vettore rhs.
for (i=0;i<=(N-1);i++) { for (j=0;j<=(N);j++) { if (j<N) { B[i][j] = A[i][j]; } else { B[i][j] = rhs[i]; } }; };
Non capisco perché la matrice B esca completamente nulla. Ho provato a realizzare la matrice B, come suggeritomi per A, ma il risultato non cambia. Grazie.
@kolarov19: non usare le risposte per porre altre domande, apri invece una nuova domanda.