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

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

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

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

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

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

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

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

Λοιπόν, ανέβασα ολοκληρωμένο προγραμματάκι που διαβάζει από την κύρια είσοδο ένα c-string αγνώστου μήκους. Το έχω... ξεσκίσει στα σχόλια, ώστε να φανεί χρήσιμο σε όσους ενδιαφέρονται να ασχοληθούν σοβαρά με τον προγραμματισμό σε C, κι ας είναι αρχάριοι.

Συγκριτικά με τον προηγούμενο κώδικα που ποστάρισα, αυτός είναι βελτιωμένος όχι μόνο ως προς τα αναλυτικά σχόλια αλλά και στον κώδικα, υπό την έννοια πως όταν παραστεί ανάγκη για περισσότερο χώρο διπλασιάζει το τρέχον μέγιστο μήκος του c-string (αντί να προσθέτει το i+chunklen που έκανε ο προηγούμενος). Αυτό βοηθάει στο να γίνονται συνολικά λιγότερα allocations.

Όπως είναι ποσταρισμένος ο κώδικας τυπώνει στην έξοδο έξτρα πληροφορίες για τα allocations που κάνει (δείτε την έξοδο στο τέλος του link που δίνω παρακάτω), καθώς και το μήκος του c-string με και χωρίς τον μηδενικό χαρακτήρα στο τέλος του. Αν θέλετε να μη βγάζει αυτά τα μηνύματα, τότε αντικαταστήστε στην main() την κλήση της: s_get_dyn_debug(32) με κλήση στην: s_get_dyn(32) (προφανώς μπορείτε να πειραματιστείτε και με άλλα νούμερα, πέρα από το 32).

Πέρα από την ανάγνωση του c-string, μπορείτε να δείτε πως χρησιμοποιούμε την εντολή goto προκειμένου να έχουμε πιο συμμαζεμένο κώδικα, καθώς και πως μπορούμε να χρησιμοποιήσουμε στάνταρ συναρτήσεις όπως η vfprintf() για να φτιάχνουμε δικές μας συναρτήσεις με άγνωστο πλήθος παραμέτρων.

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

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

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

Α, ξέχασα να εξηγήσω μια σημαντική παρατήρηση σχετικά με τη χρήση της realloc() που ισχύει πάντα και όχι μονάχα για τον συγκεκριμένο κώδικα. Δεν πρέπει ποτέ να αναθέτουμε την τιμή επιστροφής της realloc() στον δείκτη που της έχουμε ζητήσει να κάνει realloc().

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

Έστω πως έχουμε ένα ήδη δημιουργημένο c-string s με μέγιστο μήκος ίσο με 100 χαρακτήρες και θέλουμε να το αυξήσουμε σε 200 χαρακτήρες. Τότε, δεν κάνουμε απευθείας...

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

s = realloc(s, 200 * sizeof(char));

αλλά χρησιμοποιούμε ένα προσωρινό δείκτη... αυτόν που ονομάζω try εγώ στο κώδικα του προηγούμενου ποστ. Οπότε έχουμε...

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

try = realloc(s, 200 * sizeof(char));

Η επόμενη κίνηση είναι να ελέγξουμε αν απέτυχε το realloc()...
Κώδικας: Επιλογή όλων

if ( !try ) ...

Το σύνηθες όταν αποτυγχάνει η realloc() είναι να μην υπάρχει διαθέσιμο το συνεχόμενο κομμάτι μνήμης που ζητήσαμε. Όταν αποτυγχάνει η συνάρτηση μας επιστρέφει NULL, οπότε αν είχαμε κάνει...
Κώδικας: Επιλογή όλων

s = realloc(s, 200 * sizeof(char));

θα είχαμε χάσει την επαφή μας με την περιοχή μνήμης στην οποία έδειχνε ο s πριν την κλήση στην realloc() γιατί το s θα ήταν πλέον ίσο με NULL. Δεν θα είχαμε πια καν τρόπο να την κάνουμε free(s) εκείνη την περιοχή μνήμης... memory leak!

Ενώ τώρα που χρησιμοποιήσαμε τον try για την realloc(), ο s εξακολουθεί να δείχνει στη μνήμη που έδειχνε και πριν την κλήση της realloc() ;)
Αν θέλουμε μπορούμε να την κάνουμε κανονικά free(s) και να τερματίσουμε το πρόγραμμά μας με σήμα αποτυχίας προς το λειτουργικό. Ή μπορεί να θέλουμε να συνεχίσουμε να χρησιμοποιούμε το s με το μέγιστο μήκος που είχε πριν την κλήση της realloc(). Με λίγα λόγια, συνεχίζουμε να έχουμε πρόσβαση στη μνήμη που δείχνει ο s, ακόμα κι αν αποτύχει η realloc().

Αν από την άλλη μεριά πετύχει η realloc() το μόνο που χρειάζεται να κάνουμε για να αποκτήσουμε πρόσβαση στην διευρυμένη μνήμη, είναι να αναθέσουμε τον s εκεί που δείχνει ο try...

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

try = realloc(s, 200 * sizeof(char));
if ( !try ) {
/* realloc() fail, decide here what you want to do with s */
}
else {
s = try;
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 20 Φεβ 2012, 16:23

migf1 έγραψε:
...
Ανάγνωση c-string αγνώστου μήκους από την κύρια είσοδο: http://ideone.com/Hrh2i

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

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

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

-.-

σκέφτομαι να κάνω άσκηση η οποια παίρνει ενα string
και μετράει τους ίδιους χαρακτήρες.

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

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

Παραθέτω κώδικα από έναν πολύ απλό δεκαεξαδικό viewer αρχείων (HexViewer): http://ideone.com/ttnNJ

Χωρίς παράμετρο στη γραμμή εντολών, ρωτάει ποιο αρχείο να ανοίξει και το δείχνει σελιδοποιημένο, όπως φαίνεται στην παρακάτω εικόνα (από Windows). Μπορείτε όμως να περάστε το όνομα του αρχείου και απευθείας στη γραμμή εντολών, π.χ...

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

./a.out a.out


Εικόνα

Επειδή το πρόγραμμα δεν παρέχει μετακίνηση μέσα στο αρχείο που δείχνει (πέρα από την σειριακή του εμφάνιση, ανά σελίδα) μπορείτε να χρησιμοποιήστε ως 1η παράμετρο στην γραμμή εντολών του το "-raw" και κατόπιν το όνομα του αρχείου που θέλετε να ανοίξει. Κάνοντας το κατόπιν pipe στο less (ή στο more, ή σε όποιον άλλον file viewer κονσόλας χρησιμοποιείτε) έχετε έναν λειτουργικότατο hex-viewer...

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

./a.out -raw a.out | less

Η παραπάνω εικόνα δείχνει το εκτελέσιμο αρχείο του προγράμματος περασμένο στον εαυτό του, σε Windows. Όσοι έχετε ασχοληθεί με την εσωτερική δομή αρχείων στα Windows, μπορείτε να διακρίνετε στο "Chars area" το χαρακτηριστικό "MZ" στα 2 πρώτα bytes, που υποδηλώνουν πως πρόκειται για Win32 εκτελέσιμο (το οποίο π.χ. δεν τρέχει σε DOS). Λίγο πιο κάτω μπορείτε να δείτε τον χαρακτηριστικό PE header που υπάρχει σε όλα τα εκτελέσιμα των Windows. Στο Linux σε πλατφόρμες x86 τα αναγνωριστικά bytes των εκτελέσιμων γράφουν "ELF" (αν δεν με απατάει η μνήμη μου, θα το τσεκάρω όταν πάω σπίτι που έχω το Ubuntu).

Αν έχω όρεξη μπορεί να του προσθέσω PageUp και PageDown λειτουργικότητα :P

@Starlight: το θεωρώ πανεύκολο, έως γελοίο. Για τελευταία όμως φορά, σε συμβουλεύω να ψάξεις να βρεις το βιβλίο: "C Programming - A Modern Approach, 2nd Edition" του King και να το διαβάσεις από την αρχή μέχρι το τέλος. Και να κάνεις και τις ασκήσεις του.
Τελευταία επεξεργασία από migf1 και 22 Φεβ 2012, 13:22, έχει επεξεργασθεί 2 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 21 Φεβ 2012, 22:09

Εντάξει θα μπω απο Windows σε λιγο που έχω το μtorrent

ελπίζω να βρώ να το κατεβάσω free.
Γνώσεις ⇛ 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

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

Star_Light έγραψε:Εντάξει θα μπω απο Windows σε λιγο που έχω το μtorrent

ελπίζω να βρώ να το κατεβάσω free.

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

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

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

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

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

Δημοσίευσηαπό Star_Light » 21 Φεβ 2012, 22:17

Bρηκα και κατι αλλες ασκησεις για οσους ενδιαφερονται... (μαζι με λυσεις εννοειται)

http://users.powernet.co.uk/eton/kandr2/krx1.html
Γνώσεις ⇛ 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
Εκτύπωση

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

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