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