V.I.Smirnov Δημοσ. 19 Ιουνίου 2010 Δημοσ. 19 Ιουνίου 2010 (επεξεργασμένο) Σημ. moderator: Τα παρακάτω μηνύματα μεταφέρθηκαν εδώ από το θέμα Πώς να δημιουργείτε στατικούς & δυναμικούς πίνακες Πώς παιδεύεστε με τους πίνακες στη C/C++... H έλλειψη εγγενούς υποστήριξης είναι μεγάλος μπελάς. Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ; Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ; Μεγάλη φασαρία... Στην Fortran που υποστηρίζονται ενδογενώς είναι μια-δύο γραμμές. Ούτε malloc, ούτε κλάσσεις, ούτε δείκτες.... Επεξ/σία 20 Ιουνίου 2010 από parsifal Προσθήκη επεξήγησης περί split
javavall Δημοσ. 19 Ιουνίου 2010 Δημοσ. 19 Ιουνίου 2010 Πώς παιδεύεστε με τους πίνακες στη C/C++... H έλλειψη εγγενούς υποστήριξης είναι μεγάλος μπελάς. Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ; Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ; Μεγάλη φασαρία... Στην Fortran που υποστηρίζονται ενδογενώς είναι μια-δύο γραμμές. Ούτε malloc, ούτε κλάσσεις, ούτε δείκτες.... Άστοχη η σύγκριση. Άλλος ο σκοπός της Fortran και άλλος της C. Είμαστε offtopic και οι δύο
V.I.Smirnov Δημοσ. 19 Ιουνίου 2010 Μέλος Δημοσ. 19 Ιουνίου 2010 @imitheos ΝΟΜΙΖΕΙΣ Είναι επειδή γενικά δεν ασχολείστε με scientific computing. Αν μπεις πχ. στο site με τους compiler της Intel και δεις τι γίνεται θα αλλάξεις γνώμη. Εξάλλου η fortran 2003 σε πολλά πράγματα είναι καλύτερη (και ασύγκριτα βολικότερη) από την C++. @javaval Συμφωνώ. Απλώς μου αρέσει να το αναφέρω διότι οι περισσότεροι έχουν την εσφαλμένη άποψη του imitheos. Εξάλλου ένας "ξερός" ορισμός πινάκων χωρίς ένα interface να τους υποστηρίζει είναι τόσο περιορισμένων δυνατοτήτων ώστε πρακτικά είναι σχεδόν άχρηστος για κάποιο σύνθετο πρόβλημα. Το ξέρω εκ πείρας. Και δυστυχώς οι περισσότερες "χειροποίητες" κλάσεις είναι στην πλειοψηφία τους ημίμετρα....
javavall Δημοσ. 19 Ιουνίου 2010 Δημοσ. 19 Ιουνίου 2010 (επεξεργασμένο) offtopic Άστοχη η σύγκριση. Άλλος ο σκοπός της Fortran και άλλος της C++. Σε πρόλαβα πριν κάνεις την επεξεργασία και συμφωνήσεις. . Επεξ/σία 19 Ιουνίου 2010 από javavall
V.I.Smirnov Δημοσ. 19 Ιουνίου 2010 Μέλος Δημοσ. 19 Ιουνίου 2010 Σου είπα ότι συμφωνώ (με το πρώτο μύνημά σου - στο δεύτερο δεν καταλαβαίνω που βλέπεις την "αστοχία"). Ας μην το τραβήξουμε περισσότερο...
linuxs Δημοσ. 19 Ιουνίου 2010 Δημοσ. 19 Ιουνίου 2010 (επεξεργασμένο) Πώς παιδεύεστε με τους πίνακες στη C/C++... H έλλειψη εγγενούς υποστήριξης είναι μεγάλος μπελάς. Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ; Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ; Μεγάλη φασαρία... Στην Fortran που υποστηρίζονται ενδογενώς είναι μια-δύο γραμμές. Ούτε malloc, ούτε κλάσσεις, ούτε δείκτες.... Φίλε μου, εντελώς φιλικά...χρειάζονται και οι δύο γλώσσες...απλά έτσι δημιουργούνται...βέβαια δεν σου κρύβω, πως όταν πρωτοάρχισα προγραμματισμό, είχα μεγάλο πρόβλημα και το κεφάλι μου γινόταν συνεχώς καζάνι... Επεξ/σία 19 Ιουνίου 2010 από linuxs
bxenos Δημοσ. 19 Ιουνίου 2010 Δημοσ. 19 Ιουνίου 2010 ... Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ; Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ; Μεγάλη φασαρία... πίνακα από συναρτήσεις σε fortran μπορώ να έχω; (πληροφοριακά ρωτάω καθότι oι γνώσεις μου σε fortran είναι ... παλιές)
V.I.Smirnov Δημοσ. 19 Ιουνίου 2010 Μέλος Δημοσ. 19 Ιουνίου 2010 Λίγο άσχετο. Δεν κόβω το κεφάλι μου αλλα στο pρογραματισμό στο λύκειο, στο 6ο κεφάλαιο όταν έλεγε για τις γλώσσες(fortran) δεν έλεγε δίπλα: "Κυριώς για μαθηματικές πράξεις". Αν έχω δίκιο, αυτός είναι ο λόγος που χρησιμοποιείς την Fortran για το cos(a) που ανέφερες... φιλικά, linuxs. Mάλλον δεν εκφράστηκες σωστά αλλά ναι, έτσι είναι. Η fotran είναι εξαιρετική σε αριθμητικές εφαρμογές για πολλούς λόγους (και πάντως πολύ βολικότερη από τη C++). Και έχει σχεδόν τα πάντα (και δείκτες και αντικείμενα και κληρονομικότητα...) Όσοι δεν γνωρίζουν την υποτιμούν και την θεωρούν "πεθαμένη". Δεν εκπλήσσομαι, είναι φυσικό διότι οι περισσότεροι δεν κάνουν scientific programming ώστε να έχουν από πρώτο χέρι εικόνα των δυνατοτήτων της. To γελοίο είναι όμως να το λένε αυτό απόφοιτοι πληροφορικής που θα έπρεπε να είναι ενημερωμένοι... δεν μπορώ έχω έναν πινακα από structs να παρουσιάσω έτσι μιγαδικούς? δεν μπορώ να φτιάξω μια ρουτίνα που να κάνει cos σε όλα τα στοιχεια ενός πινακα? Το θέμα είναι ότι δεν υποστηρίζονται εγγενώς και αυτό πάντα οδηγεί σε περιπλοκές. Θα πρέπει να φτιάξεις μια struct ή μια class που να κάνει αυτές τις δουλειές. Σχεδόν όλες οι μαθηματικές συναρτήσεις στην fortran τις δρουν αδιακρίτως τόσο σε βαθμωτά όσο και σε πίνακες οποιουδήποτε είδους αριθμών (ακέραιοι, πραγματικοί κλπ) - τεράστια ευκολία. Στην C++ πρέπει να ξαναγραφούν για κάθε συνάρτηση που ενδιαφέρει ενώ για να αποφευχθεί η επανεγγραφή τους για διάφορα είδη αριθμών πρέπει να χρησιμοποιηθούν templates. Επιπλέον αυτό γίνεται αυτόματα και για χειροποίητες ρουτίνες ή συναρτήσεις. Έστω πχ. ότι γράφεις μια συνάρτηση που υπολογίζει την παράσταση a*X^2+b*X+c. Εφόσον τηρείται κάποια απλή προϋπόθεση, η συνάρτηση μπορεί να δηλωθεί στοιχειακή και να ισχύει είτε το όρισμα X είναι αριθμός είτε πίνακας μιας ή πολλών διαστάσεων χωρίς καμιά άλλη μέριμνα. Και για πινακες με τους μιγαδικούς το ίδιο. Στην C++ πρέπει να γίνει υπερφόρτωση (οverloading) χωριστά...μπλέξιμο... Αν πρόκειται για ένα μεγάλο και πολύπλοκο πρόγραμμα πχ. προσομοίωσης αυτές οι ευκολίες - και αρκετές άλλες - είναι ανεκτίμητες. Έχω χρησιμοποιήσει και τις δυο και το ξέρω από πρώτο χέρι.
linuxs Δημοσ. 19 Ιουνίου 2010 Δημοσ. 19 Ιουνίου 2010 Mάλλον δεν εκφράστηκες σωστά αλλά ναι, έτσι είναι.Η fotran είναι εξαιρετική σε αριθμητικές εφαρμογές για πολλούς λόγους (και πάντως πολύ βολικότερη από τη C++). Και έχει σχεδόν τα πάντα (και δείκτες και αντικείμενα και κληρονομικότητα...) Όσοι δεν γνωρίζουν την υποτιμούν και την θεωρούν "πεθαμένη". Δεν εκπλήσσομαι, είναι φυσικό διότι οι περισσότεροι δεν κάνουν scientific programming ώστε να έχουν από πρώτο χέρι εικόνα των δυνατοτήτων της. To γελοίο είναι όμως να το λένε αυτό απόφοιτοι πληροφορικής που θα έπρεπε να είναι ενημερωμένοι... Ναί όντως...έχασα ένα "?". Να σημειώσω πως δεν θεωρώ την fortran "πεθαμένη". Ίσα ίσα ίσως είναι χρήσιμη για άλλου είδους προγράματα(επιστημονικού περιεχομένου). Απλά δεν την έχω χρησιμοποιήσει ακόμη και δεν μπορώ να πω με σιγουριά ποιά απο τις δυο είναι καλύτερη(αν υπάρχει)... φιλικά, linuxs
V.I.Smirnov Δημοσ. 19 Ιουνίου 2010 Μέλος Δημοσ. 19 Ιουνίου 2010 (επεξεργασμένο) Ναί όντως...έχασα ένα "?". Να σημειώσω πως δεν θεωρώ την fortran "πεθαμένη". Ίσα ίσα ίσως είναι χρήσιμη για άλλου είδους προγράματα(επιστημονικού περιεχομένου). Απλά δεν την έχω χρησιμοποιήσει ακόμη και δεν μπορώ να πω με σιγουριά ποιά απο τις δυο είναι καλύτερη(αν υπάρχει)... φιλικά, linuxs Είναι πολύ καλύτερη αν γράφεις προγράμματα που κάνουν αριθμητικές διεργασίες (προσομοιώσεις, μοντελοποίηση, αριθμητική ανάλυση κλπ) εξαιτίας ακριβώς των ευκολιών που έχουν στον χειρισμό πινάκων, μιγαδικών, εντολών για χειρισμό του μοντέλου κινητής υποδιαστολής κλπ. (ειδικά η fortran 2003). Δυστυχώς τα χαρακτηριστικά αυτά καθώς και αρκετά άλλα πολύ χρήσιμα δεν τονίζονται/διδάσκονται επαρκώς ακόμα και σε βιβλία και γι αυτό αποκτάται η λαθεμένη αντίληψη που σου είπα πιο πάνω. Το μειονέκτημα είναι ότι για γενικότερη αλγοριθμική ότι δεν υπάρχει έτοιμο υλικό και θα πρέπει να φτιάξεις μόνος σου ότι χρειάζεσαι. Πχ. αν και έχει δείκτες και μπορούν να γίνουν δομές δεδομένων, δύσκολα θα βρεις έτοιμο πχ. ένα δυαδικό σε δέντρο σε fortran. Ενώ για αλγοριθμική στη C++ μπορείς να βρεις πολλά πράγματα έτοιμα. Επίσης η διασύνδεσή της με το λειτουργικό είναι πιο περιορισμένη συγκριτικά με τις C/C++. Εξαρτάται από το τι θες να κάνεις. Πάντως η C/C++ για αριθμητικά προβλήματα δεν είναι καλή επιλογή. Αν χρησιμοποιηθεί σε τέτοια θα πρέπει να είναι για άλλους λόγους. Επεξ/σία 19 Ιουνίου 2010 από V.I.Smirnov
linuxs Δημοσ. 19 Ιουνίου 2010 Δημοσ. 19 Ιουνίου 2010 Είναι πολύ καλύτερη αν γράφεις προγράμματα που κάνουν αριθμητικές διεργασίες (προσομοιώσεις, μοντελοποίηση, αριθμητική ανάλυση κλπ) εξαιτίας ακριβώς των ευκολιών που έχουν στον χειρισμό πινάκων, μιγαδικών, εντολών για χειρισμό του μοντέλου κινητής υποδιαστολής κλπ. (ειδικά η fortran 2003). Δυστυχώς τα χαρακτηριστικά αυτά καθώς και αρκετά άλλα πολύ χρήσιμα δεν τονίζονται/διδάσκονται επαρκώς ακόμα και σε βιβλία και γι αυτό αποκτάται η λαθεμένη αντίληψη που σου είπα πιο πάνω. Το μειονέκτημα είναι ότι για γενικότερη αλγοριθμική ότι δεν υπάρχει έτοιμο υλικό και θα πρέπει να φτιάξεις μόνος σου ότι χρειάζεσαι. Πχ. αν και έχει δείκτες και μπορούν να γίνουν δομές δεδομένων, δύσκολα θα βρεις έτοιμο πχ. ένα δυαδικό σε δέντρο σε fortran. Ενώ για αλγοριθμική στη C++ μπορείς να βρεις πολλά πράγματα έτοιμα. Επίσης η διασύνδεσή της με το λειτουργικό είναι πιο περιορισμένη συγκριτικά με τις C/C++. Εξαρτάται από το τι θες να κάνεις. Πάντως η C/C++ για αριθμητικά προβλήματα δεν είναι καλή επιλογή. Αν χρησιμοποιηθεί σε τέτοια θα πρέπει να είναι για άλλους λόγους. Η αλήθεια είναι πως δεν θέλω να κάνω κάτι...απλά αυτή τη περίοδο ασχολούμαι με αυτή...μέσα στο καλοκαίρι βέβαια σκέφτομαι να πάω και σε java...απλά θέλω να έχω μια γεύση απο όσες περισότερες μπορώ για να επιλέξω μια στο τέλος...τι προτείνεις?
bxenos Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 ...Στην C++ πρέπει να ξαναγραφούν για κάθε συνάρτηση που ενδιαφέρει ενώ για να αποφευχθεί η επανεγγραφή ...όχι, αρκεί μια φορά (και δεν μιλάω για templates) τους για διάφορα είδη αριθμών πρέπει να χρησιμοποιηθούν templates. Επιπλέον αυτό γίνεται αυτόματα και για χειροποίητες ρουτίνες ή συναρτήσεις. Έστω πχ. ότι γράφεις μια συνάρτηση που υπολογίζει την παράσταση a*X^2+b*X+c. Εφόσον τηρείται κάποια απλή προϋπόθεση, η συνάρτηση μπορεί να δηλωθεί στοιχειακή και να ισχύει είτε το όρισμα X είναι αριθμός είτε πίνακας μιας ή πολλών διαστάσεων χωρίς καμιά άλλη μέριμνα. Και για πινακες με τους μιγαδικούς το ίδιο. .. Αν ήταν τόσο τέλεια, θα σχεδιαζόντουσαν και τα λειτουργικά συστήματα με αυτήν... Η κάθε γλώσσα έχει τις δυνατότητες της και τις ιδιαιτερότητες της... (δεν απάντησες στην αμέσως προηγούμενη ερώτηση μου...)
linuxs Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 Η κάθε γλώσσα έχει τις δυνατότητες της και τις ιδιαιτερότητες της... +1 Συμφωνώ!!!
NewProject Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 Smirnov , αν βλεπω καλα ο τιτλος του θεματος ειναι : Πώς να δημιουργείτε στατικούς & δυναμικούς πίνακες (προφανως στη C ) και οχι : "δειτε , η C δεν εχει built-in support για μιγαδικους !!! omgg -.-" ... οποτε θεωρω ασχημο να μετατρεπεις καθε C-thread σε C vs Fortran ( που ολοι εχουμε καταλαβει οτι εκτιμας αρκετα ... ) και θα σε παρακαλεσω να μη μου απαντηεις σε στιλλ "διαβασε καλυτερα αυτα που ειχα γραψει / εχω διατυπωσει την αποψη μου με σαφηνεια / σε γενικες γραμμες συμφωνω" γιατι πολυ απλα αυτα τα εχουμε ξαναδιαβασει ... > return 1; φιλικα παντα ...
V.I.Smirnov Δημοσ. 20 Ιουνίου 2010 Μέλος Δημοσ. 20 Ιουνίου 2010 (επεξεργασμένο) @bxenos (δεν απάντησες στην αμέσως προηγούμενη ερώτηση μου...) Συγνώμη, δεν την είδα. Καταρχήν, οι περισσότερες από τις ενδογενείς συναρτήσεις επιστρέφουν πίνακες. Πχ. αν τα A,B,C είναι πίνακες και γράφεις πχ. B = cos(A) ή C = matmul(A, οι επιστροφές είναι πίνακες. Το ίδιο και για συναρτήσεις που ορίζονται για βαθμωτά αλλά δηλώνονται στοιχειακές (elemental) όπως στο παράδειγμα που ανέφερα πριν. Υποθέτω όμως ότι το ρωτάς υπονοώντας αν μπορούμε να γράψουμε μια συνάρτηση που να επιστρέφει έναν πίνακα και αυτό να γράφεται ρητά. Δηλ. κάτι σαν return A όπου το A είναι πίνακας. Λοιπόν, ναι γίνεται και αυτό. Εγώ ξέρω δύο τρόπους. Ο πιο απλός είναι να δηλωθεί το ίδιο το όνομα της συνάρτησης ως πίνακας. Δες ένα απλό παράδειγμα. To παρακάτω έχει μια συνάρτηση που δέχεται ως ορίσματα δυό πίνακες M,X : o Μ δισδιάστατος και ο Χ μονοδιάστατος. Η συνάρτηση επιστρέφει τον Μ Χ + cos(2Χ) που είναι μονοδιάστατος πίνακας. (προφανώς οι διαστάσεις των M, X είναι τέτοιες ώστε οι πράξεις να ορίζονται) Το κύριο πρόγραμμα καλεί την συνάρτηση δυό φορές (με δύο διαφορετικά ορίσματα-πίνακες) και τυπώνει το αποτέλεσμα που είναι ο πίνακας. Το έτρεξα στην Intel fortran. > module matfunc contains function MatrixVector(M, X) implicit none real::M(:,,X( real::MatrixVector(size(X)) ! M, x and MatrixVector are arrays MatrixVector = matmul(M,X)+X*cos(2*X) ! this is the result matrix that is returned from the function end function end module program main use matfunc implicit none real::v(2),w(2),t(3),u(3), & A(2,2),B(3,3) B = reshape( (/ 1.,2.,3., & 1.,2.,3., & 1.,2.,3. /), & ! fill columns and reshape (/3, 3/) ) ! filling the matrices A(1,=(/1.,2./) A(2,=(/3.,4./) v=(/1.,2./) u=1. ! compute and print the results w = MatrixVector(A, v) print *, "u = ", w ! print matrix w t = MatrixVector(B, u) print *, "t = ", t ! print matrix t end program Πόσες γραμμές θα απαιτηθούν σε C++ για να γραφεί κάτι τόσο απλό ; Tα συμπεράσματα είναι εύλογα... Ο δεύτερος τρόπος να επιστραφεί πίνακας από συνάρτηση είναι με χρήση δεικτών (target σε πίνακα και επιστρέφεται ο δείκτης στον πίνακα κλπ). Νομίζω τον είχα δει σε βιβλίο που μάλιστα ήταν ελληνικό αλλά δεν τον έχω χρησιμοποιήσει ποτέ. Και θα σου πω και κάτι άλλο σχετικό. Στην Fortran είναι σχετικά εύκολο χρησιμοποώντας μια δομή (type) να ορίσεις "πίνακα" που κάθε γραμμή του έχει διαφορετικό πλήθος στηλών και να τον χειρίζεσαι επίσης εύκολα. (Πάλι με χρήση δεικτών). Κάποτε μου χρειάστηκε και το έκανα. Αντίθετα, στην C++ είναι αρκετά πιο δύσκολο. Tέλος όταν λέω ότι "στην C++ κάθε συνάρτηση πινάκων που ενδιαφέρει πρέπει να ξαναγραφεί" εννοώ ότι αν έχεις φτιάξει μια κλάση πινάκων,όσες συναρτήσεις θέλεις να δρουν σε ολόκληρο τον πίνακα πρέπει να τις γράψεις ως συνάρτηση μέλος της κλάσσης. Δεν υπάρχει τρόπος να αντιστοιχιστεί αυτόματα η συνάρτηση ενός βαθμωτού στην κλάση ενός πίνακα, δυστυχώς (όπως άλλωστε και οι +,-,*,/). Πχ. τα cos, exp, atan κλπ. @ΝewProject Εκτιμώ εξίσου την C++. Απλώς η fotran είναι αδίκως παραγνωρισμένη και παρεξηγημένη ακόμα και από τους απόφοιτους πληροφορικής και μερικές φορές δράττομαι της ευκαιρίας να δείξω το αντίθετο και ότι υπερτερεί σε πολλά σημεία. Συγνώμη πάντως αν έγινα μερικές φορές κουραστικός... @linuxs Aν δεν πρόκειται να ασχοληθείς με αριθμητικά προβλήματα η fortran δεν θα σου χρειαστεί όπως δεν χρειάζεται στους περισσότερους εδώ. Αλλιώς είναι πρώτη επιλογή μαζί με τη C++. Για Java κ.α. δεν έχω γνώμη. Τι είναι καλύτερο να μάθεις εξαρτάται από το αντικείμενο που θέλεις να ασχοληθείς. Επεξ/σία 20 Ιουνίου 2010 από V.I.Smirnov
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα