Τα πάντα για την C

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

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 12:32

Star_Light έγραψε:migf1 μολις τελειωσουμε με αυτα... θελεις να πάμε στα δικτυα και να αρχισουμε καποιον αλγοριθμο... πχ του Dijkstra? Τον ξερεις? Τον εχεις δει? αν και δεν νομιζω να ειναι δυσκολος για σενα.

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

Ιδανικά θα μπορείτε μετά, με λίγη βοήθεια κι από μένα, να φτιάξετε π.χ. σε κονσόλα το παιχνίδι της Ναυμαχίας, με τον υπολογιστή να παίζει εναντίον ενός παίκτη :) . Ή αντί για Ναυμαχία, μπορούμε να δοκιμάσουμε να βάλουμε στον διευθυνσιογράφο μας γραφικό περιβάλλον, με χρήση του GTK+ API (πάνω στο οποίο είναι φτιαγμένο το Gnome... αν κι εκεί θα είναι ζόρικα τα πράγματα και για μένα, γιατί θα πρέπει να διαβάσω κι εγώ πως λειτουργεί το συγκεκριμένο API και ποιες συναρτήσεις του θα χρειαστεί να συνθέσουμε :) )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 12:35

loooooooooooooooool

παιχνιδι ναυμαχιας με τον υπολογιστη?????

Το GTK ειναι βιβλιοθηκη για τα γραφικα ????
Γνώσεις ⇛ 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/C++

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 12:45

Star_Light έγραψε:loooooooooooooooool

παιχνιδι ναυμαχιας με τον υπολογιστη?????

Ναι, η βασική του δυσκολία θα είναι ο αλγόριθμος που θα χρησιμοποιεί ο Η/Υ για να διαλέξει την κάθε του κίνηση. Τα υπόλοιπα θα σας φανούν αρκετά εύκολα αν έχουμε κάνει πρώτα τον διευθυνσιογράφο ;)

έγραψε:Το GTK ειναι βιβλιοθηκη για τα γραφικα ????

Ναι, για μενού, φόρμες, παράθυρα, κλπ... και είναι και cross-platform, δηλαδή με απλό compilation του κώδικά μας το εκτελέσιμο θα τρέχει σε Posix/Windows/Mac OS (αν το καταφέρουμε δηλαδή, γιατί εκεί θα θέλουμε άλλον έναν μήνα και παραπάνω να μετατρέψουμε το περιβάλλον κειμένου σε γραφικό).

Είναι πολύ μακρινό αυτό όμως. Στα πλαίσια του διεθυνσιογράφου σκοπεύω να σας δείξω και πως να γράφετε κώδικα που θα είναι σε περισσότερα του ενός .c αρχείου... για παράδειγμα, μπορούμε να αυτονομήσουμε σε ξεχωριστό αρχείο .c τον κώδικα που θα ασχολείται με το περιβάλλον επικοινωνίας με τον χρήστη, ώστε αν θελήσουμε αργότερα να το κάνουμε γραφικό (αντί για κειμένου) ότι αλλαγές κάνουμε να γίνουν κατά συντριπτική πλειοψηφία σε εκείνο μόνο το αρχείο και στην main().

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 12:51

δηλαδη μεσα σε εναν χρονο αν εχεις καλο δασκαλο μπορεις να γινεις δυναμιτης στην C ε?

Aσχετο , αλλα τα antivirus αν καποιος ξερει καλο κωδικα και ειναι ανοικτου κωδικα το προγραμμα μπορει καποιος

να καταλαβει πως λειτουργει? Πχ στα windows
Γνώσεις ⇛ 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/C++

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 13:01

Star_Light έγραψε:δηλαδη μεσα σε εναν χρονο αν εχεις καλο δασκαλο μπορεις να γινεις δυναμιτης στην C ε?

Αν δεν πετάγεσαι από το ένα θέμα στο άλλο χωρίς σύνδεση με τα προηγούμενα, ναι :lol:

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 13:03

Star_Light έγραψε:
Aσχετο , αλλα τα antivirus αν καποιος ξερει καλο κωδικα και ειναι ανοικτου κωδικα το προγραμμα μπορει καποιος

να καταλαβει πως λειτουργει? Πχ στα windows

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 13:06

migf1 έγραψε:
Star_Light έγραψε:δηλαδη μεσα σε εναν χρονο αν εχεις καλο δασκαλο μπορεις να γινεις δυναμιτης στην C ε?

Αν δεν πετάγεσαι από το ένα θέμα στο άλλο χωρίς σύνδεση με τα προηγούμενα, ναι :lol:

Αλλά οκ, δυναμίτης δεν γίνεσαι, γιατί είναι τεράστιο το εύρος των τομέων, αλλά ναι φτάνεις σε ένα πολύ καλό επίπεδο!


Ε νταξει.... βασικα δεν ξερω αν και σημερα πεταχτω απο το ενα στο αλλο αλλα να ξερεις πως χρωσταω μια ασκηση απο την σελ. 122

Οσο για τα antivirus δυσκολα απο ποια έννοια?
Γνώσεις ⇛ 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/C++

Δημοσίευσηαπό Star_Light » 11 Σεπ 2011, 13:12

τεσπα απο περιεργεια ρωτησα.... κοιταξε ο κωδικας ειναι πολυ μεγαλος!!!!! 175 γραμμες!!!!!

αλλα να ρωτησω κατι

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

if ( !table->buffer ) { /* αποτυχία δέσμευσης μνήμης */
table->bufsize = 0; /* ... μηδενισμός μεγέθους */
return FALSE; /* ... επιστροφή αποτυχίας */
}



στο 1ο if εξετάζεις αν ο table έχει υπαρκτά περιεχόμενα???
Γνώσεις ⇛ 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/C++

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 13:44

Επιστροφή στο table2.c

Λοιπόν, ένας από τους βασικότερους λόγους που το γυρίσαμε σε δομή είναι για να μπορούμε να διαχειριζόμαστε και πιο άμεσα και πιο εύκολα τα πεδία: buflen και bufmaxlen.

Το bufmaxlen είναι το μέγιστο πλήθος στοιχείων του buffer μας, άρα είναι η ένδειξη που έχουμε για το ανώτατο όριο του πίνακά μας, ώστε ελέγχοντάς το να μπορούμε να αποτρέπουμε πιθανά buffer overflows.

Το buflen θέλουμε ανά πάσα στιγμή να απεικονίζει της θέση του 1ου ΜΗ ΚΕΝΟΥ στοιχείου στο buffer, και όταν ισούται με bufmaxlen ξέρουμε πως ο πίνακάς μας είναι γεμάτος, δεν έχει χώρο να φιλοξενήσει άλλη τιμή (εκτός φυσικά αν σβήσουμε κάποιες από τις υπάρχουσες).

Από τα παραπάνω προκύπτει πως κάθε φορά που προσθέτουμε ή αφαιρούμε στοιχεία στο buffer, πρέπει να φροντίζουμε να ενημερώνουμε αμέσως και το πεδίο buflen. Το θέλουμε να είναι ενημερωμένο ΑΝΑ ΠΑΣΑ ΣΤΙΓΜΗ το χρειαστούμε!

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

Για παράδειγμα, αν δεν μας ενδιαφέρει τα στοιχεία να εισάγονται ταξινομημένα στον πίνακα, τότε η εισαγωγή κάθε νέου στοιχείου μπορεί να γίνει με μια απλή ανάθεση στη θέση που δείχνει το buflen, το οποίο οφείλουμε να το αυξάνουμε κατά 1 μετά από κάθε επιτυχημένη εισαγωγή.

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

table->buffer[ table->buflen ] = new_element;
table->buflen++;
φυσικά πριν επιχειρήσουμε την εισαγωγή, πρέπει πρώτα να έχουμε ελέγξει πως ο πίνακας δεν ήταν ήδη γεμάτος (καθως επίσης κι αν το buffer μας ήταν δημιουργημένο: table->buffer != NULL

Μια άλλη περίπτωση που μας βοηθάει το ενημερωμένο buflen είναι στην αναζήτηση ενός υπάρχοντος στοιχείου του πίνακα. Με την προϋπόθεση πως έχουμε ήδη ταξινομήσει τα στοιχεία του πίνακα σε αύξουσα σειρά, τότε αν ο χρήστης μας ζητήσει ένα στοιχείο που βρίσκεται από τη μέση του πίνακα και μετά, τότε μπορούμε να ξεκινήσουμε το for-loop της αναζήτησης όχι με: for (i=0; i < buflen; i++) αλλά με: (i=buflen; i >-1; i--)
Να ξεκινήσουμε δηλαδή από το τέλος προς την αρχή, για να γλιτώσουμε περιττές επαναλήψεις.

Αν για παράδειγμα σε ένα πίνακα 100000 στοιχείων (bufmaxlen), εκ των οποίων τα 90000 είναι γεμάτα (buflen), το στοιχείο που ζητάμε βρίσκεται 3 θέσεις πριν το τέλος του πίνακα, θα το βρούμε σε 3 μόλις επαναλήψεις γιατί θα έχουμε ξεκινήσουμε από το buflen και όχι από το 0 ;)

Με λίγα λόγια, με λίγο έξτρα κόστος για να διατηρούμε ενημερωμένο το buflen, παίρνουμε ως αντάλλαγμα μεγάλο κέρδος σε διάφορες λειτουργίες.

Χρειάζεται λίγη προσοχή όμως κατά την ενημέρωση του buflen, γιατί στην C οι πίνακες ξεκινάνε από την θέση μηδέν. Οπότε, αν για παράδειγμα το bufmaxlen είναι 5 στοιχεία, τότε η συνθήκη που καθορίζει αν ο πίνακας είναι γεμάτος ή όχι είναι η...
Κώδικας: Επιλογή όλων

if ( buflen == bufmaxlen )

Αυτό θέλει λίγη ανάλυση!

Ας πάρουμε έναν κενό πίνακα χωρητικότητας 5 στοιχείων, δηλαδή έχουμε: bufmaxlen = 5 και buflen = 0 (είπαμε πως το buflen δείχνει πάντα στο 1ο ΜΗ ΚΕΝΟ στοιχείο του πίνακα). Για να εισαγάγουμε π.χ. την τιμή 100 στο πίνακα, θέλουμε να τη βάλουμε στο 1ο μη κενό κελί του buffer, δηλαδή στη θέση 0 που δείχνει το buflen. Αμέσως μετά, κάνουμε το buflen++ για να δείχνει στη θέση 1, που είναι η νεα ΜΗ ΚΕΝΗ θέση του πίνακα.

Όταν το buflen φτάσει να δείχνει στη θέση 4 (που είναι η 5η θέση του πίνακα) εννοείται πως είναι κενή... βάζουμε λοιπόν κι εκεί ένα νέο στοιχείο και αυξάνουμε το buflen κατά 1, όπως είπαμε.

Άρα, το buflen τώρα ισούται με 5 κι ο πίνακας είναι γεμάτος. Με 5 όμως ισούται και maxbufen, Οπότε, όταν (buflen == bufmaxlen) σημαίνει πως ο πίνακας ΔΕΝ έχει άλλο χώρο, είναι γεμάτος!

Αυτά μου έρχονται στο μυαλό προς το παρόν για τη φιλοσοφία του μέχρι τώρα κώδικά μας. Αν δεν υπάρχουν απορίες, φτιάξτε τη συνάρτηση...
Κώδικας: Επιλογή όλων
Bool table_fill_randomly( Table *table, const int maxval )

που είπαμε στο προηγούμενο post, για να πιάσουμε μετά 3 πολύ χρήσιμες και ιδιαίτερα ενδιαφέρουσες συναρτήσεις:
Κώδικας: Επιλογή όλων

table_insert_element( ... );
table_delete_element( ... );
table_sort_ascending( ... );
Τελευταία επεξεργασία από migf1 και 11 Σεπ 2011, 13:52, έχει επεξεργασθεί 2 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 11 Σεπ 2011, 13:48

Star_Light έγραψε:τεσπα απο περιεργεια ρωτησα.... κοιταξε ο κωδικας ειναι πολυ μεγαλος!!!!! 175 γραμμες!!!!!

Τι είναι 175 γραμμές; Τίποτα! Άσε που οι μισές είναι σχόλια! Και δεν είναι συνεχόμενος κώδικας, είναι διαχωρισμένος σε συναρτήσεις όπου η κάθε μια είναι εν πολλοίς αυτόνομη ;)

έγραψε:αλλα να ρωτησω κατι

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

if ( !table->buffer ) { /* αποτυχία δέσμευσης μνήμης */
table->bufsize = 0; /* ... μηδενισμός μεγέθους */
return FALSE; /* ... επιστροφή αποτυχίας */
}



στο 1ο if εξετάζεις αν ο table έχει υπαρκτά περιεχόμενα???

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

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

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

cron