migf1 Δημοσ. 14 Σεπτεμβρίου 2012 Δημοσ. 14 Σεπτεμβρίου 2012 Καλησπέρα, το con_color.h είναι ένα μικρό C/C++ pre-processor interface, για χρωματιστή έξοδο είτε στην κονσόλα των Windows, είτε σε ANSI-sequences aware τερματικό (κοινός τόπος σε Unix/Linux συστήματα), χωρίς να χρειάζεται να αλλάξει ο κώδικας των προγραμμάτων που το χρησιμοποιούν. Αποτελείται από μόλις 5 high-level macros και μερικές σταθερές για τα χρώματα (παρέχει και 2 πρόσθετους τύπους δεδομένων, αλλά η χρήση τους είναι απλύτως προαιρετική). Για παράδειγμα, το κλασικό "hello world" με την 1η λέξη κίτρινη σε μαύρο φόντο και τη 2η άσπρη σε κόκκινο φόντο, γράφεται κάπως έτσι... > #include <stdio.h> #include "con_color.h" int main( void ) { CONOUT_INIT(); // save console's current color state CONOUT_PRINTF( FG_YELLOW, BG_BLACK, "hello " ); CONOUT_PRINTF( FG_WHITE, BG_RED, "world" ); putchar('\n'); // newline in non-color mode CONOUT_RESTORE(); // restore console's original color state system("pause"); // Windows only (comment it out on other platforms) return 0; } και (hopefully) γίνεται compile χωρίς καμία περαιτέρω αλλαγή σε οποιαδήποτε πλατφόρμα. Έξοδος: Το έχω χρησιμοποιήσει επιτυχώς τόσο στον επίσης cross-platform Console HexViewer που είχα φτιάξει παλαιότερα, όσο και στο πιο πρόσφατο cross-platform CV Poker, αλλά του έκανα κάτι ψιλές βελτιώσεις και το ανέβασα στην σελίδα μου: http://x-karagiannis...sc/con_color-h/ Η σελίδα περιέχει αναλυτικές οδηγίες, παραδείγματα, bugs, κλπ. Για παράδειγμα, σε Windows έχει πρόβλημα με τις χρωματικές σταθερές FG_NOCHANGE και BG_NOCHANGE, οπότε είναι καλό να αποφεύγονται μέχρι να το διορθώσω (εαν και όταν). Νομιζω έχω περιπλέξει αχρείαστα τον εσωτερικό κώδικα που ασχολείται με τα Windows μέσω του Win32 API, οπότε κάπου πρέπει να μου έχει ξεφύγει κάτιι. Μάλλον θα πρέπει να επανεξετάσω από την αρχή όλο το κομμάτι που χρησιμοποιεί το Win32 API. Αν αποφύγετε όμως τη χρήση αυτών των σταθερών δεν δείχνει να έχει κάποιο άλλο θέμα! Σε Posix περιβάλλοντα δείχνει να μην έχει καθόλου πρόβλημα. Αν κάποιος έχει πρόσβαση σε Macntosh θα εκτιμούσα να μου δώσει feedback για το αν δουλεύει ή όχι όπως είναι, ή αν δεν δουλεύει τοτε τι πρόβλημα παρουσιάζει (δυστυχώς δεν έχω πρόσβαση σε Mac για να το δοκιμάσω μόνος μου). Have fun & thanks in advance 5
ChRis6 Δημοσ. 15 Σεπτεμβρίου 2012 Δημοσ. 15 Σεπτεμβρίου 2012 Πολυ ωραιο migf1.Μονο που δεν κανει compile σε mac.Ξεχασες το define(__APPLE__) στο: #elif .... #define CON_COLOR_ANSI #endif γραμμη 71 compile με gcc Ετρεξα το παραδειγμα που εχεις δωσει και ειναι αψογο
IHateLove Δημοσ. 16 Σεπτεμβρίου 2012 Δημοσ. 16 Σεπτεμβρίου 2012 καλό για δείγμα στην εύρεση δουλειάς, σχεδόν αχρείαστο όμως (Αν πιάσεις δουλειά δημόσιο τότε είναι χρήσιμο, εκεί είναι ακόμα με τις κονσόλες...) Γενικά να επισημάνω ότι πολύ καλό, έχεις φτιάξει μια δικιά σου "πλατφόρμα να το πούμε", αυτό είναι καλό, δείχνει ότι ξέρεις μερικά πράγματα και δεν έχεις μείνει στο cout. cout αντί printf, ε τώρα printf, ... ;έχει παλιώσει @#$%^&
migf1 Δημοσ. 17 Σεπτεμβρίου 2012 Μέλος Δημοσ. 17 Σεπτεμβρίου 2012 Ευχαριστώ πάρα πολύ για το feedback παιδιά! @bokarinho: Ευχαριστώ για τα καλά λόγια! Με χαλάει πολύ όμως το bug με τα xx_NOCHANGE στα Windows. Θα το φτιάξω όμως, ενδεχομένως να το κάνω και type_safe το interface μοιράζοντας και .c αρχείο μαζί με το .h (ώστε να γίνεται compiled μαζί με τα .c του όποιου project). @Chris: Έχεις απόλυτο δίκιο ευχαριστώ! Αρκεί όμως το __APPLE__ ή μήπως θέλει ... > .. || ( defined( __APPLE__) && defined(__MACH__) ) ώστε να περιορίζεται μονάχα σε OSX? Διαβάζω επίσης εδώ: http://sourceforge.n...g_Systems#MacOS πως για OSX θέλει... > || defined( __APPLE__ & __MACH__ ) αλλά δεν είμαι σε θέση να το επιβεβαιώσω/διαψεύσω. Επίσης, πάντα σύμφωνα με το παραπάνω link, μήπως πρέπει να προστεθεί και το... > || defined( macintosh ) || defined( Macintosh ) ώστε να πιάνει και Mac OS9? Υποστηρίζει ANSI sequences στην κονσόλα του το OS9? Διαβάζω επίσης στο google πως το __APPLE__ είναι predefined σε οποιονδήποτε Apple, οπότε μήπως πιάνει και αρχαιολογίες τύπου Aplle IIc, Lisa, κλπ? Αν ναι, τότε ίσως να μην είναι καλύτερα να βάλω μονάχα τα Mac specific. @IHateLove: Εντάξει, δεν την λες και "πλατφόρμα"¨. Ευχαριστώ πάντως. Δεν είναι κάτι το δύσκολο, γράφτηκε σε 2-3 ώρες αν το θυμάμαι καλά. Το είχα γράψει στα πλαίσια του CC HexView επειδή δεν είχα βρήκα κάτι παρόμοιο που να είναι απλό και cross-platform (κα προφανώς ήθελα να αποφύγω βιβλιοθήκες τύπου curses ή/και οποιας μετεξέλιξής της). http://www.tiobe.com...tpci/index.html
ChRis6 Δημοσ. 17 Σεπτεμβρίου 2012 Δημοσ. 17 Σεπτεμβρίου 2012 @migf1 Στο μηχανημα εχω Snow leopard.Για OS9 δεν ξερω να σου απαντησω Το: > .. || ( defined( __APPLE__) && defined(__MACH__) ) Δουλευει μια χαρα. Το: > || defined( __APPLE__ & __MACH__ ) Δεν δουλευει
migf1 Δημοσ. 17 Σεπτεμβρίου 2012 Μέλος Δημοσ. 17 Σεπτεμβρίου 2012 (επεξεργασμένο) @migf1 Στο μηχανημα εχω Snow leopard.Για OS9 δεν ξερω να σου απαντησω Το: > .. || ( defined( __APPLE__) && defined(__MACH__) ) Δουλευει μια χαρα. Το: > || defined( __APPLE__ & __MACH__ ) Δεν δουλευει Χρήστο ευχαριστώ και πάλι! Για όποιον ενδιαφέρεται μόλις βρήκα κι αυτό (δείχνει σοβαρό και ενημερωμένο): http://nadeausoftwar...pleMacOSXandiOS Λοιπόν, το πρόβλημα 99.99% οφείλεται στα low-level macros... > CONOUT_SET_COLOR(fg) CONOUT_ADD_COLOR(bg) Το 1ο θέτει απευθείας το csbiCurrent.wAttributes ίσο με (fg) οπότε σύμφωνα με την τεκμηρίωση του Win32 API το background γίνεται αυτόματα μαύρο (μιας και το fg δεν περιέχει πληροφορίες για το background). Υποτίθεται πως φτιάχνει όταν ΑΜΕΣΩΣ ΜΕΤΑ καλεστεί το 2ο macro, το οποιο κάνει OR την τρέχουσα τιμή του csbiCurrent.wAttributes (που περιέχει το fg) με το (bg). Αλλά γίνεται πατάτα! Πιστεύω οφείλεται στις predefined τιμή 0xFF που βάζω στα xx_NOCHANGE σε συνδυασμό με τις predefined τιμές του Win32 API για τα χρώματα της κονσόλας. Δοκίμασα τις τιμές των xx_NOCHANGE να τις αλλάξω από 8μπιτες 0xFF σε 16μπιτες 0xFFFF μιας και οι σταθερές του Win32 API είναι 16μπιτες(όπως είναι και το wAttributes), αλλά το πρόβλημα παραμένει. Ο λόγος που κάνω το fg assign στο wAttributes με το CONOUT_SET_COLOR(fg) και κατόπιν κάνω πάνω του OR το bg στο CONOUT_SET_COLOR(bg) είναι πως δεν έχω προφανή τρόπο να διαχωρίζω τα xx_NOCHANGE από τα υπάρχοντα χρώματα. Αν είχα, θα μπορούσα να τα συγκρίνω απευθείας με το 16μπιτο wAttributes με bitwise AND. Ας το πάρουμε λίγο με τη σειρά, οι χρωματικές σταθερές του Win32 API για τη κονσόλα ορίζονται στο <wincon.h> ως εξής: > #define FOREGROUND_BLUE 0x0001 #define FOREGROUND_GREEN 0x0002 #define FOREGROUND_RED 0x0004 #define FOREGROUND_INTENSITY 0x0008 #define BACKGROUND_BLUE 0x0010 #define BACKGROUND_GREEN 0x0020 #define BACKGROUND_RED 0x0040 #define BACKGROUND_INTENSITY 0x0080 Ουσιαστικά δηλαδή το fg ορίζεται στο low nibble του low byte του 16μπιτου wAttributes, και το bg στο high nibble (τα Windows είναι πάντα little-endian). Δηλαδή το high-byte μένει unused (ή εν πάσει περιπτώσει δεν μας ενδιαφέρει τι περιέχει). Οι χρωματικές σταθερές του interface (όταν πρόκειται για Win πλατφόρμα) ορίζονται με χρήση των παραπάνω, ως εξής: > #define BG_BLACK 0x0000 #define BG_WHITE \ (BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_INTENSITY) #define BG_GRAY (BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE) #define xx_DARKGRAY (BACKGROUND_INTENSITY) #define BG_RED (BACKGROUND_RED|BACKGROUND_INTENSITY) #define BG_DARKRED (BACKGROUND_RED) #define BG_GREEN (BACKGROUND_GREEN|BACKGROUND_INTENSITY) #define BG_DARKGREEN (BACKGROUND_GREEN) #define BG_BLUE (BACKGROUND_BLUE|BACKGROUND_INTENSITY) #define BG_DARKBLUE (BACKGROUND_BLUE) #define BG_YELLOW (BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_INTENSITY) #define BG_DARKYELLOW (BACKGROUND_RED|BACKGROUND_GREEN) #define BG_MAGENTA (BACKGROUND_RED|BACKGROUND_BLUE|BACKGROUND_INTENSITY) #define BG_DARKMAGENTA (BACKGROUND_RED|BACKGROUND_BLUE) #define BG_CYAN (BACKGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_INTENSITY) #define BG_DARKCYAN (BACKGROUND_GREEN|BACKGROUND_BLUE) (και αντιστοιχα τα FG_ για το fg) Το θέμα που προκύπτει είναι με ποια τιμή πρέπει να κάνω pre-define τις xx_NOCHANGE ώστε να διαχωρίζονται από οποιονδήποτε άλλο πιθανό συνδυασμό; Αφήνοντάς τες είτε 0xFF (ισοδύναμο με 0x00FF) είτε 0xFFFF είναι σαν να λέω πως έχω λευκό κείμενο σε λευκό φόντο... > HiNibble( LOBYTE(wAttributes) ) == 111 + αναμμένo τo intensity bit LoNibble( LOBYTE(wAttributes) ) == 111 + αναμμένo τo intensity bit δηλαδή FG_WHITE σε BG_WHITE. Αυτό δημιουργεί πρόβλημα σε συναρτήσεις/macros που επιχειρούν να συγκρίνουν κάποιο από τα xx_NOCHANGE με το wAttributes. Ας πούμε, μια low-level συνάρτηση (ή macro) που επιχειρεί να "τραβήξει" το τρέχον fg μέσα από το wAttributes (ας πούμε για να το σώσει πριν το αλλάξει, ώστε να το επαναφέρει αν αποτύχει η ενεργοποίηση του), του στυλ... > /* ------------------------------------------------------- * * ------------------------------------------------------- */ static WORD xtract_fg_from( WORD from ) { if ( FG_WHITE == (from & FG_WHITE) ) return FG_WHITE; if ( FG_GRAY == (from & FG_GRAY) ) return FG_GRAY; if ( FG_RED == (from & FG_RED) ) return FG_RED; if ( FG_DARKRED == (from & FG_DARKRED) ) return FG_DARKRED; if ( FG_GREEN == (from & FG_GREEN) ) return FG_GREEN; if ( FG_DARKGREEN == (from & FG_DARKGREEN) ) return FG_DARKGREEN; if ( FG_BLUE == (from & FG_BLUE) ) return FG_BLUE; if ( FG_DARKBLUE == (from & FG_DARKBLUE) ) return FG_DARKBLUE; if ( FG_YELLOW == (from & FG_YELLOW) ) return FG_YELLOW; if ( FG_DARKYELLOW == (from & FG_DARKYELLOW) ) return FG_DARKYELLOW; if ( FG_MAGENTA == (from & FG_MAGENTA) ) return FG_MAGENTA; if ( FG_DARKMAGENTA == (from & FG_DARKMAGENTA) ) return FG_DARKMAGENTA; if ( FG_CYAN == (from & FG_CYAN) ) return FG_CYAN; if ( FG_DARKCYAN == (from & FG_DARKCYAN) ) return FG_DARKCYAN; /* must be checked last */ if ( FG_DARKGRAY == (from & FG_DARKGRAY) ) return FG_DARKGRAY; if ( FG_BLACK == (from & FG_BLACK) ) return FG_BLACK; return FG_NOCHANGE; } όταν της περάσουμε το from με τιμή FG_NOCHANGE (είτε ως 0x00FF είτε ως 0xFFFF) αποτυγχάνει να επιστρέψει FG_NOCHANGE, αφού το low nibble του from είναι ήδη F (0001111), δηλαδή FG_WHITE. Και προφανώς επιστρέφει FG_WHITE. Ομοίως και σε αντιστοιχη ρουτίνα για το background, με όρισμα BG_NOCHANGE (που επιστρέφει BG_WHITE). Επίσης, και οι 2 ρουτίνες επιστρέφουν xx_DARKGRAY αν το όρισμα from είναι οποιοδήποτε χρώμα έχει αναμμένο το intensity bit του. Και τέλος, ο έλεγχος για xx_BLACK πρέπει υποχρεωτικά να γίνεται τελευταίος, διότι επιστρέφει πάντα xx_BLACK για οποιοδήποτε χρώμα ( x & 0 = 0 ). Αυτό που δεν έχω δοκιμάσει ακόμα είναι οι xx_NOCHANGE ορισμένες ως 0xFFFF και κατόπιν στις ρουτίνες σύγκρισης με το wAttributes να επιστρέφω αμέσως xx_NOCHANGE όταν το ΗΙΒΥΤΕ(from) ισούται με FF. ΥΓ. Τώρα που το ξανα-σκέφτομαι, αυτό το τελευταίο πρέπει να είναι η λύση!!!!! Πάω στο σπίτι να το δοκιμάσω. Αφήνω και το κατεβατό που έγραψα, σε περίπτωση που είτε ενδιαφέρει κάποιον, είτε δεν μου δουλέψει αυτό με το HIBYTE(from). EDIT: Διόρθωσα κάποια λάθη που είχα στο ποστ και σε ορσμένα σημεία δεν έβγαζε νόημα (πάω σπίτι να δοκιμάσω το HIBYTE) Επεξ/σία 17 Σεπτεμβρίου 2012 από migf1
migf1 Δημοσ. 18 Σεπτεμβρίου 2012 Μέλος Δημοσ. 18 Σεπτεμβρίου 2012 Έχω μπλέξει τα μπούτια μου Θα το βγάλω όμως, που θα μου πάει;
migf1 Δημοσ. 21 Σεπτεμβρίου 2012 Μέλος Δημοσ. 21 Σεπτεμβρίου 2012 Ευχαριστώ Κώστα, αργότερα θα ανεβάσω εδώ έκδοση 1.04 alpha για να την δοκιμάσει όποιος θέλει για τυχόν bugs, πριν την "επισημοποιήσω" (νομίζω κάτι κατάφερα).
migf1 Δημοσ. 27 Σεπτεμβρίου 2012 Μέλος Δημοσ. 27 Σεπτεμβρίου 2012 (επεξεργασμένο) Επειδή έτσι όπως το πάω δεν πρόκειται να το ποστάρω ποτέ (γιατί το αλλάζω συνέχεια ) ποστάρω ότι έχω μέχρι τώρα ... το οποίο btw δεν έχει πλέον καμία σχέση με τις προηγούμενες εκόδσεις Αμέσως-αμέσως είναι πλέον 2 αρχεία αντί για ένα, το στάνταρ con_color.h (που είναι αρκετά σουλουπωμένο) και ένα νέο, το con_color_private.h (που πολλά μέρη του είναι ακόμα χύμα). Ουσιαστικά διαχώρισα το public inetrface από το private implemetation. Πρέπει να έχετε και τα 2 αρχεία διαθέσιμα όταν κάνετε compile, αλλά στους κώδικές σας χρειάζεται #include μονάχα το con_color.h (το οποίο κάνει include και το private). Download: con_color_104h_alpha_public.zip Documentation: http://x-karagiannis...con_color/html/ (στα Αγγλικά) Τόσο ο κώδικας όσο και η τεκμηρίωση θέλουν ακόμα αρκετή (έως πολλή δουλειά) αλλά περιέχουν ήδη και αρκετά (έως πολλά). Η κεντρική σελίδα της τεκμηριωσης παρουσιάζει βασικές οδηγίες χρήσης συνοπτικά, ενός η ενότητα Modules (στο μενού) περιέχει την τεκμηρίωση όλων των στοιχείων του interface, κατηγοριοποιημένα ανά είδος. Δίνει και λίγο πιο τεχνικό info, αλλά σε καμία περίπτωση δεν αποτελεί τεκμηρίωση της private υλοποίησης. Δεν πρόκειται για ας την πούμε επίσημη έκδοση, μιας και θέλει δουλειά ακόμα. Είναι όμως νομίζω πλήρως λειτουργική κι αν την δοκιμάσει κανείς είτε για πλάκα είτε σε πιο σοβαρό πρότζεκτ θα το εκτιμούσα αν μου έδινε feedback για τυχόν bugs, ατεκμηρίωτες ασυμβατότητες, κλπ. Μέσα στο ζιπ έχω κι έναν φάκελο examples με κώδικες (και Windows εκτελέσιμα) από 2 προγράμματα που έφτιαξα στα γρήγορα ως μικρά demos του interface (EDIT: έβαλα κάποια σχόλια μην περιμένετε να έχουν σχόλια, κλπ ) To ένα που λέγεται con_tree σχεδιάζει ένα τρίγωνο (κάτι σαν δέντρο) και σας δίνει το δυνατότητα να του αλλάξετε χρώματα, θέση και ύψος. Δεν το κάνει με buffered graphics, αλλα με κατευθείαν τύπωμα στην οθόνη. Το άλλο, το con_cycle κάνει cycle στην οθόνη όλα τα διαθέσιμα fg και bg χρώματα, χρησιμοποιώντας μονάχα μια γραμμή ανά background. ScreenShots con_tree con_cycle Και τα 2 περιέχουν αρκετά χαρακτηριστικές λειτουργίες του con_color.h, οι οποίες όμως ίσως δεν γίνονται όλες άμεσα αντιληπτές αν δεν έχει διαβαστεί πρώτα η τεκμηρίωση. Όπως για παράδειγμα η χρήση του interface για κατ'επιλογή compilation τμημάτων του κώδικα (με τα λεγόμενα SYSTEM CONSTANTS στην τεκμηρίωση). Όπως και να 'χει, αν του ρίξετε καμια ματιά "σφυρίξτε" τυχόν προβλήματα που θα συνατήσετε. Έτσι κι αλλιώς δεν πρόκειται για τελική έκδοση... μονάχα εδώ την έχω ποστάρει δοκιμαστικά. EDIT: Ξανα-ανέβασα το ζιπ, με τους κώδικες των examples να περιέχουν περισσότερα σχόλια. Επεξ/σία 27 Σεπτεμβρίου 2012 από migf1
migf1 Δημοσ. 30 Σεπτεμβρίου 2012 Μέλος Δημοσ. 30 Σεπτεμβρίου 2012 Παρόλο που δεν βλέπω να ασχολείται κανείς (εκείνο το 1 download στο προηγούμενο ποστ είναι δικό μου) έβαλα μερικά πραγματάκια ακόμα, και προσθεσα περισσότερο περιεχομενο στο documentation. Από τις σημαντικότερες αλλαγές είναι πως το interface: κάνει fall-back σε no-colors mode αν δεν εντοπίσει κάποια από τις υποστηριζόμενες πλατφόρμες, αν και με τελείως άκομψο τρόπο προς το παρόν... δηλαδή σε τελείως ξεχωριστό #ifdef directive από τα υπόλοιπα (το έκανε και πριν, στην 1.04h) υποστηρίζει και wide-character output (απλώς μερικοί wrappers τω βασικών συναρτήσεων εξόδου του <wchar.h>... please test them αν βρειτε χρόνο) περιέχει ένα ακόμα παράδειγμα, το con_lights.c (http://www.screenr.com/Iye8) Σε ότι αφορά το documentation, κατά βάση μπήκε η ενότητα Extras (η οποία περιγράφει συνοπτικά τα παραδείγματα, προστέθηκαν και βιντέακια, εκτός δηλαδή από τα screen-shots), κι εμπλουτίστηκε η κεντρική σελίδα (παρουσιάζοντας συνοπτικά πως μπορείτε να χρησιμοποιήσετε το interface είτε βιάζεστε, είτε όχι ) Οπότε έχουμε: Download: public_104h2_alpha.zip Documentation: http://x-karagiannis...con_color/html/ (ίδιο με πριν, δεν άλλαξε) Απλώς επειδή το αλλάζω το documentation, αν δεν σας ανοίγει ξαναδοκιμάστε μετά από 1-2 λεπτά (μάλλον θα έχετε πέσει τη στιγμή που ανεβάζω διορθώσεις).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα