personGR Δημοσ. 18 Μαρτίου 2012 Δημοσ. 18 Μαρτίου 2012 Καλησπέρα παιδιά!! Χρειαζόμουν για μια άσκηση να δεσμεύσω δυναμικά ένα δυσδιάστατο πίνακα, και αφόυ έψαξα βρήκα την εξής μέθοδο: > ... float **a; a = new float *[rows]; for (int i=0; i<rows; i++) a[i] = new float[cols]; ... Ψιλο-κατάλαβα πως λειτουργεί, το θέμα είναι πως δεν καταλαβαίνω γιατί πρέπει να γράψω new float *[rows]? Τι ακριβώς κάνει αυτή η γραμμή, και ειδικά ο αστερίσκος (ορίζει τι, ως δείκτη; ) Ευχαριστώ
Anubis13 Δημοσ. 18 Μαρτίου 2012 Δημοσ. 18 Μαρτίου 2012 http://www.cplusplus.com/reference/std/new/operator%20new%5B%5D/ Aυτό σε βοηθάει περισσότερο? > scanf("%d",&N); int **sp = (int**) calloc (N,sizeof(int*)); for (i = 0; i < N; i++) { sp[i] = (int*) calloc (2,sizeof(int)); } Ουσιαστικά κανει δέσμευση τόσων θέσεων μνήμης όσες και το rows. YΓ: Δεν ξερω αν βοηθαω αλλα φανταζομαι οτι αυτο κανει η new.
Stavros_Ribo Δημοσ. 19 Μαρτίου 2012 Δημοσ. 19 Μαρτίου 2012 Καλησπέρα παιδιά!! Χρειαζόμουν για μια άσκηση να δεσμεύσω δυναμικά ένα δυσδιάστατο πίνακα, και αφόυ έψαξα βρήκα την εξής μέθοδο: ... float **a; a = new float *[rows]; for (int i=0; i<rows; i++) a = new float[cols]; ... Ψιλο-κατάλαβα πως λειτουργεί, το θέμα είναι πως δεν καταλαβαίνω γιατί πρέπει να γράψω new float *[rows]? Τι ακριβώς κάνει αυτή η γραμμή, και ειδικά ο αστερίσκος (ορίζει τι, ως δείκτη; ) Ευχαριστώ Με την εντολή a = new float *[rows]; ουσιαστικά δεσμεύεις χώρο για έναν πίνακα τύπου pointer σε float, μεγέθους rows. Δηλαδή κάθε κελί του πίνακα θα είναι ένας pointer σε float. Και με την εντολή a = new float[cols]; δεσμεύεις χώρο για κάθε έναν από τους προηγούμενους pointers σε έναν float πίνακα μεγέθους cols. Γενικά στη C/C++ οι 2-διάστατοι (και αντίστοιχα οι d-διάστατοι) αποτελούνται από μονοδιάστατους πίνακες. Για παράδειγμα οι 2-διάστατοι πίνακες αποτελούνται από έναν μονοδιάστατο που το κάθε κελί του είναι ένας άλλος μονοδιάστατος πίνακας. Έτσι γίνεται και στην παραπάνω δημιουργία.
migf1 Δημοσ. 19 Μαρτίου 2012 Δημοσ. 19 Μαρτίου 2012 Να συμπληρώσω μόνο πως ένας βασικός λόγος που στην C++ και στη C όλοι οι πίνακες υλοποιούνται μονοδιάστατα είναι για να διευκολύνεται η αριθμητική δεικτών (pointer arithmetic).
personGR Δημοσ. 19 Μαρτίου 2012 Μέλος Δημοσ. 19 Μαρτίου 2012 Με την εντολή a = new float *[rows]; ουσιαστικά δεσμεύεις χώρο για έναν πίνακα τύπου pointer σε float, μεγέθους rows. Δηλαδή κάθε κελί του πίνακα θα είναι ένας pointer σε float. Και με την εντολή a = new float[cols]; δεσμεύεις χώρο για κάθε έναν από τους προηγούμενους pointers σε έναν float πίνακα μεγέθους cols. Γενικά στη C/C++ οι 2-διάστατοι (και αντίστοιχα οι d-διάστατοι) αποτελούνται από μονοδιάστατους πίνακες. Για παράδειγμα οι 2-διάστατοι πίνακες αποτελούνται από έναν μονοδιάστατο που το κάθε κελί του είναι ένας άλλος μονοδιάστατος πίνακας. Έτσι γίνεται και στην παραπάνω δημιουργία. Ευχαριστώ πολύ!!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα