Εργαστήριο Τεχνολογίας Λογισμικού
+3 votes
389 views

Όταν έχω ορίσει ένα τύπο με enum, π.χ.

enum colour {red, green, blue};

μπορώ κάπως να διαβάζω τιμές αυτού του τύπου; Π.χ.

int main () {
  colour x;
  cin >> x;        // ο χρήστης δίνει την τιμή 1
  cout << x + 1;   // το πρόγραμμα τυπώνει blue ?
}

Εμένα δεν μου μεταφράζει καν το αρχείο ο compiler αν το γράψω έτσι.

(Edit: Προστέθηκαν μερικά semicolons που έλειπαν.)

in progintro by (180 points)
edited by | 389 views
0

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

0

Το πρόβλημα πιθανότατα είναι το cin σε enum. Λείπει και ένα semicolon (cout<<x+1) αλλά αυτό ίσως έγινε στη μεταφορά του κώδικα στο Q&A.

1 Answer

+3 votes

Τα enums είναι αριθμοί "ντυμένοι" με ονόματα μόνο εντός του κώδικα.

Απο εκεί και έπειτα τα προγράμματα χειρίζονται τα enums ακριβώς όπως τους αριθμούς (σαν unsigned ints στις περισσότερες περιπτώσεις).

Υπάρχουν πολλοί τρόποι να τυπώνεις ονόματα enums, ο πιο απλός για εμένα είναι το να κρατάς ένα array από strings (όπου η θέση 0 αντιστοιχεί στο όνομα της πρώτης τιμής) και να κάνεις κάτι σαν:
cout << arrayOfNames[blue] << endl; για να τυπώσεις "blue".

by (3.0k points)
edited by
0

Αν δεν κάνω λάθος είναι τουλάχιστον int. Με κάποιος complier να έχουν την επιλογη να το κάνουν packed, ώστε να πιανει οσο το δυνατον λιγότερα bits (με το μικρό πεναλτι που αυτό εχει). Το standard δεν ορίζει κάτι, απλα πρέπει να χωράει όλα τα στοιχεία.

0

απ'όσο ξέρω η default συμπεριφορά είναι να κάνουν cast σε unsigned int (όταν αυτό είναι δυνατό -- μπορείς να κάνει διάφορα τρελά με enums).

Τουλάχιστον αν τα χρησιμοποιείς με τον παραπάνω τρόπο (ονόματα με αρίθμηση από το 0) τότε σχεδόν πάντα θα γίνεται unsigned int

0

Αυτό είναι το θέμα, δεν υπάρχει default, o κάθε compiler κάνει ότι του αρέσει, απο την στιγμή που το standard λεει "αρκει να χωράει".

0

σωστά

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

αν σε κάποια φάση χρειαστεί υποχρεωτικά να αντιστοιχήσεις ints / enums καλό θα ήταν να κάνεις ένα ωραίο explicit cast

0

Εκτός αν δηλώσεις τον τύπο (c++03)που τα enum μπορεί να είναι strongly typed

301 questions

289 answers

288 comments

903 users