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

Μερικές απορίες ενός αρχάριου στην C++.


loxagos_snake

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

Δημοσ.

Γειά σας. Επειδή διαβάζω διάφορα (πχ βιβλία, οδηγούς στο ιντερνετ κλπ) για να μάθω προγραμματισμό, μου έχουν προκύψει κάποιες μικρο-αποριες...

 

1)Κάτι για τα όρια του πίνακα στην γλώσσα με την οποία ασχολούμαι...για να καταλάβω καλά: Μια δήλωση του τύπου Table[10] δηλώνει έναν πίνακα με ΔΕΚΑ θέσεις, και το Table[9] είναι το ΔΕΚΑΤΟ στοιχείο, έτσι;

 

2)Πάλι σχετικά με πίνακες...εάν θέλω να κάνω μια επανάληψη που να "γεμίζει" έναν πίνακα με την χρήση της for, θα πρέπει να γράψω αυτό;

 

 

>cout << "Poses theseis tha exei o pinakas?";
cin >> N;  //as ypothesoume oti eisagei ton arithmo 10

int Table[N]

for (int i=0; i<=N-1;i++) //tote tha kanei apo 0 ews 9, etsi?
{
  cin >> Table[i];
}

 

Αυτά προς το παρόν...Αν θυμηθώ κι άλλα, θα τα προσθέσω!

 

Ευχαριστω!:-)

Δημοσ.
Γειά σας. Επειδή διαβάζω διάφορα (πχ βιβλία, οδηγούς στο ιντερνετ κλπ) για να μάθω προγραμματισμό, μου έχουν προκύψει κάποιες μικρο-αποριες...

 

1)Κάτι για τα όρια του πίνακα στην γλώσσα με την οποία ασχολούμαι...για να καταλάβω καλά: Μια δήλωση του τύπου Table[10] δηλώνει έναν πίνακα με ΔΕΚΑ θέσεις, και το Table[9] είναι το ΔΕΚΑΤΟ στοιχείο, έτσι;

 

2)Πάλι σχετικά με πίνακες...εάν θέλω να κάνω μια επανάληψη που να "γεμίζει" έναν πίνακα με την χρήση της for, θα πρέπει να γράψω αυτό;

 

 

>cout << "Poses theseis tha exei o pinakas?";
cin >> N;  //as ypothesoume oti eisagei ton arithmo 10

int Table[N]

for (int i=0; i<=N-1;i++) //tote tha kanei apo 0 ews 9, etsi?
{
  cin >> Table[i];
}

 

Αυτά προς το παρόν...Αν θυμηθώ κι άλλα, θα τα προσθέσω!

 

Ευχαριστω!:-)

 

1)Ναι. (Μετρας απο το 0 και οχι απο το 1)

2) for(int i=0;i<N;i++) Table......

Δημοσ.

H C/C++ δυστυχώς δεν υποστηρίζει εγγενώς πίνακες.

Πρέπει να φτιάξεις ρουτίνες ή να χρησιμοποιήσεις έτοιμες (STL κλπ).

Σε αυτό το σημείο άλλες γλώσσες όπως η fortran είναι ασύγκριτα βολικότερες...

Δημοσ.
H C/C++ δυστυχώς δεν υποστηρίζει εγγενώς πίνακες.

Πρέπει να φτιάξεις ρουτίνες ή να χρησιμοποιήσεις έτοιμες (STL κλπ).

Σε αυτό το σημείο άλλες γλώσσες όπως η fortran είναι ασύγκριτα βολικότερες...

 

Φυσικά και υποστηρίζει εγγενώς πίνακες όπως όλες οι γλώσσες προγραμματισμού που υπάρχουν σήμερα ! Ίσως να εννοείς ότι δεν υποστηρίζει κάποιες πολύ χρήσιμες ρουτίνες όπως concatenation, αντιγραφή κτλ αλλά και αυτές υποστηρίζονται έμμεσα μέσω των libraries που έρχονται με όλες τις εκδόσεις της γλώσσας π.χ. STL, .NET, wxWidgets κτλ...

 

Όσον αφορά τη Fortran δεν την χρησιμοποιεί σχεδόν κανένας στις μέρες μας εκτός ίσως από κάποιους φοιτητές τμημάτων πολυτεχνείων που τους διδάσκουν ακόμα επειδή έχουν ξεχάσει να αναμορφώσουν τα προγράμματα σπουδών τους !

Δημοσ.
Φυσικά και υποστηρίζει εγγενώς πίνακες όπως όλες οι γλώσσες προγραμματισμού που υπάρχουν σήμερα ! Ίσως να εννοείς ότι δεν υποστηρίζει κάποιες πολύ χρήσιμες ρουτίνες όπως concatenation, αντιγραφή κτλ αλλά και αυτές υποστηρίζονται έμμεσα μέσω των libraries που έρχονται με όλες τις εκδόσεις της γλώσσας π.χ. STL, .NET, wxWidgets κτλ...

 

Όσον αφορά τη Fortran δεν την χρησιμοποιεί σχεδόν κανένας στις μέρες μας εκτός ίσως από κάποιους φοιτητές τμημάτων πολυτεχνείων που τους διδάσκουν ακόμα επειδή έχουν ξεχάσει να αναμορφώσουν τα προγράμματα σπουδών τους !

 

 

Για το πρώτο: κάνεις λάθος, αν εννοούμε το ίδιο πράγμα. Δεν υποστηρίζει πίνακες ως βασικό τύπο δεδομένων (όπως επίσης και μιγαδικούς).

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

Π.χ. όταν τα A,B,C είναι πίνακες δεν μπορείς να γράψεις C=A+B όπως στη fortran.

Άνοιξε ένα manual να δεις τι γίνεται.

 

Για το δεύτερο : Νομίζεις !!!!!!!

Σχεδόν οτιδήποτε που γίνεται στην C++ μπορεί να γίνει στη fortran, συχνά πιο εύκολα, και ειδικά σε ότι αφορά αριθμητική ανάλυση γίνεται καλύτερα και ευκολότερα για διάφορους λόγους.

Η fortran 2003 είναι πλήρως αντικειμενοστρεφής, η δε fortran 95 είναι καλύτερη από την C++ σε αρκετά πράγματα ενώ και οι δυό έχουν δυνατότητες που δεν έχει η C/C++.

Αλλά προφανώς όσοι γράφουν μόνον βάσεις δεδομένων, web-design και παιχνίδια (οι περισσότεροι δηλαδή) δεν τις ξέρουν.

Και άνευ παραξήγησης, συχνά γελώ όταν βλέπω τι προβλήματα αντιμετωπίζουν κάποιοι (συνήθως αρχάριοι) με την C/C++ όταν στη fortran λύνονται με μια εντολή....

Δημοσ.

 

cout << "Poses theseis tha exei o pinakas?";

cin >> N; //as ypothesoume oti eisagei ton arithmo 10

int Table[N]

 

Αυτό δέ νομίζω να είναι portable. Σύμφωνα με το standard, το μέγεθος του πίνακα ΠΡΕΠΕΙ να είναι γνωστό πριν την εκτέλεση του προγράμματος. Καλύτερα να χρησιμοποιείς την κλάση vector.[color=Black]

 

[size=1]---------- Προσθήκη στις 23:50 ---------- Προηγούμενο μήνυμα στις 23:39 ----------[/size]

 

[/color]

[b]Για το πρώτο: κάνεις λάθος,[/b] αν εννοούμε το ίδιο πράγμα. Δεν υποστηρίζει πίνακες ως βασικό τύπο δεδομένων (όπως επίσης και μιγαδικούς).

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

Π.χ. όταν τα A,B,C είναι πίνακες δεν μπορείς να γράψεις C=A+B όπως στη fortran.

Άνοιξε ένα manual να δεις τι γίνεται.

 

[b]Για το δεύτερο : Νομίζεις !!!!!!![/b]

Σχεδόν οτιδήποτε που γίνεται στην C++ μπορεί να γίνει στη fortran, συχνά πιο εύκολα, και ειδικά σε ότι αφορά αριθμητική ανάλυση γίνεται καλύτερα και ευκολότερα για διάφορους λόγους.

Η fortran 2003 είναι πλήρως αντικειμενοστρεφής, η δε fortran 95 είναι καλύτερη από την C++ σε αρκετά πράγματα ενώ και οι δυό έχουν δυνατότητες που δεν έχει η C/C++.

Αλλά προφανώς όσοι γράφουν μόνον βάσεις δεδομένων, web-design και παιχνίδια (οι περισσότεροι δηλαδή) δεν τις ξέρουν.

Και άνευ παραξήγησης, συχνά γελώ όταν βλέπω τι προβλήματα αντιμετωπίζουν κάποιοι (συνήθως αρχάριοι) με την C/C++ όταν στη fortran λύνονται με μια εντολή....

 

Smirnov, σου μιλάει κάποιος οπαδός της Fortran. Όντως, η C++ δεν υποστηρίζει πίνακες όπως τους έχει η Fortran, αλλά αυτό δεν σημαινει πως αν κάποιος τους έχει ανάγκη, δεν μπορεί να φτιάξει κάτι παρόμοιο. Ίσα ίσα, σου δίνει τη δυνατότητα να έχεις ότι semantics θες για την κλάση "Πίνακας" που θα φτιάξεις. Το ότι η Fortran τους υποστηρίζει εγγενώς, δε σημαίνει πως είναι και καλύτερη γλώσσα γενικά. Πολλές άλλες γλώσσες υποστηρίζουν πίνακες, αυτό δε σημαίνει πως κάνουν για number crunching apps.

 

Τώρα, για το αν οτιδήποτε μπορεί να γίνει στη C++, γίνεται και στη Fortran, δε συμφωνώ. Η C++ είναι systems prog. lang. Δεν ειναι scientific lang. Δεν έχουν καν το ίδιο αντικείμενο. Το να υποστηριχτούν μιγαδικοί στη C++ είναι απλά εύκολο. Το ότι δεν τους υποστηρίζει εγγενως δε λέει κάτι. Δηλαδή η D, που υποστηρίζει maps (που δεν υποστηρίζει η Fortran) εγγενώς (οπως και μιγαδικους και [b]real[/b] numbers), τί σημαίνει ? Πως είναι καλύτερη από τη fortran για number crunching και από την C++ για αλγοριθμικά προβλήματα ? Είπες επίσης πως στη C++ δε μπορείς να γράψεις A = B+C. Μια χαρά μπορείς. Μπορείς να το φτιάξεις εύκολα. Επίσης μπορείς να το κάνεις με τέτοιο τρόπο, που όταν γράψεις πχ, A = B * (C + D * E) - K * R, να μη χρησιμοποιηθούν temp objects, με template expressions. Εννοείται, πως για αριθμητική ανάλυση για κάποιον μηχανικό, είναι ευκολότερο να μάθει Fortran. Η C++ είναι πολύ δύσκολη στην εκμάθηση. Το μοναδικό σημαντικό πλεονέκτημα που έχει η Fortran κατά τη γνώμη μου, είναι ότι ξέρεις πως τα πάντα σχεδόν είναι unaliased. Αυτό είναι το major πλεονέκτημα για τον compiler.

 

Και άνευ παραξήγησης, συχνά γελώ όταν βλέπω τι προβλήματα αντιμετωπίζουν κάποιοι (συνήθως αρχάριοι) με την C/C++ όταν στη fortran λύνονται με μια εντολή....

 

Σκέψου τι μπορεί να πει γι αυτό κάποιος που προγραμματίζει σε python/ruby που πιθανότατα θα μπορούσε να λύσει τα περισσότερα προβλήματα γενικού προγραμματισμού σε πολύ λιγότερες γραμμές. Αυτό τί σημαίνει; Πως είναι καλύτερες από C++ ? Σε κάποια πράγματα μπορεί να είναι, αλλά γενικά όχι.

 

--

Και όπως είπα, respect στη Fortran (με αυτή μεγάλωσα), αλλά σίγουρα respect x 10 στη C++. Και δεν γράφω ούτε βάσεις δεδομένων (μπλιαχ), ούτε είμαι web dev (μπλιαχ χ 100 όχι με τους devs, αλλά με το web) ούτε έχω φτιάξει παιχνίδια (θα ήθελα όμως πολύ να μάθω γιατι το θεωρώ τέχνη). Το πρόγραμμα στο οποίο ειμαι από τους developers, ξεκίνησε με fortran, και συνέχισε σε C. Από ένα σημείο και μετά, απλά δεν γινόταν να μείνει σε Fortran. Και εδω και μερικά χρόνια, σιγά σιγά αυξάνονται και οι γραμμές της C++ (~15%). Oύτε το χω σπουδάσει το αντικείμενο. Θα λεγα είμαι σαν και σένα, αν μου επιτρέπεις. Απλά το γουστάρω τρελά.

Δημοσ.

@jstark

 

Συμφωνώ απόλυτα μαζί σου ότι η C/C++ είναι για system programming ενώ η fortran όχι.

Σε ότι αφορά όμως κάποια συγκεκριμένα χαρακτηριστικά της C++ vs fortran γενικά δεν συμφωνώ.

Καταρχήν η εγγενής υποστήριξη πινάκων είναι τόσο πλήρης και βολική στη fortran ώστε πολύ δύσκολα την συναγωνίζεται οποιαδήποτε βιβλιοθήκη της C++.

Πχ. στην STL η κλάσση vector δεν επιτρέπει (απ' όσο θυμάμαι) να οριστούν αρνητικοί δείκτες. Ομοια και στους πίνακες.

Αντίθετα στη fortran τα όρια των δεικτών μπορεί να είναι οποιοιδήποτε ακέραιοι πχ. Α(-10:3).

Και η κομψότητα/συντομία γραφής είναι σαφώς μεγαλύτερη πράγμα που βοηθά την γραφή/αποσφαλμάτωση του προγράμματος.

 

Η εγγενής υποστήριξη πινάκων δεν είναι ξεκάρφωτη μόνη της αλλά συνοδεύεται και από άλλα χαρακτηριστικά που δεν υπάρχουν καν ή

δεν μπορούν να υλοποιηθούν στη C++ χωρίς ειδική μέριμνα.

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

Στην C++ γράφεις :

>for(i=0; i<n ; ++i)
  for(j=0; i<n ; ++i)
     for(k=0; i<n ; ++i)
         if (A[i][j][k] !=0.0f) B[i][j][k] = 1.0f/A[i][j][k]

 

Στην fortran το ισοδύναμο είναι

>forall(i=1:n, j=1:n, k=1:n, A[i][j][k] /=0.) B[i][j][k] = 1./A[i][j][k]

αντικαθιστώντας τα 3 for με μόνον μια εντολή.

 

Το παραπάνω γράφεται ακόμα πιο σύντομα ως

>where(A/=0.) B=1./A

 

Το σημαντικό στα παραπάνω όμως είναι ότι, επειδή οι αποδόσεις τιμών είναι ανεξάρτητες, ένας καλός compiler κάνει τις παραπάνω

πράξεις ΠΑΡΑΛΛΗΛΑ κάτι που δεν μπορεί να γίνει εγγενώς στην C++ σε καμιά περίπτωση.

Ο παραλληλισμός δεδομένων είναι εγγενής στη fortran - άσχετα αν δεν τον υλοποιούν πολλοί (μέτριοι) compilers.

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

Π.χ. όταν γραφεις C=A+B οι περισσότεροι σύγχρονοι compilers στη fortran το κάνουν vectorizing με ότι αυτό συνεπάγεται στην ταχύτητα του

προγράμματος ενώ στη C++ όχι πάντα. Δες π.χ. αν ο compiler σου για C++ μπορεί να το κάνει.

 

Tο ίδιο και με την αυτόματη παραλληλία : αν ο compiler έχει αυτή τη δυνατότητα, οι κλάσεις που μπορεί να έχει φτιάξει κάποιος ή να πάρει από

κάποια βιβλιοθήκη σπάνια μπορούν να παραλληλιστούν αυτόματα.

(Σημ.: αν θυμάμαι καλά η STL είναι μεν thread safe αλλά απ' όσο έχω δει ΔΕΝ παραλληλίζεται αυτόματα.)

 

Υπάρχουν και άλλα χαρακτηριστικά που την καθιστούν πολύ βολικότερη από την C++ για πολλά πράγματα όπως ο χειρισμός αριθμητικών λαθών,

πλήθος εύχρηστων εντολών για άμεσα γραφικά στην κονσόλα (αυτό compiler specific), ικανοποιητικός χειρισμός strings χωρίς χρήση δεικτών κλπ.

(μάλιστα κάποτε με τις εντολές που έχει για χειρισμό strings έφτιαξα ένα parser στην fortran !)

 

Έχοντας δουλέψει και στις δύο βρίσκω ότι είναι πιο κομψή, πιο εύχρηστη και πιο γρήγορη.

Για καθαρά αντικειμενοστρεφή σχεδίαση και δομές δεδομένων δεν θα τη χρησιμοποιούσα. Όχι επειδή στην fortran δεν γίνονται αλλά επειδή ο κύριος

όγκος υλικού υπάρχει σε C++ και εκεί μπορώ να πάρω έτοιμο ότι μου χρειάζεται χωρίς να πρέπει να το μεταγράψω.

Όμως για οτιδήποτε άλλο είναι η πρώτη μου επιλογή εξαιτίας των παραπάνω πλεονεκτημάτων της. (Και ας είναι η C++ η πρώτη γλώσσα που έμαθα.)

Δυστυχώς οι περισσότεροι - ακόμα και απόφοιτοι πληροφορικής - δεν τα ξέρουν επειδή δεν κάνουν scientific programming, έχουν μείνει στη fortran του

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

Ρώτα π.χ. τους συναδέλφους σου που από fortran συνέχισαν το project σε C++ αν ξέρουν τη διαφορά μεταξύ του

 

>forall(I = 3:N + 1, J = 3:N + 1)  
  C(I, J) = C(I, J + 2) + C(I, J - 2) + C(I + 2, J) + C(I - 2, J)  
  D(I, J) = C(I, J)
end forall

και του

>do I=3,N+1
  do J=3,N+1
     C(I, J) = C(I, J + 2) + C(I, J - 2) + C(I + 2, J) + C(I - 2, J)  
     D(I, J) = C(I, J)
  end do 
end do

 

Θα εκπλαγώ αν την ξέρουν.

Δημοσ.
...

Στην C++ γράφεις :

>for(i=0; i<n ; ++i)
  for(j=0; i<n ; ++i)
     for(k=0; i<n ; ++i)
         if (A[i][j][k] !=0.0f) B[i][j][k] = 1.0f/A[i][j][k]

 

Στην fortran το ισοδύναμο είναι

>forall(i=1:n, j=1:n, k=1:n, A[i][j][k] /=0.) B[i][j][k] = 1./A[i][j][k]

αντικαθιστώντας με μια εντολή τα 3 for.

...

στη C/C++ όμως, μπορείς να κάνεις ότι φακιρικά θέλεις πχ:

>
//έστω double A[n][k][j], ομοίως και ο Β
double *a,*b;size_t i;
for(a=(double *)A, b=(double *)B, i=0;i<3*4*5;a[i]?((b[i]=1/a[i]),i++):i++);

;)

 

Για τον αυτόματο παραλληλισμό εκτέλεσης, δεν βλέπω καμία χρησιμότητα σε system level γλώσσα όπως η C να υπάρχει. Στη C++ που ξεφεύγει από αυτόν τον προσανατολισμό, ίσως.

 

---------- Προσθήκη στις 02:35 ---------- Προηγούμενο μήνυμα στις 02:24 ----------

 

...Θα εκπλαγώ αν την ξέρουν.

μήπως λείπει το independent;

[semihidden](υγ: απο τη σχολή έχω να ασχοληθώ με fortran... -)[/semihidden]

 

---------- Προσθήκη στις 02:42 ---------- Προηγούμενο μήνυμα στις 02:35 ----------

 

Να μην ξεχάσω και τη λύση για τις n βασίλισσες στη σκακιέρα:

>
# include<stdio.h>
int v,i,j,k,l,s,a[99];
main()
{
for(s=8;*a-s;v=a[j*=v]-a[i],k=i<s,j+=(v=j<s&&(!k&&!!printf(2+"\n\n%c"-(!l<<!j)," #Q"[l^v?(l^j)&1:2])&&++l||a[i]<s&&v&&v-i+j&&v+i-j))&&!(l%=s),v||(i==j?a[i+=k]=0:++a[i])>=s*k&&++a[--i]);
printf("\n\n");
}

:shock: (δεν νομίζω να γίνεται γρηγορότερα σε fortran...) κλπ

Δημοσ.

Αξίζει να γινει ερευνα γιατι ολοι απαντανε σε ερωτησεις τυπου "ερωτησεις αρχαριου" , "ερωτηση για προγραμματισμο" , "τι ειναι ο προγραμματισμος" , "πως ανοιγει ο Η/Υ" , "τι ειναι το πληκτρολογιο" , "Με τι γλωσσα προγραμματισμου να αρχισω" , κ.τ.λ κ.τ.λ.

 

Γιατι μεσα σε λιγα λεπτα γεμιζει με την καθε μπουρδα του καθενα ?

ο καθενας λεει οτι θελει , οτι του ερθει στον εγκεφαλο λες και αυτος που εκανε την ερωτηση θα ακουσει τον καθε ενα απο εσας!

 

εναν θα ακουσει και αυτος θα του λεει να διαβάσει αυτο που θελει ο ιδιος.

 

Ελλας,Ελλας τι θα γινει φιλε μου με εμας???

Δημοσ.
στη C/C++ όμως, μπορείς να κάνεις ότι φακιρικά θέλεις πχ:

>
//έστω double A[n][k][j], ομοίως και ο Β
double *a,*b;size_t i;
for(a=(double *)A, b=(double *)B, i=0;i<3*4*5;a[i]?(b[i]=1/a[i],i++):i++);

;)

 

Για τον αυτόματο παραλληλισμό εκτέλεσης, δεν βλέπω καμία χρησιμότητα σε system level γλώσσα όπως η C να υπάρχει.

Στη C++ που ξεφεύγει από αυτόν τον προσανατολισμό, ίσως.

 

Γενικά δεν διαφωνούμε.

Eίπα ότι για system programming, πλήρη αντικειμενοστρεφή σχεδίαση και δομές δεδομένων η C/C++ είναι το standard.

Για αρκετά άλλα πράγματα όμως όχι.

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

 

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

Καμιά σχέση με το σαφέστατο και ξεκάθαρο where(A/=0.) B=1./A της fortran.

Εξάλλου, εδώ η mask και η απόδοση είναι πολύ απλές. Στην C++ για κάτι πιο πολύπλοκο δεν μπορείς να γράψεις με τόση συντομία.

Π.χ. το παρακάτω είναι από πραγματικό πρόγραμμα : τα angle, phase, term1, term2 είναι 3x1 πίνακες ενώ η atan εφαρμόζεται σε ολόκληρο τον πίνακα

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

 

>where     (term1>0..and.term2<0.)
  angle = atan(abs(term2/term1))        
  phase = angle

elsewhere (term1<0..and.term2<0.)
  angle = atan(abs(term1/term2))
  phase = half_Pi+angle

elsewhere (term1<0..and.term2>0.)
  angle = atan(abs(term2/term1))
  phase = -Pi+angle

elsewhere (term1>0..and.term2>0.)
  angle = atan(abs(term2/term1))
  phase = -angle

endwhere

 

Εύλογο τι κάνει το παραπάνω. (Kαι παραλληλίζεται και αυτόματα).

Πόσους βρόγχους θέλει για να γραφεί σε C++ ?

 

Όσο για την παραλληλία σε system programming , ναι, δεν έχει νόημα ως παραλληλισμός δεδομένων (άρα και στη C) αλλά ως παραλληλισμός ελέγχου.

Το θέμα είναι ότι οι περισσότεροι χρησιμοποιούν τη C εκεί όπου η fortran θα μπορούσε να χρησιμοποιηθεί με παραλληληλισμό δεδομένων πολύ αποδοτικότερα.

 

Στον παραλληλισμό δεδομένων (δηλ. στις περισσότερες καθημερινές χρήσεις !) η fortran είναι πολύ πιο μπροστά από την C++.

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

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

Ενώ στη fortran είναι τετριμένος τρόπος σκέψης.

 

Για το independed προφανώς έχεις δίκιο, συμφωνώ.

Εγώ απλώς αναρωτήθηκα αν αυτοί που απαξιώνουν τη fortran είναι ενήμεροι για τις δυνατότητές της...

Και συνήθως ΔΕΝ είναι όπως ο φίλος πιο πάνω.

 

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

Αλλά σε ποιά μπορεί να γραφεί πιο σύντομα και ταυτόχρονα με τρόπο που να εκφράζει κομψά και σαφώς την λύση του προβλήματος.

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

H λύση όπως την έγραψες είναι εξαιρετικά δυσνόητη.

Δημοσ.

Σε πόσα ρεαλιστικά εμπορικά προγράμματα χρησιμοποιείς πίνακες τέτοιου είδους; Μην τρελαθούμε, οι σκακιέρες και οι πίνακες ΝχΝ είναι κατά κύριο λόγο για εκπαιδευτικά / μαθηματικά προβλήματα, όχι για κατά κόρον εμπορικές εφαρμογές. Η standard library της c++ περιέχει άκρως βελτιστοποιημένο και χιλιοδοκιμασμένο κώδικα για όλα τα χρήσιμα data structures (collections etc). Δεν χρειάζεται να επεκταθώ στα υπόλοιπα + της γλώσσας, όμως δεν μπορείς να κατηγορείς κανέναν επειδή διαλέγει αυτό το εργαλείο έναντι άλλων. Άσχετα που το θέμα είναι άσχετο με το ζητούμενο του thread.

 

Προς τον thread starter:

Σωστός, και γενικά να ξέρεις ότι ένας πίνακας με πλήθος στοιχείων Ν, οι δείκτες θέσεις του είναι από 0 ως και Ν-1.Γιαυτό και στη συνθήκη τερματισμού σε καλύπτει το i<Ν.

Δημοσ.
Σε πόσα ρεαλιστικά εμπορικά προγράμματα χρησιμοποιείς πίνακες τέτοιου είδους; Μην τρελαθούμε, οι σκακιέρες και οι πίνακες ΝχΝ είναι κατά κύριο λόγο για εκπαιδευτικά / μαθηματικά προβλήματα, όχι για κατά κόρον εμπορικές εφαρμογές.

Η standard library της c++ περιέχει άκρως βελτιστοποιημένο και χιλιοδοκιμασμένο κώδικα για όλα τα χρήσιμα data structures (collections etc).

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

 

Άσχετα που το θέμα είναι άσχετο με το ζητούμενο του thread.

 

1) To θέμα είναι off-topic αλλά δεν το ξεκίνησα εγώ.

 

2) Έγραψα ότι "οι περισσότεροι γράφουν βάσεις δεδομένων web design και παιχνίδια.

Δεν ασχολούνται με scientific programming".

Συνεπώς εδώ δεν διαφωνούμε - γενικά καλά κάνουν και χρησιμοποιούν C++ και STL.

Oι "σκακιέρες" είναι εκπαιδευτικό παράδειγμα και δεν το παράθεσα εγώ αλλά οπαδός της C++.

Aντίθετα, το δικό μου παράδειγμα ήταν από πραγματικό πρόγραμμα που κάνει FDTD προσομοίωση.

 

3) Η STL είναι βελτιστοποιημένη με ασυμπτωτικό τρόπο ως προς τον χρόνο και συνεπώς ΔΕΝ έχει την ίδια ταχύτητα με ενδογενείς κατασκευές.

Δεν είναι άκρως βελτιστοποιημένη με τον τρόπο που υπαινίσσεσαι.

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

Οι υπόλοιποι χρησιμοποιούν ότι τους βολέψει, έτσι, χωρίς καμιά σκέψη, αρκεί να τρέχει.

Πρώτο χειροπιαστό παράδειγμα : εδώ στο forum κάποιος συνέκρινε την qsort της STL με αυτήν της βιβλιοθήκης της C++ και ήταν περίπου 10 φορές βραδύτερη...

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

Ο τύπος εξηγεί γιατί δεν χρησιμοποιεί την STL :

 

"The Standard Template Library (STL) is not exposed here. Although STL is a convenient

implementation of a lot of commonly used items, many of the container

classes are designed to be efficient in time in the asymptotic sense.

For example,

the STL set class stores the elements of the set in ascending order, which allows a

logarithmic-time binary search to determine existence of an element. The ordering

also supports logarithmic-time insertion and deletion. Unfortunately, real-time engines

sometimes have performance penalties because of the overhead of STL, both in

time and memory.

Real-time applications are of such a nature that the designer/architect of the

system has a lot of knowledge about memory usage patterns, but a generic set of

template containers do not have the benefit of this knowledge. In this setting, there is

some justification for reinventing the wheel! Section 2.1.1 discusses the basic data

structures that replicate some of the functionality of STL, but just the minimum

necessary to support the engine."

Ο τύπος δίνει απλό παράδειγμα όπου επιτυγχάνει μεγαλύτερη ταχύτητα και οικονομία στη μνήμη πάνω από 45% (!!!) με τις δικές του

κατασκευές δεδομένων σε σχέση με της STL - ας μην το παραθέσω.

Εξάλου, αυτόματη παραλληλία σε πίνακες/vectors της STL γενικά δεν μπορεί να γίνει με ότι αυτό σημαίνει για την ταχύτητα του προγράμματος.

Δεν χρειάζεται να πω κάτι άλλο επί αυτού - όσοι ξέρουν καταλαβαίνουν.

 

4) To πού χρησιμοποιούνται πίνακες τέτοιου είδους είναι προφανές : οπουδήποτε αποθηκεύεις και δουλεύεις με αριθμούς.

Η C++ δυστυχώς σε αυτό υπολείπεται. Όσοι επιμένουν να τη χρησιμοποιούν κύρια για τέτοιες δουλειές (πχ. αριθμητική ανάλυση) ας παιδεύονται - καλά να πάθουν.

 

Δεν κατηγορώ κανέναν που χρησιμοποιεί τις C++ και STL .

Όμως μου κάνει εντύπωση που κάποιοι υποτιθέμενοι γκουρού επιμένουν σώνει και καλά στην C/C++ για κάποια

πράγματα όταν φανερά είναι λιγότερο κατάλληλη γι αυτά και αγνοούν/απαξιώνουν τη fortran που της έρχονται γάντι.

Πράγμα που δείχνει ότι δεν είναι και τόσο γκουρού όσο φαίνονται. Αυτό είπα.

Αρχειοθετημένο

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

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