Segmentation Fault σε C++

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
zerard
Δημοσιεύσεις: 46
Εγγραφή: 16 Απρ 2006 15:44

Segmentation Fault σε C++

Δημοσίευση από zerard » 05 Απρ 2008 02:05

Καλησπέρα,
προσπαθώ επανηλημένα να ξεφύγω απο το segmentation fault αλλά αυτό με κυνιγά. Έγραψα σήμερα έναν κώδικα και έφτιαξα ένα array Η[9000000][2]. Αυτό όμως με οδήγησε σε ένα μεγαλοπρεπέστατο "Segmentetion Fault (core dumped)" στο Linux. Στην συνέχει δοκίμασα το εξής:

Κώδικας: Επιλογή όλων

int **H;
H=new int*[9000000];
for&#40;int k=0; k<9000000; k++&#41;&#123;
 H&#91;k&#93;=new int&#91;2&#93;;
&#125;
Δηλαδή έφτιαξα το array δυναμικά. Αυτό δούλεψε. Και δεν καταλαβένω γιατί ενώ οδηγούν στο ίδιο αποτέλεσμα και ενώ ο πρώτος είναι λογικότερος τρόπος να δουλέβει μόνο ο δεύτερος. Θα δουλεύει πάντα ο δεύτερος όμως?
OS: Ubuntu Linux Compiler: Latest DJGPP Editor: Ούτε που ξέρω
όπως γράφω και στην περιγραφή λοιπόν: C++ masters your lights.
Ευχαριστώ
Τελευταία επεξεργασία από το μέλος zerard την 06 Απρ 2008 16:52, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
Hermeia
Honorary Member
Δημοσιεύσεις: 987
Εγγραφή: 02 Αύγ 2004 00:14
Τοποθεσία: Αθήνα
Επικοινωνία:

Segmentation Fault σε C++

Δημοσίευση από Hermeia » 05 Απρ 2008 16:46

συγνώμη, δεν ξέρω C, αλλα ξέρω ότι..

- από το 0 μεχρι το 9[οσο μηδενικα 8ες]
οι διακριτές τιμές είναι = 9[οσο μηδενικα 8ες] +1
(το +1 ειναι η μηδενικη τιμή)

Το περίεργο μου φαίνεται που λειτουργεί το παραπάνω σου .. αλλα είπαμε.. δεν ξέρω C
Μάλλον στο παραπάνω δεν δίνεις τιμη/θέση-μνήμης στο κ=0.. το αυξάνεις πρώτα κατα μια μονάδα και για αυτό τελικά ειναι ΟΚ.

Αν στον πρώτο τρόπο συμπεριλαμβάνεις και την τιμή κ=0, τότε δεν υπάρχει η θέση "9[οσο μηδενικα 8ες]", η τελευταία θέση του πίνακα ειναι η
(9[οσο μηδενικα 8ες] -1),
κι η προσπαθεια χρήσης της 9[οσο μηδενικα 8ες]
βγάζει (ουσιαστικά) σφάλμα στη διαχείριση μνήμης του συστήματος, που κρύβεται πίσω από το συγεκριμένο μηνυμα λάθους.

και πάλι συγνώμη, μπορεί ναναι άσχετο αυτό που λέω..
Πάντως το πιο πιθανό είναι το παραμικρό λαθάκι συνταξης στη διατυπωση του πρώτου τροπου σου.

καλή λυση
Hermeia the InfoSharer
Η Γνώση είναι Δύναμη
Εικόνα

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

Segmentation Fault σε C++

Δημοσίευση από nirvana » 06 Απρ 2008 12:54

Δεν ξέρω αν για το συγκεκριμενο Segmentetion Fault φταιει αυτο που θα σου πω.
Διορθωσε με αν κανω λάθος. Ζητας να σου δώσει απο την ram: 2*9000000*(sizeof(int)) δηλ. περιπου 72 Gb! ;) Γιατι θες ένα τοσο μεγαλο πινακα?

zerard
Δημοσιεύσεις: 46
Εγγραφή: 16 Απρ 2006 15:44

Segmentation Fault σε C++

Δημοσίευση από zerard » 06 Απρ 2008 16:50

72GB? νομίζω ότι το int είναι 4byte άρα 2*9000000*4=72000000 byte=70312 kByte=68.66 Mbyte. Eίναι πολύ αλλά το εν λόγω πρόβλημα μου λέει οτι έχω 120Mb στην διάθεση μου και το PC μου έχει 2GB Ram. Άρα γιατί να προκύψει απο αυτό segmentation και όταν του το δίνω με new να δουλεύει;
Αγαπητή Hermeia, ο κώδικας είναι σε C++ όχι σε C και παρακατω στον κώδικα δεν διαβαζω τον H[9000000][1] για να προκύψει απο εκεί το segmentation.

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

Segmentation Fault σε C++

Δημοσίευση από nirvana » 06 Απρ 2008 17:31

Εχεις δικιο.. Χαζεψα :D Σκεφτομουν τον int σαν 4kb. :P
Αυτο που ρωτας τωρα..Ο πινακας ειναι στατικη δομη. Δηλαδη το πρωτο στοιχειο του πινακα βρισκεται στην θεση εστω 30 της ram.το δευτερο στην 30+4byte το τριτο στην 30+8byte κ.ο.κ. οποτε ψαχνει να βρει 68Mb στη ram συβνεχομενα. Στην 2η περιπτωση ειναι δεσμευση μνημης δυναμικα και γι' αυτο μπορει ενα κομματι της δομης σου να ειναι σε ενα σημειο της ram καποιο αλλο κομματι καπου αλλου κ.ο.κ. Γι' αυτο το λογο ειναι και σαφως γρηγορότερο το πρωτο. Εχει ομως το κακό οτι πρεπει να βρει ενα ενιαιο κομματι 68Mb το οποιο ειναι λιγο απιθανο να συμβει αν εχεις ολα και ολα 120Mb ελευθερα. Νομιζω οτι ετσι δουλευουν τα πραγματα. Ελπιζω να βοηθησα. :)

zerard
Δημοσιεύσεις: 46
Εγγραφή: 16 Απρ 2006 15:44

Segmentation Fault σε C++

Δημοσίευση από zerard » 06 Απρ 2008 18:17

Το πιθανότερο φίλε nirvana είναι να έχεις δίκιο και να μην μπορεί να πάρει στατικά τόσο χώρο. Ευχαριστώ

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Segmentation Fault σε C++

Δημοσίευση από dva_dev » 07 Απρ 2008 04:15

Δεν μπορείς να πάρεις στατικά τόσο μεγάλο κομμάτι μνήμης, αλλά αντί να κάνεις 9000000+1 allocations γιατί δεν κάνεις μόνο 2;

Κώδικας: Επιλογή όλων

int* H&#91;2&#93;;
H&#91;0&#93; = new int&#91;9000000&#93;;
H&#91;1&#93; = new int&#91;9000000&#93;;
είναι σαν να έχεις int H[2][9000000] (αντί για Η[9000000][2]) και επιπλέον εκτός του ότι θα τελειώσεις αμέσως, θα δεσμεύσεις περίπου 4*9000000 bytes λιγότερα στη μνήμη σου απ' ότι με τα 9000000 allocations

zerard
Δημοσιεύσεις: 46
Εγγραφή: 16 Απρ 2006 15:44

Segmentation Fault σε C++

Δημοσίευση από zerard » 07 Απρ 2008 17:42

ναι σωστά θα έχω 9000000 λιγότερους pointers, σε ευχαριστώ

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες