ANSI C: Παράδειγμα Διαχείρισης Ημερομηνιών

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: ANSI C: Παράδειγμα Διαχείρισης Ημερομηνιών

Δημοσίευσηαπό Star_Light » 25 Ιαν 2012, 04:54

Ιδου

http://x-karagiannis.gr/prog/libs/conte ... doc/html/(δουλέψτε και με το δέντρο, στην αριστερή μεριά, και ιδιαίτερα με το Files List->dates365.c).

έχει πάρει και την παρένθεση σαν μέρος του URL με αποτέλεσμα να παράγει 404 οταν παει κάποιος να κλικάρει :D
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: ANSI C: Παράδειγμα Διαχείρισης Ημερομηνιών

Δημοσίευσηαπό migf1 » 25 Ιαν 2012, 04:58

Α το άτιμο :lol:

Το 'φτιαξα, thanks! :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ANSI C: Παράδειγμα Διαχείρισης Ημερομηνιών

Δημοσίευσηαπό migf1 » 25 Ιαν 2012, 16:28

Έτοιμη και η έκδοση 3.65

έγραψε:
Βελτιώσεις στη V3.65 (το πρόγραμμα έχει πλέον δική του σελίδα: http://x-karagiannis.gr/prog/libs/conte ... /dates.php)
  • διεύρυνση του κάτω ορίου στο ημερολόγιο, από 14 Σεπ 1752 σε 15 Οκτ 1582
  • δυνατότητα τυπώματος ετήσιου ημερολογίου είτε στην οθόνη είτε σε αρχείο κειμένου που καθορίζει ο χρήστης
  • αλλαγή όλων των σχολίων του κώδικα σε μορφή αναγνωρίσιμη από το Doxygen
  • δημιουργία πλήρους τεκμηρίωσης στα Αγγλικά, τόσο για τον κώδικα όσο και για το πρόγραμμα


Και κάτι σημαντικό που είχα αμελήσει να διευκρινίζω εμφανώς για το πρόγραμμα (απόσπασμα από την περιγραφή της έκδοσης 3.65)...
έγραψε:
...
Είναι σημαντικό να γνωρίζετε πως το Γρηγοριανό Ημερολόγιο υιοθετήθηκε από την Ελλάδα το 1923, ενώ αλλάχτηκε ξανά το 1924 σε μια παραλλαγή γνωστή ως Revised Julian Calendar. Το link αυτό εξηγεί τις λεπτομέρειες, με σημαντικότερη το ότι το 2800 τα δυο ημερολόγια θα αρχίσουν να αποκλίνουν.

Οπότε για να έχετε αξιόπιστα αποτελέσματα για γεγονότα που συνέβησαν στην Ελλάδα πριν από αυτές τις ημερομηνίες θα πρέπει να χρησιμοποιήσετε άλλα προγράμματα ή/και μονάδες μέτρησης. Οι Ιουλιανοί αριθμοί που χρησιμοποιεί το DATES είναι αξιόπιστες μονάδες μέτρησης για την περίοδο που καλύπτει το ημερολόγιό του, αλλά δεν ισχύει το ίδιο για τις "χαμένες" ημέρες ως νούμερα και τις ημέρες της εβδομάδας που τους αντιστοιχούν.

Το πρόβλημα παραμένει και για όλες τις υπόλοιπες χώρες που ακολουθούν το Γρηγοριανό ημερολόγιο, όχι μόνο επειδή το υιοθέτησαν σε διαφορετικές ημερομηνίες, αλλά κι επειδή κατά τη διαδικασία της αλλαγής αφαιρέθηκε διαφορετικός αριθμός ημερών. Για παράδειγμα, η Αγγλική μετατροπή που έγινε στις 14 Σεπ 1752 αφαίρεσε 10 ημέρες, με αποτέλεσμα οι ημερομηνιες από την 5 Σεπ 1752 έως και την 13 Σεπ 1752 να μην υπάρχουν στο Αγγλικό ημερολόγιο. Αλλά η Ελλάδα και η Ρωσσία που υιοθέτησαν το Γρηγοριανό ημερολόγιο το 1923 αφαίρεσαν 13 ημέρες... και πάει λέγοντας και για τις υπόλοιπες χώρες.
...

Εδώ η σχετική ενότητα της τεκμηρίωσης στα Αγγλικά: http://x-karagiannis.gr/prog/libs/conte ... html#Intro
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ANSI C: Παράδειγμα Διαχείρισης Ημερομηνιών

Δημοσίευσηαπό migf1 » 27 Ιαν 2012, 14:16

Ξεκίνησα να του προσθέτω χρώματα...

Εικόνα

Μοβ : δίσεκτα έτη
Γαλάζιο : μη δίσεκτα έτη
Κόκκινο: αργίες
Κίτρινο: σημερινή μέρα & διαφορά μεταξύ ημερομηνιών

* τα συγκεκριμένα είναι πολύ πιο ευδιάκριτα σε μαύρο φόντο.

Για να το κάνω να δουλεύει και σε Windows και σε Unix/Linux ξεκίνησα να φτιάχνω σε ξεχωριστό, αυτόνομο, header file μια μικρή συλλογή από σταθερές και macros, η οποία δίνει πρόσβαση είτε στο ANSI χρωματολόγιο (αν πρόκειται για Linux/Unix) είτε στο χρωματολόγιο που χρησιμοποιεί η κονσόλα των Windows.

Τα διαθέσιμα χρώματα προσκηνίου τα έχω βάλει να ξεκινάνε με FG_ ενώ του φόντου με BG_. Οι σταθερές: FG_NOCHANGE και BG_NOCHANGE χρησιμοποιούνται μεταξύ άλλων στο HighLevel macro...

Αντί να χρησιμοποιήσω full-blown βιβλιοθήκες (όπως π.χ. την curses) ξεκίνησα να φτιάχνω ένα header file (con_color.h το λέω προς το παρόν) για cross-platform υποστήριξη χρωμάτων κονσόλας σε Windows και Linux/Unix. Αν τα Windows παρείχαν υποστήριξη σε ANSI escape characters, όπως κάνει πλέον η συντριπτική πλειοψηφία τερματικών σε Linux/Unix θα ήταν πολύ πιο απλό, αλλά δυστυχώς δεν υποστηρίζει.

Σας παραθέτω το header file, για να πειραματιστείτε και μόνοι σας όσοι ενδιαφέρεστε: http://ideone.com/AWC0z

Διαβάστε όμως τη συνέχεια του μηνύματος (και των spoilers) για να καταλάβετε πως δουλεύει και πως μπορείτε να το χρησιμοποιήσετε για να γράφετε cross-platform πηγαίο κώδικα με αυτό.

Spoiler: show
Το DOS/command.com υποστήριζε μέσω του ANSI.SYS drivers για όσους το θυμούνται, το οποίο όμως από XP και μετά καταργήθηκε (μαζί με το DOS). Υπάρχει ένα εξαιρετικό προγραμματάκι που προσθέτει ANSI υποστήριξη στη κονσόλα του XP και μετά (ANSICON λεγεται, ψάξτε το να το κατεβάσετε, είναι πολύ καλό... έχει και option να γίνεται hooked στο cmd.exe αν θέλετε).


Το header file είναι σε πολύ αρχικό στάδιο, ίσα-ίσα για να κάνω τη δουλειά μου... (π.χ. του έχω μόνο χρώματα, και όχι άλλα text attributes όπως bold, italics, κλπ, ή editing support, όπως π.χ. μετακίνηση δρομέα, κλπ).

Επίσης χρησιμοποιεί 4 καθολικές μεταβλητές (μόνο όταν γίνει compile σε περιβάλλον Windows) τα ονόματα των οποίων δεν είναι ασυνήθιστα ως οφείλουν να είναι για να μη "συγκρούονται" με ονόματα κανονικών μεταβλητών στα προγράμματα που χρησιμοποιούν το con_color.h. Αυτά θα τα δω πιο μετά.

Το βασικό HL macro είναι το ...

Κώδικας: Επιλογή όλων

CONOUT_PRINTF( fg, bg, ... )

που είναι variadic, άρα κανονικά θέλει C99 enabled compiler (αλλά οι περισσότεροι υποστήριζαν έτσι κι αλλιώς variadic macros από πριν).

Αν είστε σε Windows πρέπει να χρησιμοποιήστε 2 ακόμα HL macros, ένα για αρχικοποίηση στην αρχή των προγραμμάτων σας (που αποθηκεύει την τρέχουσα κατάσταση της κονσόλας), κι ένα στο τέλος για την επαναφορά της κονσόλας στην κατάσταση που είχε πριν ξεκινήσετε να... χρωματίζετε :lol:

Κώδικας: Επιλογή όλων

#include "con_color.h"
...
CONOUT_INIT();

CONOUT_PRINTF( FG_CYAN, BG_NOCHANGE, "Hello world\n" );
printf( "Here is a ");
CONOUT_PRINTF( FG_RED, BG_NOCHANGE, "red" );
printf( " word, and here is some " );
CONOUT_PRINTF( FG_DARKGREEN, BG_GRAY, "dark-green text on gray foreground\n" );

CONOUT_RESTORE();
...


Αν δουλεύετε σε Lιnux/Unix περιβάλλον, τότε δεν χρειάζεστε καν τα CONOUT_INIT() και CONOUT_RESTORE() ...

Κώδικας: Επιλογή όλων

#include "con_color.h"
...
CONOUT_PRINTF( FG_CYAN, BG_NOCHANGE, "Hello world\n" );
printf( "Here is a ");
CONOUT_PRINTF( FG_RED, BG_NOCHANGE, "red" );
printf( " word, and here is some " );
CONOUT_PRINTF( FG_DARKGREEN, BG_GRAY, "dark-green text on gray foreground\n" );
...

καλό είναι να τα βάζετε όμως για να λειτουργεί σωστά ο κώδικάς σας κι όταν γίνεται compile σε Windows.

Spoiler: show
Αν θέλετε να παίξετε με πιο LL macros, τότε είναι λίγο πιο πολύπλοκο. Εν ολίγοις, αν θέλετε να πειραματιστείτε με τα 3-4 LL macros, η πιο συνηθισμένη σειρά τους πάει ως εξής:

Κώδικας: Επιλογή όλων

CONOUT_SET_COLOR( fgColor );
CONOUT_ADD_COLOR( bgColor );

printf( "blablab" );

CONOUT_RESET();

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

Όταν τυπώσετε κάτι (στα χρώματα που ορίσατε), πρέπει να επαναφέρετε την κονσόλα στην κατάσταση που είχε πριν το τύπωμα, ώστε το επόμενο τύπωμα να γίνει με εκείνα τα χρώματα ... οπότε πρέπει να κάνετε CONOUT_RESET().

Η ανάγκη για SET; ADD; ADD; ... RESET; προκύπτει από τον τρόπο που διαχειρίζονται τα Windows τα χρώματα της κονσόλας (ουσιαστικά, είναι ένα bitmap flag, στο οποίο μπορείτε να μιξάρετε πολλά χρώματα με χρήση του binary operator | ).

Στο ANSI από την άλλη μεριά, το κάθε χρώμα είναι μια ακολουθία χαρακτήρων, οπότε δεν μπορούμε να μιξάρουμε χρώματα. Για αυτό και οι ANSI εκδοχές των CONOUT_SET_COLOR() και CONOUT_ADD_COLOR() έχουν ακριβώς ίδιο κώδικα. Στο ANSI έχουν νόημα 2 μόνο κλήσεις... μια για το χρώμα προσκηνίου και μια για το χρώμα παρασκηνίου, με οποιοδήποτε από τα 2 παραπάνω macros().

Εν ολίγοις, για να είναι εντάξει ο κώδικάς σας και στα 2 modes (ANSI, Windows) χρησιμοποιήστε μονάχα τη σειρά που δείχνω παραπάνω...

1. μια κλήση του SET με χρώμα προσκηνίου
2. μια κλήση στην ADD με χρώμα φόντου
3. τύπωμα με συνάρτηση της C
4. RESET για περαιτέρω τύπωμα

Ουσιαστικά, αυτό κάνει το HL macro: CONOUT_PRINTF() οπότε είναι σαφώς ευκολότερο (και συνιστώμενο) να χρησιμοποιείτε απευθείας αυτό!


Κι ένα τελευταίο...

Αν θέλετε να δοκιμάσετε το ANSI mode σε Windows (με χρήση του ANSICON προγράμματος που αναφέρω παραπάνω) τότε στη γραμμή 16 του κώδικα του con_color.h αλλάξτε το...

Κώδικας: Επιλογή όλων

#if 0 /* change to 1 to FORCE ANSI mode (for Windows you need: ansicon.exe)*/

σε ...

Κώδικας: Επιλογή όλων

#if 1 /* change to 1 to FORCE ANSI mode (for Windows you need: ansicon.exe)*/
Τελευταία επεξεργασία από migf1 και 27 Ιαν 2012, 16:18, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ANSI C: Παράδειγμα Διαχείρισης Ημερομηνιών

Δημοσίευσηαπό migf1 » 27 Ιαν 2012, 16:14

Τροποποίησα το προηγούμενο ποστ, βάζοντας πιο αναλυτικές πληροφορίες για όσους θελήσουν να παίξουν με το con_color.h
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Προηγούμενη

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι