C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

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

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

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό medigeek » 21 Ιαν 2012, 02:44

simosx έγραψε:
Κάτι που λείπει για μετά είναι πακετάρισμα σε .deb.

Εδώ μπαίνω εγώ. Αφορμή γύρευα για hands-on παράδειγμα. Δώσε μου το ./configure και το Makefile και τα υπολοιπα είναι παιχνίδι. :P Φυσικά, τα βήματα θα τα αναφέρω ένα-ένα τακτοποιημένα.

migf1 έγραψε:Κι επειδή εγώ δεν πρόκειται να κάτσω να μάθω git, feel-free να το ανεβάσεις στο δικό σου αποθετήριο (ή όποιος άλλος επιθυμεί :) )

Υποθέτω χρειάζεσαι ένα email, ένα λογαριασμό και 4-5 εντολές για να ξεκινήσεις: http://www.jameselsey.co.uk/blogs/techb ... obs-guide/
Υπάρχει και το tortoise git αν ενδιαφέρεσαι για windows gui: http://code.google.com/p/tortoisegit/

Περισσότερες οδηγίες (windows / mac / linux): http://help.github.com/set-up-git-redirect

Όταν το ρυθμίσεις, 2 εντολές θα χρησιμοποιείς, το git commit -a και το git push.. ή το git με κάποιο gui και κλικ-κλικ-κλικ-τελος :P
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό migf1 » 07 Φεβ 2012, 03:41

edited by migf1 έγραψε:
EDIT:
Έχω ξεχάσει ένα...

Κώδικας: Επιλογή όλων
#include <locale.h>

στο gtk_tic.c της δοκιμαστικής έκδοσης 1.03a που δίνω παρακάτω. Επίσης, διαβάσετε αυτό το ποστ: https://forum.ubuntu-gr.org/viewtopic.p ... 97#p229197


Λοιπόν, αφού τέλειωσα με την prompt_for, έπιασα σήμερα να ολοκληρώσω το gettext κομμάτι της τρίλιζας. Τώρα θέλω να κάνω revisit τον κώδικα, κυρίως για να φτιάξω τα σχόλια σε μορφή Doxygen και να της βάλω κανονική τεκμηρίωση (στα πρότυπα της prompt_for και του dates).

Όποιος έχει χρόνο, ας κάνει μια δοκιμή αν έχει κανένα πρόβλημα με τα Ελληνικά (με LANG=el το έχω)... gtk_tic_103a.zip (215 Kb)... αν όλα είναι OK, θα πρέπει να δείχνει Ελληνικά και στο GUI και στο τερματικό (μόνο οι ονομασίες των παικτών είναι στα Αγγλικά: Human & CPU, επειδή δεν κατάφερα να βρω πως να τα μετατρέψω... μάλλον επειδή είναι constants).

ΥΓ. To #include "w32con_cpout.h" ενεργοποιείται μονάχα σε περιβάλλον Windows (είναι για να γυρίζει την κονσόλα των Windows σε UTF-8) οπότε σε άλλες πλατφόρμες είναι απλά no-op (δεν κάνουν τίποτα τα macros που χρησιμοποιεί η main() ).
Τελευταία επεξεργασία από migf1 και 08 Φεβ 2012, 00:27, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό sokoban4ever » 07 Φεβ 2012, 06:17

Μπράβο migf1 !!!
Μιας και ασχολείσαι με gobject
έχεις ακουστά για την γλώσσα προγραμματισμού Vala (του Gnome ) http://live.gnome.org/Vala ;
Χρησιμοποιεί το gobject για προσφέρει την δυνατότητα object oriented προγραμματισμού.
αλλά από ότι είδα σε ένα πρώτο post αυτού του thread εξηγούσες σε έναν από το forum ότι γίνεται
με το gobject να προσομοιώσεις το object oriented προγραμματισμό σχετικά έυκολα...
κατευθείαν από την C
Αυτό το έχω ξανακούσει και κάπου ξαναδιαβάσει ( μάλιστα κάτι μου λέει και ότι η objective-C των Mac κάνει κάτι παρεμφερές....)
και με συναρπάζει ...
κυρίως το γεγονός ότι σύνταξη της C είχα διαβάσει το 2007 το καλοκαίρι και είχα κάνει και μερικές ασκήσεις
και αν αυτό αληθεύει ίσως αποτελέσει ένα καλό κίνητρο να ξαναρχίσω C
:)
Μπορείς να με βοηθήσεις λίγο σε αυτό ;
Ενα χρήσιμο link πχ
Thanks
(O Compiler της Vala στην ουσία κάνει source to source compile σε καθαρή C όπως η cython και μετά κάνει compile σε binary)
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό migf1 » 07 Φεβ 2012, 17:06

sokoban4ever έγραψε:Μπράβο migf1 !!!

Ευχαριστώ, αλλά ήρθα στη δουλειά σήμερα κι ανακάλυψα πως στο εδώ λάπτοπ είχα μεταγενέστερη έκδοση του game από αυτήν που καθόμουν και βελτίωνα χτες :(
Επίσης, εδώ δεν μου δουλεύουν τα Ελληνικά στην κονσόλα των Win7 64bit... φτου κι από την αρχή (θα τα αφήσω Αγγλικά στην κονσόλα μου φαίνεται). Δοκίμασε κανείς την έκδοση που ανέβασα στο προηγούμενο post (1.03Α) να δει αν είναι όλα οκ με τα Ελληνικά;

έγραψε:Μιας και ασχολείσαι με gobject

Για την ακρίβεια, ασχολιόμουν. Στην τρίλιζα χρησιμοποιώ GTK+2 το οποίο χρησιμοποιεί την gobject, αλλά δεν κάνω απευθείας κλήσεις σε αυτήν.

έγραψε:έχεις ακουστά για την γλώσσα προγραμματισμού Vala (του Gnome ) http://live.gnome.org/Vala ;
Χρησιμοποιεί το gobject για προσφέρει την δυνατότητα object oriented προγραμματισμού.

Ακουστά την έχω ναι, αλλά δεν έχω ασχοληθεί μαζί της.

έγραψε:
αλλά από ότι είδα σε ένα πρώτο post αυτού του thread εξηγούσες σε έναν από το forum ότι γίνεται
με το gobject να προσομοιώσεις το object oriented προγραμματισμό σχετικά έυκολα...
κατευθείαν από την C
Αυτό το έχω ξανακούσει και κάπου ξαναδιαβάσει ( μάλιστα κάτι μου λέει και ότι η objective-C των Mac κάνει κάτι παρεμφερές....)
και με συναρπάζει ...
κυρίως το γεγονός ότι σύνταξη της C είχα διαβάσει το 2007 το καλοκαίρι και είχα κάνει και μερικές ασκήσεις
και αν αυτό αληθεύει ίσως αποτελέσει ένα καλό κίνητρο να ξαναρχίσω C
:)

Κοίτα, το εύκολο ή δύσκολο έχει καθαρά να κάνει με το πόσο εξοικειωμένος είσαι με τις γενικότερες έννοιες του αντικειμενοστραφή προγραμματισμού και με το πόσο γνωρίζεις (έστω και μέσες-άκρες) πως υλοποιούνται εσωτερικά τα χαρακτηριστικά του αντικειμενοστραφή προγραμματισμού. Αν τα γνωρίζεις, θα σου φανεί εύκολη κι η gobject (αν και πιο πολυλογάδικη από γλώσσες που υποστηρίζουν εγγενώς oop). Αν δεν τα γνωρίζεις, τότε μάλλον θα ταλαιπωρηθείς και είναι καλύτερα να ασχοληθείς απευθείας με μια oop γλώσσα (objective c, c++ αν σε ελκύει η σύνταξη της c).

Πάντως σαν γενικότερη προσέγγιση δεν είναι δύσκολο να γράψεις c προγράμματα στις βασικές ιδέες του oop. Οι κλάσεις είναι structs, και τα objects είναι είτε δείκτες στα στα structs είτε απλές μεταβλητές με τύπο ένα από αυτά τα structs. Για κάθε κλάση/struct φτιάχνεις μια ομάδα συναρτήσεων (μεθόδων) που παίρνουν σαν 1ο όρισμα πάντα έναν δείκτη στον τύπο του struct, την οποία ομάδα συναρτήσεων μπορείς να την έχεις είτε χύμα είτε μέσα στο κεντρικό .c αρχείο σου, είτε σε δικά τους .c αρχεία, είτε ακόμα και μέσα σε στο struct της κλάσης τους, ως δείκτες συναρτήσεων (χρήσιμο αν θες να υλοποιήσεις π.χ. κληρονομικότητα και πολυμορφισμό).

Η μπορείς να τις συγκεντρώσεις σε ένα δικό τους struct, και να βάλεις στην κλάση έναν δείκτης προς αυτό το struct.
Π.χ....

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

#include <stdio.h>

typedef struct PersonPubMethods PersonPubMethods;
typedef struct ClassPerson ClassPerson;

struct PersonPubMethods {
/* setters */
Bool (*setSex)( ClassPerson *self, const int sex );
Bool (*setAge)( ClassPerson *self, const int age );
Bool (*setHeight)( ClassPerson *self, const int height );
Bool (*setMaritalStatus)( ClassPerson *self, const int marital );

/* getters */
int (*getSex)( ClassPerson *self );
int (*getAge)( ClassPerson *self );
int (*getHeight)( ClassPerson *self );
int (*getMaritalStatus)( ClassPerson *self );
};

struct ClassPerson {
int sex;
int age;
int height;
int marital;
PersonPubMethods *public;
};

/* ------------------- */
ClassPerson *personConstructor( void )
{
ClassPerson *ret =calloc( 1, sizeof(ClassPerson) );
if ( !ret )
return NULL;

ret->public = calloc( 1, sizeof(PersonPubMethods) );
if ( !ret->public ) {
free( ret );
return NULL;
}

/* set setters*/
ret->public->setSex = &person_set_sex; /* συνάρτηση ορισμένη είτε σε αυτό το .c αρχείο ή σε κάποιο private */
...

/* set getters*/
ret->public->getSex = &person_get_sex; /* συνάρτηση ορισμένη είτε σε αυτό το .c αρχείο ή σε κάποιο private */
...

return ret;
}

/* ------------------- */
void personDestructor( ClassPerson *person )
{
if ( !person )
return;

if ( person->public ) {
free( person->public );

free( person );
}

/* ------------------- */
int main( void )
{
ClassPerson *nick = NULL;
if ( NULL = (nick=personConstructor()) ) {
fputs( "*** fatal error: out of memory\n", stderr );
exit( EXIT_FAIURE );
}

nick->public->setAge( nick, 20 );
nick->public->setHeight( nick, 176 );
...
printf( "Nick is %d years old\n", nick->public->getAge(nick) );
...

personDestructor( nick );
exit( EXIT_SUCCESS );
}



To encapsulation (data hiding) το επιτυγχάνεις βάζοντας τις συναρτήσεις, κλάσεις, κλπ που δεν χρειάζεται να ξέρει ο προγραμματιστής σε ξεχωριστά source-modules (.c αρχεία) και βγάζεις public μέσω header αρχείων (.h αρχεία) όποιες υλοποιήσεις μεταβλητές, τύπους, δομές, κλπ θέλεις.

Η τρίλιζα άμα διαβάσεις το readme υλοποιεί στοιχειώδες αντικειμενοστραφή προγραμματισμό ως προσέγγιση σχεδιασμού, άσχετα από τη χρήση του GTK+2.

Το καλό, αλλά και κακό αν δεν ξέρεις τι κάνεις, με τη C είναι πως είσαι ελεύθερος να μοντελοποιήσεις όπως ακριβώς θέλεις την oop προσέγγισή σου (με κόστος φυσικά τον περισσότερο κώδικα).

έγραψε:
Μπορείς να με βοηθήσεις λίγο σε αυτό ;
Ενα χρήσιμο link πχ
Thanks
(O Compiler της Vala στην ουσία κάνει source to source compile σε καθαρή C όπως η cython και μετά κάνει compile σε binary)

Αν το σκέφτεσαι στα σοβαρά, μια καλή αρχή είναι το: Object-Oriented programming with ANSI C
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό migf1 » 07 Φεβ 2012, 17:41

Παρεμπιπτόντως, το απόσπασμα από το readme της τρίλιζας που εξηγεί την στοιχειώδη oop προσέγγιση στον σχεδιασμό της, είναι αυτό εδώ...

gtk_tic readme file έγραψε:
...
Environments
------------

The general idea was to separate the GUI from the game itself, so the action takes place mostly in two environments: the gaming environment, represented by the custom type: Game, and the GUI environment, represented by the custom type: Gui. Those two environments are abstract siblings inside the general environment of the program, represented by the custom type: GenEnv.

The general environment is responsible for controlling the interaction between the game and the GUI environments, while performing higher level tasks. As you can see in the source code, things didn't go exactly as intended, because as I explained above I was too lazy to thoughtfully prepare the design of the program before getting to code it. As a result, I've ended up with a few stray functions, not clearly belonging to any distinct environment. I left them "floating" around, tagging their names with the prefix "util_" (meaning: utility functions).

Speaking of prefixes, gui related functions have their names prefixed with "gui_", while game related functions have their names prefixed with "game_". Functions related to the general environment, have their names prefixed with "env_".

The gaming environment ( Game ) has a child environment, represented by the custom type: GamePlay, with related functions having the "gameplay_" prefix in their names. This GamePlay environment is not what its name may suggest at a first glance: it does not refer to the general game play. Instead, it refers to a single round inside a game (a single play). So a perhaps more intuitive name for this custom type would be something like: Round, but I started the code using Play as the name, later changed it to GamePlay, and I figured that once explained it is not that misleading after all.

There is more data-structure nesting going on in the source code (for example the custom types PlayBoard and Player, belonging to the GamePlay environment, or the custom types GamePrefs and GamePlaystats belonging to the Game environment) but those can be hardly thought as complete environments by themselves. So just think of them simply as interior parts of the basic environment they belong to.


Object Oriented Approach
------------------------

The above design is an Object Oriented approach, and actually most of those functions do operate on pointers to abstract objects, which are passed at the start of the argument list of the functions. So "env_" functions have their 1st argument being of type GenEnv *, while "game_" functions have their 1st argument being of type: Game *, and "gameplay_" functions have their 1st argument being of type: GamePlay *, and so on.

Exceptions to this OO convention are the "util_" and "debug_" functions, for the reasons I explained earlier (stray functions).

Proper OOP in C is usually implemented with classes being structures, containg methods as pointers to functions inside each class struct. The 1st argument of those functions is a pointer to the type of the class. Then, encapsulation is achieved via splitting the code into separated .c files, thus hiding the internal implemnetation of private stuff. Public access is given via one or more header files, which only expose the needed abstractions to the programmer. Class constructors & destructors are implemented as separate, public functions (unless one wants to push things to the exterme, building a fully managed environment for his program).

If I was implementing all the above in such a small project as this one, then a proper suffix for its name would be something like "Overkill to Death and Beyond" instead of just "Overkill"!

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

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό sokoban4ever » 07 Φεβ 2012, 18:14

Σε ευχαριστώ για τις πλούσιες και χρήσιμες συμβουλές για την C
O διαχωρισμός που έκανες στο gui από το game μου θυμίζει το Model-View-Controller (MVC) design pattern
http://en.wikipedia.org/wiki/Model%E2%8 ... controller που και αυτό κάνει τέτοιους διαχωρισμούς .
To ebook φαίνεται εξαιρετικό!
:)
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό migf1 » 07 Φεβ 2012, 19:43

Ναι, αυτή είναι η γενική ιδέα. Αλλά επειδή δεν κάθισα από την αρχή να το σχεδιάσω όπως πρέπει, βγήκε με ελλείψεις... τουλάχιστον όμως δουλεύει :)

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

Re: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό Star_Light » 07 Φεβ 2012, 20:10

migf1 έγραψε:Ναι, αυτή είναι η γενική ιδέα. Αλλά επειδή δεν κάθισα από την αρχή να το σχεδιάσω όπως πρέπει, βγήκε με ελλείψεις... τουλάχιστον όμως δουλεύει :)

Τελικά δοκίμασε κανείς τα Ελληνικά;


Θα το δοκιμασω εγω σε λιγο.
Γνώσεις ⇛ 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: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό Star_Light » 07 Φεβ 2012, 20:54

βασικα σε ποιο αρχείο πρεπει να βάλουμε την κωδικοποιήση για τα ελληνικα αν δεν την εχω ηδη γιατι
δεν θυμαμαι?
Γνώσεις ⇛ 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: C, GTK+2: Crossplatform Τρίλιζα (Tic-Tac-Toe Overkill)

Δημοσίευσηαπό migf1 » 07 Φεβ 2012, 21:15

Μπορείς να το κάνεις πιο εύκολα...

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

echo $LANG

για να δεις τι τιμή έχει, μετά...

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

LANG=el


τρέχεις το game και όταν τελειώσει ξαναβάζεις την αρχική τιμή της LANG με...

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

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

ΠροηγούμενηΕπόμενο

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