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

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

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

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

Δημοσίευσηαπό migf1 » 08 Σεπ 2011, 15:26

Υποθέτω έχει να κάνει με τη εξειδίκευση της κάθε σχολής. Εγώ σπούδασα Computer Science στην Αμερική τη δεκαετία του '80 και κατόπιν εργάστηκα κιόλας για αρκετά χρόνια. Οπότε είναι λογικό να είμαι πλήρως εξοικειωμένος με αυτά τα πράγματα, που θεωρούνται (και είναι) στοιχειώδη! Για πιο σύνθετα πράγματα κι εγώ ανατρέχω σε βιβλιογραφία (απλά επειδή έχω περάσει πολλά, συνήθως ξέρω ακριβώς τι ψάχνω και που θα το βρω).

Σε αυτό το στάδιο που βρίσκετε εσείς τώρα, δηλαδή στο αρχικό της εκμάθησης, το βασικότερο από όλα είναι να εξαντλείτε το κάθε αντικείμενο που μαθαίνετε πριν πάτε σε άλλα που εν πολλοίς προϋποθέτουν να ξέρετε τα προηγούμενα... και να γράφετε κώδικα, πολύ κώδικα. Εγώ είμαι σίγουρος πως τόσο καιρό που συζητάμε δείκτες και strings εδώ, αν είχατε επικεντρωθεί σε αυτά χωρίς να πετάγεστε από εδώ κι από εκεί θα τα είχατε κάνει κτήμα σας τουλάχιστον εδώ κι ένα ενάμιση μήνα. Και όχι μόνο αυτό, αλλά θα καταλαβαίνατε πολύ καλύτερα τα πιο προχωρημένα όταν θα τα διαβάζατε αργότερα.

Δεν γίνεται να μάθει κάποιος ταυτόχρονα και C και python και shelll-scripting και δίκτυα και κρυπτογράφηση... είναι απλά αδύνατον! Ούτε γίνεται να κατανοήσει κάποιος τα δίκτυα ή την κρυπτογράφηση όταν δεν μπορεί να γράψει μόνος του 4 γραμμές κώδικα που θα αντιγράφει ένα string στο άλλο χωρίς bugs. Υπάρχει λόγος που τα πράγματα διδάσκονται σε συγκεκριμένη σειρά στα πανεπιστήμια.

Όλα αυτά με την προϋπόθεση πως θέλει όντως να μάθει. Αλλιώς μαθαίνει ένα high-level framework ή μια high-level γλώσσα όπου έχουν κάνει άλλοι τη "βρώμικη" δουλειά για αυτόν, κι απλά γράφει: string s1="αβγ", s2="1234567", s3 = s1+s2; όταν θέλει να κολλήσει το s2 στο τέλος του s1 και να πάρει το αποτέλεσμα στο s3.

Το παραπάνω είναι πολύ παραγωγικό, αλλά έχει το πρόβλημα πως συνήθως η παραγωγικότητα αυτή μένει στα τετριμμένα. Ακόμα και να παρέχει πιο προχωρημένα πράγματα η high-level γλώσσα ή το framework, είναι δύσκολο να τα κατανοήσει γρήγορα κάποιος χωρίς υπόβαθρο, ώστε να τα συνδυάσει σωστά όταν χρειαστεί να ξεφύγει από τα τετριμμένα. Αργά ή γρήγορα δηλαδή θα αναγκαστεί να μάθει και λίγο ή πολύ παρασκήνιο. Οπότε εφόσον έχει το χρόνο και την άνεση, είναι καλύτερα να το κάνει με τη σωστή σειρά ;)

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

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

Δημοσίευσηαπό migf1 » 08 Σεπ 2011, 15:40

Περιμένοντας λύσεις για την άσκηση με την αντιγραφή των strings, ορίστε μια ακόμα που είναι η 1η άσκηση που δίνεται για τους δείκτες.

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

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

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

Δημοσίευσηαπό stamatiou » 08 Σεπ 2011, 15:55

Ναι πιστεύω εγώ θα μπορούσα να γράψω το μισό της main, αν και όχι ολόκληρο μιας και δεν καταλαβαίνω τι κάνει αυτό { {0UL}, {0UL} }.
Όσο για την s_copy οκ γίνεται σωστά compile εκτός από εκείνο το return που δεν το άλλαξα γιατί δεν ξέρω τι να βάλω να επιστρέφει για να σηματοδοτεί πως κάτι πάει στραβά :problem:
Θα προσπαθήσω και την άσκηση που μόλις είπες :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Εκείνο ανήκει στα προχωρημένα Γιώργο (θα το πούμε όταν φτάσουμε στις δομές... αν φτάσουμε ποτέ :lol:)

Οπότε...έστω ότι ο δείκτης p δείχνει σε μια διεύθυνση μνήμης που περιέχει την ακέραια τιμή 13...
Κώδικας: Επιλογή όλων

p -> 13

Θέλουμε η άσκηση να μας τυπώνει τη διεύθυνση μνήμης του p (εκείνη η περιοχή μνήμης είναι που έχει fixed μέγεθος για όλους τους δείκτες), τη διεύθυνση του 13 (της μνήμης δηλαδή στην οποία περιέχεται το 13) και το 13

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

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

Δημοσίευσηαπό migf1 » 08 Σεπ 2011, 16:06

stamatiou έγραψε:
...
Όσο για την s_copy οκ γίνεται σωστά compile εκτός από εκείνο το return που δεν το άλλαξα γιατί δεν ξέρω τι να βάλω να επιστρέφει για να σηματοδοτεί πως κάτι πάει στραβά :problem:

Σου έχω απαντήσει σε αυτό, σου ξέφυγε μάλλον το post... η συνάρτηση πρέπει να να επιστρέφει το αντιγραμμένο dst ή NULL σε περίπτωση σφάλματος. Επίσης, πέρα από το compilation, δοκίμασε τον κώδικά σου με: dst[100] = {'\0'}, src[10] = "1234"; τι σου βγάζει; Κανονικά πρέπει να σου επιστρέψει το dst με περιεχόμενα: "1234".
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 08 Σεπ 2011, 16:08

migf1 έγραψε:Περιμένοντας λύσεις για την άσκηση με την αντιγραφή των strings, ορίστε μια ακόμα που είναι η 1η άσκηση που δίνεται για τους δείκτες.

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

Αυτό κάνει ο κώδικας που έδωσα προηγουμένως. Το 1ο μισό της main() (το μη συμβατό) δεν είναι προχωρημένο, είναι τετριμμένο για όποιον θέλει να λέει πως ξέρει δείκτες (το 2ο μισό της main() που χρησιμοποιεί struct με unions είναι όντως πιο προχωρημένο). Αισθάνεστε πως θα μπορούσατε να το γράψετε μόνοι σας το 1ο μισό της main();

Η διεύθυνση του δείκτη δεν είναι ίδια με αυτή που δείχνει ο δείκτης;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 08 Σεπ 2011, 16:12

migf1 έγραψε:
stamatiou έγραψε:
...
Όσο για την s_copy οκ γίνεται σωστά compile εκτός από εκείνο το return που δεν το άλλαξα γιατί δεν ξέρω τι να βάλω να επιστρέφει για να σηματοδοτεί πως κάτι πάει στραβά :problem:

Σου έχω απαντήσει σε αυτό, σου ξέφυγε μάλλον το post... η συνάρτηση πρέπει να να επιστρέφει το αντιγραμμένο dst ή NULL σε περίπτωση σφάλματος. Επίσης, πέρα από το compilation, δοκίμασε τον κώδικά σου με: dst[100] = {'\0'}, src[10] = "1234"; τι σου βγάζει; Κανονικά πρέπει να σου επιστρέψει το dst με περιεχόμενα: "1234".

Οκ, έκανα μια μικρή διόρθωση:
Spoiler: show
Κώδικας: Επιλογή όλων
char *s_copy( char *dst, const char *src )
{
if(!(dst) || !(src)) return NULL;
char *save = dst;
while ( (*dst++=*src++) )
;
return save;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 08 Σεπ 2011, 16:15

έγραψε:Η διεύθυνση του δείκτη δεν είναι ίδια με αυτή που δείχνει ο δείκτης;

Τσου! :lol:

Κοίτα, όταν π.χ. ορίζεις μια ακέραια μεταβλητή ( int n ) δεσμεύεται μια περιοχή μνήμης ( μεγέθους sizeof(int) ) η οποία θα περιέχει την τιμή της μεταβλητής αυτής. Οκ μέχρι εδώ.

Όταν ορίζεις μια μεταβλητή ως δείκτη ( int *p ) δεσμεύεται μια περιοχή μνήμης ( μεγέθους sizeof(int *) που είναι ίδιο με sizeof(char *) η οποινδήποτε άλλον τύπο ορίζεις για τον δείκτη σου) η οποία θα περιέχει την τιμή του δείκτη σου. Οι δείκτες ως τιμές παίρνουν διευθύνσεις άλλων μεταβλητών ;)

Οπότε , η μνήμη που έχει δεσμευτεί για την μεταβλητή p θα περιέχει την διεύθυνση της μνήμης που έχει δεσμευτεί για την μεταβλητή x ( που περιέχει την τιμή 6.5 στο σχέδιο που ακολουθεί).

Εικόνα

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

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

Δημοσίευσηαπό stamatiou » 08 Σεπ 2011, 16:21

Και πώς θα βρούμε τη διεύθυνση του καθενός; Όταν τυπώνουμε &p δλδ τυπώνουμε του δείκτη ή της μεταβήτής τη διεύθυνση;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 08 Σεπ 2011, 16:23

stamatiou έγραψε:Και πώς θα βρούμε τη διεύθυνση του καθενός; Όταν τυπώνουμε &p δλδ τυπώνουμε του δείκτη ή της μεταβήτής τη διεύθυνση;

Αυτό απάντησες πριν πως μπορείς να το κάνεις μόνος σου :lol:

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

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

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