Προς το περιεχόμενο

Debate: C/C++ VS Fortran


V.I.Smirnov

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Σημ. moderator: Τα παρακάτω μηνύματα μεταφέρθηκαν εδώ από το θέμα Πώς να δημιουργείτε στατικούς & δυναμικούς πίνακες

 

 

Πώς παιδεύεστε με τους πίνακες στη C/C++...

 

H έλλειψη εγγενούς υποστήριξης είναι μεγάλος μπελάς.

Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ;

Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ;

Μεγάλη φασαρία...

 

Στην Fortran που υποστηρίζονται ενδογενώς είναι μια-δύο γραμμές.

Ούτε malloc, ούτε κλάσσεις, ούτε δείκτες....

Επεξ/σία από parsifal
Προσθήκη επεξήγησης περί split
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 58
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Πώς παιδεύεστε με τους πίνακες στη C/C++...

 

H έλλειψη εγγενούς υποστήριξης είναι μεγάλος μπελάς.

Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ;

Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ;

Μεγάλη φασαρία...

 

Στην Fortran που υποστηρίζονται ενδογενώς είναι μια-δύο γραμμές.

Ούτε malloc, ούτε κλάσσεις, ούτε δείκτες....

 

Άστοχη η σύγκριση. Άλλος ο σκοπός της Fortran και άλλος της C.

 

Είμαστε offtopic και οι δύο :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@imitheos

 

ΝΟΜΙΖΕΙΣ

Είναι επειδή γενικά δεν ασχολείστε με scientific computing.

Αν μπεις πχ. στο site με τους compiler της Intel και δεις τι γίνεται θα αλλάξεις γνώμη.

Εξάλλου η fortran 2003 σε πολλά πράγματα είναι καλύτερη (και ασύγκριτα βολικότερη) από την C++.

 

 

@javaval

Συμφωνώ. Απλώς μου αρέσει να το αναφέρω διότι οι περισσότεροι έχουν την εσφαλμένη άποψη του imitheos.

Εξάλλου ένας "ξερός" ορισμός πινάκων χωρίς ένα interface να τους υποστηρίζει είναι τόσο περιορισμένων δυνατοτήτων

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

Και δυστυχώς οι περισσότερες "χειροποίητες" κλάσεις είναι στην πλειοψηφία τους ημίμετρα....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

offtopic

 

 

Άστοχη η σύγκριση. Άλλος ο σκοπός της Fortran και άλλος της C++.

 

Σε πρόλαβα πριν κάνεις την επεξεργασία και συμφωνήσεις. :).

 

 

 

Επεξ/σία από javavall
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σου είπα ότι συμφωνώ (με το πρώτο μύνημά σου - στο δεύτερο δεν καταλαβαίνω που βλέπεις την "αστοχία").

Ας μην το τραβήξουμε περισσότερο...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
Πώς παιδεύεστε με τους πίνακες στη C/C++...

 

H έλλειψη εγγενούς υποστήριξης είναι μεγάλος μπελάς.

Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ;

Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ;

Μεγάλη φασαρία...

 

Στην Fortran που υποστηρίζονται ενδογενώς είναι μια-δύο γραμμές.

Ούτε malloc, ούτε κλάσσεις, ούτε δείκτες....

 

Φίλε μου, εντελώς φιλικά...χρειάζονται και οι δύο γλώσσες...απλά έτσι δημιουργούνται...βέβαια δεν σου κρύβω, πως όταν πρωτοάρχισα προγραμματισμό, είχα μεγάλο πρόβλημα και το κεφάλι μου γινόταν συνεχώς καζάνι...

Επεξ/σία από linuxs
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Αν πχ. θέλω έναν πίνακα με μιγαδικούς τι κάνω ;

Aν θέλω μια εντολή να δρα σε έναν ολόκληρο πίνακα τι κάνω ( πχ. cos(A) ) ;

Μεγάλη φασαρία...

πίνακα από συναρτήσεις σε fortran μπορώ να έχω;

 

(πληροφοριακά ρωτάω καθότι oι γνώσεις μου σε fortran είναι ... παλιές)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λίγο άσχετο.

Δεν κόβω το κεφάλι μου αλλα στο 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) χωριστά...μπλέξιμο...

Αν πρόκειται για ένα μεγάλο και πολύπλοκο πρόγραμμα πχ. προσομοίωσης αυτές οι ευκολίες - και αρκετές άλλες - είναι ανεκτίμητες.

Έχω χρησιμοποιήσει και τις δυο και το ξέρω από πρώτο χέρι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Mάλλον δεν εκφράστηκες σωστά αλλά ναι, έτσι είναι.

Η fotran είναι εξαιρετική σε αριθμητικές εφαρμογές για πολλούς λόγους (και πάντως πολύ βολικότερη από τη C++).

Και έχει σχεδόν τα πάντα (και δείκτες και αντικείμενα και κληρονομικότητα...)

Όσοι δεν γνωρίζουν την υποτιμούν και την θεωρούν "πεθαμένη". Δεν εκπλήσσομαι, είναι φυσικό διότι οι περισσότεροι δεν

κάνουν scientific programming ώστε να έχουν από πρώτο χέρι εικόνα των δυνατοτήτων της.

To γελοίο είναι όμως να το λένε αυτό απόφοιτοι πληροφορικής που θα έπρεπε να είναι ενημερωμένοι...

 

 

Ναί όντως...έχασα ένα "?". Να σημειώσω πως δεν θεωρώ την fortran "πεθαμένη". Ίσα ίσα ίσως είναι χρήσιμη για άλλου είδους προγράματα(επιστημονικού περιεχομένου).

Απλά δεν την έχω χρησιμοποιήσει ακόμη και δεν μπορώ να πω με σιγουριά ποιά απο τις δυο είναι καλύτερη(αν υπάρχει)...

φιλικά,

linuxs

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
Ναί όντως...έχασα ένα "?". Να σημειώσω πως δεν θεωρώ την fortran "πεθαμένη". Ίσα ίσα ίσως είναι χρήσιμη για άλλου είδους προγράματα(επιστημονικού περιεχομένου).

Απλά δεν την έχω χρησιμοποιήσει ακόμη και δεν μπορώ να πω με σιγουριά ποιά απο τις δυο είναι καλύτερη(αν υπάρχει)...

φιλικά,

linuxs

 

Είναι πολύ καλύτερη αν γράφεις προγράμματα που κάνουν αριθμητικές διεργασίες (προσομοιώσεις, μοντελοποίηση, αριθμητική ανάλυση κλπ) εξαιτίας ακριβώς

των ευκολιών που έχουν στον χειρισμό πινάκων, μιγαδικών, εντολών για χειρισμό του μοντέλου κινητής υποδιαστολής κλπ. (ειδικά η fortran 2003).

Δυστυχώς τα χαρακτηριστικά αυτά καθώς και αρκετά άλλα πολύ χρήσιμα δεν τονίζονται/διδάσκονται επαρκώς ακόμα και σε βιβλία και γι αυτό

αποκτάται η λαθεμένη αντίληψη που σου είπα πιο πάνω.

Το μειονέκτημα είναι ότι για γενικότερη αλγοριθμική ότι δεν υπάρχει έτοιμο υλικό και θα πρέπει να φτιάξεις μόνος σου ότι χρειάζεσαι.

Πχ. αν και έχει δείκτες και μπορούν να γίνουν δομές δεδομένων, δύσκολα θα βρεις έτοιμο πχ. ένα δυαδικό σε δέντρο σε fortran.

Ενώ για αλγοριθμική στη C++ μπορείς να βρεις πολλά πράγματα έτοιμα.

Επίσης η διασύνδεσή της με το λειτουργικό είναι πιο περιορισμένη συγκριτικά με τις C/C++.

 

Εξαρτάται από το τι θες να κάνεις. Πάντως η C/C++ για αριθμητικά προβλήματα δεν είναι καλή επιλογή.

Αν χρησιμοποιηθεί σε τέτοια θα πρέπει να είναι για άλλους λόγους.

Επεξ/σία από V.I.Smirnov
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είναι πολύ καλύτερη αν γράφεις προγράμματα που κάνουν αριθμητικές διεργασίες (προσομοιώσεις, μοντελοποίηση, αριθμητική ανάλυση κλπ) εξαιτίας ακριβώς

των ευκολιών που έχουν στον χειρισμό πινάκων, μιγαδικών, εντολών για χειρισμό του μοντέλου κινητής υποδιαστολής κλπ. (ειδικά η fortran 2003).

Δυστυχώς τα χαρακτηριστικά αυτά καθώς και αρκετά άλλα πολύ χρήσιμα δεν τονίζονται/διδάσκονται επαρκώς ακόμα και σε βιβλία και γι αυτό

αποκτάται η λαθεμένη αντίληψη που σου είπα πιο πάνω.

Το μειονέκτημα είναι ότι για γενικότερη αλγοριθμική ότι δεν υπάρχει έτοιμο υλικό και θα πρέπει να φτιάξεις μόνος σου ότι χρειάζεσαι.

Πχ. αν και έχει δείκτες και μπορούν να γίνουν δομές δεδομένων, δύσκολα θα βρεις έτοιμο πχ. ένα δυαδικό σε δέντρο σε fortran.

Ενώ για αλγοριθμική στη C++ μπορείς να βρεις πολλά πράγματα έτοιμα.

Επίσης η διασύνδεσή της με το λειτουργικό είναι πιο περιορισμένη συγκριτικά με τις C/C++.

 

Εξαρτάται από το τι θες να κάνεις. Πάντως η C/C++ για αριθμητικά προβλήματα δεν είναι καλή επιλογή.

Αν χρησιμοποιηθεί σε τέτοια θα πρέπει να είναι για άλλους λόγους.

 

Η αλήθεια είναι πως δεν θέλω να κάνω κάτι...απλά αυτή τη περίοδο ασχολούμαι με αυτή...μέσα στο καλοκαίρι βέβαια σκέφτομαι να πάω και σε java...απλά θέλω να έχω μια γεύση απο όσες περισότερες μπορώ για να επιλέξω μια στο τέλος...τι προτείνεις?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Στην C++ πρέπει να ξαναγραφούν για κάθε συνάρτηση που ενδιαφέρει ενώ για να αποφευχθεί η επανεγγραφή

...όχι, αρκεί μια φορά (και δεν μιλάω για templates)

τους για διάφορα είδη αριθμών πρέπει να χρησιμοποιηθούν templates.

Επιπλέον αυτό γίνεται αυτόματα και για χειροποίητες ρουτίνες ή συναρτήσεις.

Έστω πχ. ότι γράφεις μια συνάρτηση που υπολογίζει την παράσταση a*X^2+b*X+c.

Εφόσον τηρείται κάποια απλή προϋπόθεση, η συνάρτηση μπορεί να δηλωθεί στοιχειακή και να ισχύει είτε το όρισμα X

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

..

Αν ήταν τόσο τέλεια, θα σχεδιαζόντουσαν και τα λειτουργικά συστήματα με αυτήν...

Η κάθε γλώσσα έχει τις δυνατότητες της και τις ιδιαιτερότητες της...

(δεν απάντησες στην αμέσως προηγούμενη ερώτηση μου...)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Smirnov , αν βλεπω καλα ο τιτλος του θεματος ειναι : Πώς να δημιουργείτε στατικούς & δυναμικούς πίνακες (προφανως στη C )

 

και οχι : "δειτε , η C δεν εχει built-in support για μιγαδικους !!! omgg -.-" ... οποτε θεωρω ασχημο να μετατρεπεις καθε C-thread σε C vs Fortran ( που ολοι εχουμε καταλαβει οτι εκτιμας αρκετα ... )

 

 

 

και θα σε παρακαλεσω να μη μου απαντηεις σε στιλλ "διαβασε καλυτερα αυτα που ειχα γραψει / εχω διατυπωσει την αποψη μου με σαφηνεια / σε γενικες γραμμες συμφωνω" γιατι πολυ απλα αυτα τα εχουμε ξαναδιαβασει ...

>
return 1;

 

 

 

φιλικα παντα ...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

@bxenos

(δεν απάντησες στην αμέσως προηγούμενη ερώτηση μου...)

 

Συγνώμη, δεν την είδα.

 

Καταρχήν, οι περισσότερες από τις ενδογενείς συναρτήσεις επιστρέφουν πίνακες.

Πχ. αν τα A,B,C είναι πίνακες και γράφεις πχ. B = cos(A) ή C = matmul(A,B) οι επιστροφές είναι πίνακες.

Το ίδιο και για συναρτήσεις που ορίζονται για βαθμωτά αλλά δηλώνονται στοιχειακές (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 κ.α. δεν έχω γνώμη. Τι είναι καλύτερο να μάθεις εξαρτάται από το αντικείμενο που θέλεις να ασχοληθείς.

Επεξ/σία από V.I.Smirnov
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...