Title: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: bouzias on March 10, 2006, 12:53:39 pm Θέλω να δεσμεύσω δυναμικά μνήμη και να δημιουργήσω ένα 3d array. Δοκίμασα τον παρακάτω κώδικα αλλά μου βγάζει (γεμίζει την οθόνη με μηνύματα) "not enough memory to allocate".
#include "stdafx.h" #include <iostream> #include "stdlib.h" using namespace std; void main() { int a,i=0,j=0,k=0; double*** E; a=100; if((E=(double***)malloc((a)*sizeof(double)))==NULL){ printf("not enough memory to allocate"); } for (i=0;i<a;i++){ if(E[ i] =(double**)malloc((a)*sizeof(double))){ printf("not enough memory to allocate"); } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ if(E[ i][j]=(double*)malloc((a)*sizeof(double))){ printf("not enough memory to allocate"); } } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ for (k=0;k<a;k++){ E[ i][j][k]=0; } } } free(E); for (i=0;i<a;i++){ free(E[ i]); } for (i=0;i<a;i++){ for (j=0;j<a;j++){ free(E[ i][j]); } } } Γενικά θέλω να δίνω στην αρχή τιμή σ' έναν int a και να δημιουργεί ένα array μεγέθους axaxa Καμιά ιδέα; Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: BOBoMASTORAS on March 10, 2006, 13:01:50 pm #include "stdafx.h"
#include <iostream> #include "stdlib.h" using namespace std; void main() { int a,i=0,j=0,k=0; double*** E; a=100; if((E=(double***)malloc((a)*sizeof(double**)))==NULL){ printf("not enough memory to allocate"); } for (i=0;i<a;i++){ if(E[ i] =(double**)malloc((a)*sizeof(double*))){ printf("not enough memory to allocate"); } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ if(E[ i][j]=(double*)malloc((a)*sizeof(double))){ printf("not enough memory to allocate"); } } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ for (k=0;k<a;k++){ E[ i][j][k]=0; } } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ free(E[ i][j]); } } for (i=0;i<a;i++){ free(E[ i]); } free(E); } Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: bouzias on March 10, 2006, 22:59:30 pm Σωστές οι παρατηρήσεις σου αλλά πάλι γέμισε η οθόνη με μηνύματα "not enough memory to allocate" (δηλαδή δε βρίσκει χώρο στη heap) και μετά από λίγο έβγαλε και το εξής: "Unhandled exception at 0x77f7f570 in two_d_PML_1st.exe: User breakpoint."
Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: JAs0n-X on March 11, 2006, 00:01:33 am Αυτο που σου ειπε ο ΒοΒ ειναι σωστο... βασικα πηγαινα να στο γραψω και εγω (πιο συνοπτικα) αλλα με προλαβε!
Δοκιμασες αλλο compiler? δοκιμασες να του δωσεις μικροτερο α? πχ 3. με α=100 συγκεκριμενα θες περιπου 10^6*8 bytes δηλαδη 8ΜByte! (αν οι double ειναι 8 bytes και δεν κανω λαθος). Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: BOBoMASTORAS on March 11, 2006, 04:43:26 am Σε παλιό compiler έχεις 512Κb Συνολικά για κώδικα και 512Kb για μνήμη(ανάλογα και με το μοντέλο μνήμης που χρησιμοποιείς). Οπότε αποκλείεται να μπορέσεις να δευσμεύσεις τόση μνήμη. Τώρα σε κάποιον compiler όπως visual studio μπορεί να δευσμέυσεις τόσο χώρο (δε το έχω δοκιμάσει) αλλά είναι πάλι υπερβολή.
Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: bouzias on March 11, 2006, 11:06:20 am Χρησιμοποιώ Visual Studio .Net 2003. Έβαλα α=6 αλλά πάλι έβγαλε τα ίδια ακριβώς λάθη. Απ' ότι διάβασα με τη malloc() δεσμεύεις μνήμη από τη heap (όλη την εικονική μνήμη: όση ram έχει μείνει αχρησιμοποίητη + σκληρός δίσκος). Επομένως ακόμη και 8 MB να δεσμεύσει είναι σχετικά λίγα. Το θέμα είναι όμως ότι βγάζει το ίδιο πρόβλημα ακόμη και για α=6.
Μήπως υπάρχει και κάποιος άλλος τρόπος να γίνει αυτό που χρειάζομαι; (Το α πρέπει να παίρνει τιμές από 50 μέχρι 200 μπορεί και πιο πολύ) Title: Re: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: gpavlidi on March 11, 2006, 12:54:30 pm #include "stdafx.h"
#include <iostream> #include "stdlib.h" using namespace std; void main() { int a,i=0,j=0,k=0; double*** E; a=100; if((E=(double***)malloc((a)*sizeof(double*)))==NULL){ printf("not enough memory to allocate"); } for (i=0;i<a;i++){ if((E[ i] =(double**)malloc((a)*sizeof(double*)))==NULL){ printf("not enough memory to allocate"); } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ if((E[ i][j]=(double*)malloc((a)*sizeof(double)))==NULL){ printf("not enough memory to allocate"); } } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ for (k=0;k<a;k++){ E[ i][j][k]=0; } } } for (i=0;i<a;i++){ for (j=0;j<a;j++){ free(E[ i][j]); } } for (i=0;i<a;i++){ free(E[ i]); } free(E); } Apla eixes ksexasei na balleis ta '==null' kai sta alla 2 if. Episis otan kaneis free, ksekinas apo tous pointers tou xamiloterou epipedou (px E(i)(j)) kai meta proxwras sta E(i) kai E... Afto giati an soutareis to E prwta, kai meta tou les na soutarei to E(i), den tha to vrei kai tha vgalei exception... Hope that helps! //Sorry gia ta greeklish Yanis Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: bouzias on March 11, 2006, 14:31:45 pm Όντως τα είχα ξεχάσει αυτά... ^banghead^
Πάλι όμως μου βγάζει Unhandled exception at 0x77f7f570 in two_d_PML_1st.exe: User breakpoint. Δοκίμασα με try catch αλλά πάλι το ίδιο. Ουφ... Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: JAs0n-X on March 11, 2006, 21:01:22 pm την ετρεξα και γω και μου βγαζει το ιδιο προβλημα! αρα το προβλημα ειναι στον κωδικα...ΠΟΥ ΟΜΩΣ?? :P
Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: BOBoMASTORAS on March 12, 2006, 02:38:38 am θα προσπαθήσω να το κοιτάξω αύριο...
(ή μάλλον σήμερα !!!! :P ) Title: Re: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: gpavlidi on March 12, 2006, 04:32:52 am Για καντε ενα copy paste τον κωδικα που έγραψα με Italic στο προηγούμενο μου post...
Μου τρέχει κανονικά με .νετ Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: BOBoMASTORAS on March 12, 2006, 05:00:10 am τετοια ώρα τέτοια λόγια. πρεπει να το εγκαταστήσω.... από αύριο....
Title: Re: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: poly1 on March 12, 2006, 12:24:05 pm και γω το δοκίμασα και τρέχει μιά χαρά
Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: bouzias on March 12, 2006, 16:07:43 pm Ε-Π-Ι-Τ-Ε-Λ-Ο-Υ-Σ το βρήκα. Ήταν πολύ χαζό. Εγώ έκανα copy paste κώδικα ο οποίος κάνει malloc(a). Στο pc μου όμως στο a έχω δώσει άλλο όνομα. Έτσι από μπέρδεμα στο pc μου έκανα malloc(a-1) !!!!!!!!!!!!!!!!!!!!!!!!!!!! Οπότε προέκυψαν όλα αυτά...
Επίσης στο πρώτο if είχα sizeof(double**) και όχι sizeof(double*) όπως έγραψε ο gpavlidi, αν και νομίζω ότι αυτό δε δημιουργεί κάποιο λάθος. ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ ΟΛΟΥΣ Title: Απ: πρόβλημα με δυναμική δέσμευση μνήμης για τριδιάστατο πίνακα Post by: BOBoMASTORAS on March 14, 2006, 02:33:31 am ναι το sizeof(double *) με το sizeof(double **) δεν έχει διαφορά γιατί όλοι οι ποιντερσ έχουν το ίδιο μέγεθος
|