migf1 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Encapsulation. Για encapsulation o "λιτός" τρόπος είναι ο ενδεδειγμένος, με τα 2 #define κρυμμένα σε δικό τους private header file. Στη συγκεκριμένη περίπτωση ναι. Σαν learning exercise όμως, όπως και στη γενική περίπτωση, bad idea. Για ποιο λόγο;
παπι Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Εμενα παντως μου αρεσει το iterator style >void foo(int* first, int* last) { for(int *it = first; it != last; it++) { } }
defacer Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Για encapsulation o "λιτός" τρόπος είναι ο ενδεδειγμένος, με τα 2 #define κρυμμένα σε δικό τους private header file. Το οποίο μετά θα κάνεις include παντού γιατί αλλιώς δε θα μπορείς να χρησιμοποιήσεις τους πίνακες. Not my idea of private. Επίσης υποπτεύομαι πως έχεις μια "περίεργη" άποψη για το τι είναι encapsulation αλλά I 'm way past caring. Για ποιο λόγο; Έλα τώρα, μη με τρολλάρεις. Αν πίστευα ότι έχει νόημα να απαντήσω θα απαντούσα. Update: Αλλά τουλάχιστον μπορώ να πω αυτό: Coupling. Εμενα παντως μου αρεσει το iterator style >void foo(int* first, int* last) { for(int *it = first; it != last; it++) { } } Και μενα. Απλά στη C δεν έχει τόσο ψωμί όσο στη C++ οπότε όπως και πολλά άλλα πράγματα καταλήγει σε θέμα προτίμησης.
migf1 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Εμενα παντως μου αρεσει το iterator style >void foo(int* first, int* last) { for(int *it = first; it != last; it++) { } } Στη C είναι error-prone (π.χ. πρέπει να βεβαιώσεις πως το *last είναι σε συνεχόμενη μνήμη μετά το *first, αλλιώς... boom). Επίσης ακόμα και στην C++ o iterator δεν είναι πάντα επιθυμητός, λόγω του αχρείαστου overhead που μπορεί να παράξει.
Directx Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 [..]Από τη στιγμή που μιλάμε για fixed-size πίνακα, ο πιο λιτός και λειτουργικός τρόπος είναι ο 1ος τρόπος, χωρίς να μειονεκτεί σε τίποτα από τον 3ο. Και ο 3ος είναι θεμιτός τρόπος όμως, απλώς πιο περιφραστικός. Οπότε η δική μου προτροπή είναι να χρησιμοποιείς όποιον σε βολεύει καλύτερα μεταξύ του 1ου και του 3ου. Από συνήθεια πιο οικείο σαν στυλ (3) μου φαίνεται το "foo( arr, MAX_ELEMS );" διότι μου δίνει περισσότερες πληροφορίες (αν δω τον κώδικα μετά από αρκετό καιρό για παράδειγμα), αλλά αρκετές φορές έχει τύχει να χρησιμοποιήσω και το (1) "foo( arr );".
migf1 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Το οποίο μετά θα κάνεις include παντού γιατί αλλιώς δε θα μπορείς να χρησιμοποιήσεις τους πίνακες. Not my idea of private. Επίσης υποπτεύομαι πως έχεις μια "περίεργη" άποψη για το τι είναι encapsulation αλλά I 'm way past caring. Η δική σου ιδέα για το private είναι να κάνεις expose το μήκος του arr ως όρισμα στις συναρτήσεις; Έλα τώρα, μη με τρολλάρεις. Αν πίστευα ότι έχει νόημα να απαντήσω θα απαντούσα. Update: Αλλά τουλάχιστον μπορώ να πω αυτό: Coupling. Δεν χρειάζεται να απαντήσεις για μένα, απλά ίσως θα ήθελες να εξηγήσεις για όσους διαβάζουν το νήμα που στηρίζεις αυτά που γράφεις. Ειδικά αφού άρχισες πάλι να μιλάς στο νήμα της C για features της C++, σε περίπτωση που σου διαφεύγει, η C δεν υποστηρίζει εγγενώς true encapsulation. Αν θες να προσομοιώσεις true encapsulation στη C φτιάξε μια custom OOP-like library, ή χρησιμοποίησε μια από τις έτοιμες. Αμφιβάλλω αν θα δεις πουθενά να περνάνε το μήκος του arr ως όρισμα στις συναρτήσεις διαχείρισης του. Αν βαριέσαι όμως, google is your firend. Από συνήθεια πιο οικείο σαν στυλ (3) μου φαίνεται το "foo( arr, MAX_ELEMS );" διότι μου δίνει περισσότερες πληροφορίες (αν δω τον κώδικα μετά από αρκετό καιρό για παράδειγμα), αλλά αρκετές φορές έχει τύχει να χρησιμοποιήσω και το (1) "foo( arr );". Και οι 2 τρόποι είναι θεμιτοί (όπως έγραψα εξαρχής) και όπως γνωρίζουμε όσοι έχουμε ασχοληθεί χρησιμοποιούνται και οι 2 κατά κόρον στην C, φίλε xdir
Re4cTiV3 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Δεν μπορώ να καταλάβω πως γίνεται η αλλαγή γραμμής σε αρχείο στην C :/ Αρχείο: 1 2 3 1 2 3 3 4 5 5 6 7 > FILE * pFile; pFile = fopen ("database.txt" , "r"); //loop: fscanf(pFile, "%d %d %d", &num1, &num2, &num3); ... αλλαγή γραμμής //end loop fclose(pFile);
migf1 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Δεν μπορώ να καταλάβω πως γίνεται η αλλαγή γραμμής σε αρχείο στην C :/ Αρχείο: 1 2 3 1 2 3 3 4 5 5 6 7 > FILE * pFile; pFile = fopen ("database.txt" , "r"); //loop: fscanf(pFile, "%d %d %d", &num1, &num2, &num3); ... αλλαγή γραμμής //end loop Η fscanf() έχει πολλές ιδιαιτερότητες, προσωπικά την αποφεύγω όπου μπορώ. Στο συγκεκριμένο παράδειγμα, εφόσον το αρχείο σου είναι σαφώς δομημένο με 3 νούμερα ανά γραμμή, δοκίμασε με fgets() και sscanf()... > char line[ 128 ] = {'\0'}; // loop if ( fgets( line, 128, pFile) ) sscanf( line, "%d %d %d", &n1, &n2, &n3 ); // loop
Star_Light Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 @migf1 & defacer ευχαριστω για τον χρονο και τις επισημάνσεις σας Ειναι αλήθεια πως ειναι προαιρετικό το ορισμα με το μήκος ενος πινακα για να το περνας σε μια συνάρτηση οταν ειναι fixed size και οχι VLA ... μπορει να σε σώσει απο λάθη ομως. Τελοςπαντων. @migf1 κατι που ακομη δυσκολεύομαι να χωνέψω ειναι το πως ρε παιδι μου και χρειαζεσαι το προσθετο validation macro για να κανεις τον έλεγχο? Αφου απευθειας το MAXELEMS ειναι defined σαν σταθερα και το 2ο ορισμα της συνάρτησης maxelems αντικαθισταται με το 100... δηλαδη ποιος θα αλλάξει την κληση της συνάρτησης??? Θα την βαλει πχ foo(arr, 200); για ποιο λογο... μου φαινεται λιγο περιττος ο ελεγχος απο την στιγμη που δεν υπάρχει εισοδος απο τον χρηστη . Δεν ειναι VLA ... Tι πιστευετε?
παπι Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Eγώ την loop που θα αλλάζει γραμμή δεν ξέρω Εφοσον εχεις καλεσει την fscanf ο file ptr εχει ηδη μετακινηθει
migf1 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 @migf1 & defacer ευχαριστω για τον χρονο και τις επισημάνσεις σας Ειναι αλήθεια πως ειναι προαιρετικό το ορισμα με το μήκος ενος πινακα για να το περνας σε μια συνάρτηση οταν ειναι fixed size και οχι VLA ... μπορει να σε σώσει απο λάθη ομως. Τελοςπαντων. @migf1 κατι που ακομη δυσκολεύομαι να χωνέψω ειναι το πως ρε παιδι μου και χρειαζεσαι το προσθετο validation macro για να κανεις τον έλεγχο? Αφου απευθειας το MAXELEMS ειναι defined σαν σταθερα και το 2ο ορισμα της συνάρτησης maxelems αντικαθισταται με το 100... δηλαδη ποιος θα αλλάξει την κληση της συνάρτησης??? Θα την βαλει πχ foo(arr, 200); για ποιο λογο... μου φαινεται λιγο περιττος ο ελεγχος απο την στιγμη που δεν υπάρχει εισοδος απο τον χρηστη . Δεν ειναι VLA ... Tι πιστευετε? Περιττό είναι το validation-macro στον λιτό τρόπο... μου ξέφυγε εκ παραδρομής. Δεν χρειάζεσαι καθόλου macro στον λιτό τρόπο, αφού γράφεις απευθείας: for (int i=0; i < MAX_ELEMS; i++) ... δεν υπάρχει περίπτωση να κάνεις ποτέ μπουμ έτσι, ότι και να ορίσεις ως MAX_ELEMS, με την προϋπόθεση πως ορίζεις και το arr να έχει MAX_ELEMS στοιχεία: int arr[ MAX_ELEMS]. Τώρα, όταν εισαγάγεις το μήκος του arr ως όρισμα στην συνάρτηση, τότε έχει νόημα ο έλεγχος μέσα στην συνάρτηση ως good-practice, γιατί σε μεγάλα projects μπορεί να σου ξεφύγει και να περάσεις αντικανονική τιμή στην κλήση της συνάρτησης (π.χ. αρνητική ή μεγαλύτερη από MAX_ELEMS). Ειδικά αν το όρισμα το περνάς υπό μορφή μεταβλητής που μπορεί κατά λάθος να έχει αντικανονική τιμή. Eγώ την loop που θα αλλάζει γραμμή δεν ξέρω Για αυτό σου είπα έχει ιδιαιτερότητες η fscanf()... πρέπει να μεριμνήσεις ειδικά για την αλλαγή γραμμής (αλλά δεν θυμάμαι τώρα απέξω τι πρέπει να βάλεις στο format string της για να αγνοεί τα \n... όπως σου είπα την αποφεύγω, γιατί είναι error-prone). Αντίθετα, με την fgets() είναι εγγυημένο πως όταν πετύχει έχει διαβάσει και το '\n' και έχει πάει τον file-descriptor στην αρχή της επόμενης γραμμής.
defacer Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Η δική σου ιδέα για το private είναι να κάνεις expose το μήκος του arr ως όρισμα στις συναρτήσεις; Όχι, είναι να τα βάλω σε ένα struct όπως ίσως θα παρατηρήσεις αν ξαναδεις τι έγραψα νωρίτερα. Το μήκος του arr σαν όρισμα το έγραψα "αναγκαστικά" γιατί αν δεν έδινα αυτή την εναλλακτική θα βρισκόταν (λέω εγώ) κάποιος καλοθελητής να πει ότι "δε χρειάζονται αυτά στη C", "μια χαρά κάνεις τη δουλειά σου και αλλιώς" κλπ. Βέβαια και τώρα που την έδωσα πάλι δεν απέφυγα τα σχόλια αλλά c'est la vie. Όσο για τα υπόλοιπα, ευχαριστώ πολύ για το μάθημα του αν υποστηρίζει η C και τι πράγμα αλλά δεν ήταν ανάγκη. Ακριβώς επειδή δεν υποστηρίζει τίποτα, το encapsulation για μένα είναι να τα βάλεις μέσα σε ένα struct και να πεις "παιδιά το struct αυτό το πειράζουν μόνο οι συναρτήσεις μου και τους υπόλοιπους δε σας ενδιαφέρει τι έχει μέσα". Κάτι που γίνεται περίπου σε ένα τρισεκατομμύριο give or take προγράμματα C πάνω στον πλανήτη. Θα είναι ίσως μακρύς ο δρόμος σου μέχρι να τους διαφωτίσεις όλους αυτούς ότι το κάνουν λάθος, αλλά take heart ότι σε μένα τα είπες ήδη. One down.
migf1 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 ... Βέβαια και τώρα που την έδωσα πάλι δεν απέφυγα τα σχόλια αλλά c'est la vie. Όσο για τα υπόλοιπα, ευχαριστώ πολύ για το μάθημα του αν υποστηρίζει η C και τι πράγμα αλλά δεν ήταν ανάγκη. Ακριβώς επειδή δεν υποστηρίζει τίποτα, το encapsulation για μένα είναι να τα βάλεις μέσα σε ένα struct και να πεις "παιδιά το struct αυτό το πειράζουν μόνο οι συναρτήσεις μου και τους υπόλοιπους δε σας ενδιαφέρει τι έχει μέσα". Κάτι που γίνεται περίπου σε ένα τρισεκατομμύριο give or take προγράμματα C πάνω στον πλανήτη. Θα είναι ίσως μακρύς ο δρόμος σου μέχρι να τους διαφωτίσεις όλους αυτούς ότι το κάνουν λάθος, αλλά take heart ότι σε μένα τα είπες ήδη. One down. Δεν απέφυγες τα σχόλια γιατί κατά την προσφιλή σου τακτική προσπαθείς να κάνεις discredit οτιδήποτε διαφορετικό από αυτό που γράφεις εσύ. Και οι 2 τρόποι είναι απόλυτα θεμιτοί και εξίσου χρησιμοποιούμενοι, με συγκεκριμένα + και -. EDIT: Επίσης η αναφορά του encapsulation σε νήμα της C ως "επιχείρημα" είναι εξαρχής καταδικασμένο να δημιουργήσει σχόλια.
παπι Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Ακριβώς επειδή δεν υποστηρίζει τίποτα, το encapsulation για μένα είναι να τα βάλεις μέσα σε ένα struct και να πεις "παιδιά το struct αυτό το πειράζουν μόνο οι συναρτήσεις μου και τους υπόλοιπους δε σας ενδιαφέρει τι έχει μέσα". Κάτι που γίνεται περίπου σε ένα τρισεκατομμύριο give or take προγράμματα C πάνω στον πλανήτη. Επισης το struct στο api ειναι αδειο
Προτεινόμενες αναρτήσεις