Συνέταξα αυτό τον κώδικα σε μια προσπάθεια να αποφύγω (για εκπαιδευτικούς λόγους) την χρήση switch για την κλήση διάφορων συναρτήσεων, με την χρήση function pointers. Τους έχω αποθηκεύσει λοιπόν σε ένα vector:
Spoiler:
Αμέσως μετά (και εδώ θέλω βοήθεια*), αποθηκεύω τους πιθανούς operators σε ένα ακόμη vector, έτσι ώστε να υπάρχει άμεση αντιστοιχία των function pointer με τους operators.
Spoiler:
Πιο κάτω συνεχίζω και διαβάζω την είσοδο του χρήστη:
Spoiler:
Δεν έμειναν πολλά να γίνουν εκτός από το να βρεθεί σε ποια θέση είναι ο οp(erator) για να αντιστοιχηθεί σωστά η συνάρτηση.
Spoiler:
*Ερώτηση 1η: Μπορεί να αντικατασταθεί το vector των operator με έναν απλό enum; Δυστυχώς ο κάτωθι κώδικας είναι λάθος:
Spoiler:
οπότε το std::vector είναι η μόνη μου λύση ως τώρα.
Ερώτηση 2η: Μπορεί αντί για τόσα vector να χρησιμoποιηθεί το table-driven μοντέλο και να υπάρχουν εντός ενός array/vector οι αντιστοιχίες των operator με τους function pointers απο δίπλα; Έχει κανείς εμπειρία;
Σημείωση : Τυχόν ημιτελή μυνήματα προς το χρήστη δεν απασχολούν ιδιαίτερα.
Όλος ο κώδικας :
Spoiler:
Εμφάνιση 1-5 από 5
-
27-11-18, 18:37 Βελτίωση παραδείγματος με χρήση table-driven προγραμματισμού και enum αντί για std::vector #1Με ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
-
27-11-18, 19:19 Απάντηση: Βελτίωση παραδείγματος με χρήση table-driven προγραμματισμού και enum αντί για std::vector #2
Αν χρησιμοποιείς C++11 μπορείς να κάνεις:
Κώδικας:enum class Section : char { PLUS = '+', MINUS = '-', MULT = '*', DIV = '/' };
Στην ουσία είναι σαν ένας πίνακας που αντί για θέσεις 0,1,2,... έχει ότι του πεις εσύ και ότι τύπου θέλεις. Είναι map από μία τιμή σε μία άλλη:
Κώδικας:std::map<char, fncptr_t> first; first['+'] = &add; first['-'] = ⊂ first['*'] = &mul; first['/'] = &div_;
-
27-11-18, 20:07 Απάντηση: Βελτίωση παραδείγματος με χρήση table-driven προγραμματισμού και enum αντί για std::vector #3
Στην προσπάθεια να αποφύγω το vector, δεν σκέφτηκα ένα καλύτερο container σε σχέση με την c-ίτιδα που χαρακτήριζε την δική μου (table-driven) λύση. Πολύ εύστοχη η ιδέα σου και πολύ πιο ...c++ φυσικά.
Την πρώτη λύση με το enum την βρήκα και εγώ αλλά ήθελα απευθείας τους operators να είναι συσχετισμένοι με integers. Ευχαριστώ όμως, βοήθησεςΜε ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
-
27-11-18, 22:21 Απάντηση: Βελτίωση παραδείγματος με χρήση table-driven προγραμματισμού και enum αντί για std::vector #4
Ίσως καταλαβαίνω κάτι λάθος από αυτό που θέλεις να κάνεις αλλά αν θέλεις οι operator να είναι συσχετισμένοι με integer τότε απλά κάντους cast σε unsigned int.
Κώδικας:cout << "+ = " << (unsigned int) '+' << endl; cout << "- = " << (unsigned int) '-' << endl; cout << "* = " << (unsigned int) '*' << endl; cout << "/ = " << (unsigned int) '/' << endl;
Κώδικας:#include <iostream> #include <string> #include <map> using namespace std; enum operation { PLUS = (int)'+', MINUS = (int)'-', MULTIPLY = (int)'*', DIVIDE = (int)'/', }; int main() { map<peration, string> actions; actions[PLUS] = "addition"; actions[MINUS] = "reduction"; actions[MULTIPLY] = "Multiplication"; actions[DIVIDE] = "division"; char c = '+'; Test op = static_cast<Test>(c); cout << actions[op]; }
-
28-11-18, 14:04 Απάντηση: Βελτίωση παραδείγματος με χρήση table-driven προγραμματισμού και enum αντί για std::vector #5
Πιο βαθύ μπλέξιμο μου φαίνεται. Είναι πολύ κομψή και to the point η χρήση του std::map. Έδωσες '+', επιστρέφεται ο δείκτης για την συνάρτηση που το συσχέτισες και με τον operator () εκτελείται αυτό που δείχνει. Dead simple.
Είναι παρόλα αυτά μια τεχνική που δεν είχα σκεφτεί ούτε ήξερα. 'Ν'ν' κακό...Με ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
Παρόμοια Θέματα
-
Το FBI ανάγκασε υπόπτο να ξεκλειδώσει την συσκευή του με χρήση του Face Id
Από sdikr στο φόρουμ ΕιδήσειςΜηνύματα: 18Τελευταίο Μήνυμα: 05-10-18, 11:35 -
Συγχρονιζει σε ADSL αντι για VDSL.
Από AlexTselikas στο φόρουμ Vodafone VDSLΜηνύματα: 10Τελευταίο Μήνυμα: 31-03-18, 00:19 -
Πολύ σοβαρό κενό ασφαλείας του Skype θα αντιμετωπιστεί με πλήρη νέα έκδοση αντί για patch
Από nnn στο φόρουμ ΕιδήσειςΜηνύματα: 51Τελευταίο Μήνυμα: 23-03-18, 16:17 -
Elastix 4 ήχος μουσικής αντί για ring
Από Marios30 στο φόρουμ Voice over IP (VoIP) SoftwareΜηνύματα: 19Τελευταίο Μήνυμα: 03-12-17, 10:19
Bookmarks