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

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

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

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

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

Αν sizeof(void *) = 4 bytes...

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

#define MAXLEN whatever

char s[MAXLEN] = {'\0'};
/* τρέχον μήκος = strlen(s) = 0; */
/* μέγεθος (bytes) = sizeof(s) = MAXLEN * sizeof(char) */
/* μέγιστο μήκος = (sizeof(s) / sizeof(char)) = MAXLEN */
0 1 2 3 4 5 6 7 8 9
'\0' '\0' '\0' '\0' '\0' '\0' '\0' '\0' '\0' '\0'

char s[MAXLEN] = "abc";
/* τρέχον μήκος = strlen(s) = 3; */
/* μέγεθος (bytes) = sizeof(s) = MAXLEN * sizeof(char) */
/* μέγιστο μήκος = (sizeof(s) / sizeof(char)) = MAXLEN */
0 1 2 3 4 5 6 7 8 9
'a' 'b' 'c' '\0' '\0' '\0' '\0' '\0' '\0' '\0'

char *s = NULL;
/* τρέχον μήκος = strlen(s) = strlen(NULL) = segmenation fault */
/* μέγεθος (bytes) = sizeof(s) = sizeof(void *) = 4 bytes */
/* μέγιστο μήκος = (sizeof(s) / sizeof(char)) = 4 / 1 = 4 --- ΠΟΥ ΕΙΝΑΙ ΛΑΘΟΣ */

char *s = NULL;
s = calloc( MAXLEN, sizeof(char));
if ( s != NULL )
// πέτυχε το calloc()
/* τρέχον μήκος = strlen(s) = 0; */
/* μέγεθος (bytes) = MAXLEN * sizeof(char) */
/* μέγιστο μήκος = MAXLEN */
0 1 2 3 4 5 6 7 8 9
'\0' '\0' '\0' '\0' '\0' '\0' '\0' '\0' '\0' '\0'
else
// απέτυχε το calloc(), s is NULL

char *s = NULL;
s = calloc( MAXLEN, sizeof(char));
if ( s != NULL )
// πέτυχε το calloc()
strcpy(s, "abc");
/* τρέχον μήκος = strlen(s) = 3; */
/* μέγεθος (bytes) = MAXLEN * sizeof(char) */
/* μέγιστο μήκος = MAXLEN */
0 1 2 3 4 5 6 7 8 9
'a' 'b' 'c' '\0' '\0' '\0' '\0' '\0' '\0' '\0'
else
// απέτυχε το calloc(), s is NULL
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Star_Light έγραψε:ααα οκ δεν εννοουσες μεσα στην if. Τελοςπαντων.... απο οτι βλεπω εχουν προκυψει θεματακια τα οποια ελπιζω μαζι και με την ασκηση που έδωσες να τα έχω βγαλει μεχρι τελος Φεβρουαριου για να μπορεσω να συνεχισω το κολπο με τις κρυπτογραφησεις. -.-

Εγώ φρικάρω όταν για παράδειγμα έχουμε εξηγήσει 1.000.000 φορές γιατί πρέπει τους δείκτες να τους αρχικοποιούμε όταν τους ορίζουμε (είτε σε NULL είτε με κλήση σε malloc()/calloc() ) και εσύ εξακολουθείς να μου δείχνεις κώδικα που ξεκινάει έτσι...

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

char *s;
...

ή όταν σου ποστάρω καμιά 10αριά παραδείγματα που χρησιμοποιούν calloc() για την δημιουργία strings επειδή επίσης έχουμε εξηγήσει πως είναι πιο ασφαλής από την mallloc() μιας και μηδενίζει τη μνήμη που δεσμεύει, κι εσύ μου ποστάρεις κώδικες που δημιουργούν δυναμικά strings με malloc().

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

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

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

Τώρα, σχετικά με την άσκηση, αν αποφασίσεις να την κάνεις (δηλαδή για το διάβασμα ανεξαρτήτως πλήθους χαρακτήρων) η βασική ιδέα είναι δημιουργήσεις δυναμικά ένα string π.χ. 16 χαρακτήρων, και όταν ο χρήστης φτάσει στον 15ο, τότε να κάνεις realloc() το string για άλλους 16 χαρακτήρες (δηλαδή 32 συνολικά), και πάει λέγοντας, μέχρι να πατήσει ENTER.

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

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

Δημοσίευσηαπό Star_Light » 16 Φεβ 2012, 19:24

Ναι ενταξει εχεις δικιο .

Θα δοκιμασω παραδειγμα απευθειας με την calloc το θυμομουν αυτο που ειχες πει.

Να ρωτησω κατι αλλο οταν ο προγραμματιστης εξαρχης αποφασιζει για το MAXSLEN οπως ειπες και και δεν το ζηταει απο το χρηστη στο runtime
και κατανέμει μνημη βάση αυτου τοτε αν εχει βαλει 20+1 τοτε αυτη η μνημη καταρχην δημιουργειται κατα το runtime ????
Και τι θα συμβει αν ο χρηστης δωσει 15 ας πουμε.... η αλλη μενει αχρησιμοποιητη??? αλλα και παλι δεν μας ενδιαφερει μιας
και στο τελος θα την κάνουμε 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 » 16 Φεβ 2012, 19:27

Star_Light έγραψε:Ναι ενταξει εχεις δικιο .

Θα δοκιμασω παραδειγμα απευθειας με την calloc το θυμομουν αυτο που ειχες πει.

Να ρωτησω κατι αλλο οταν ο προγραμματιστης εξαρχης αποφασιζει για το MAXSLEN οπως ειπες και και δεν το ζηταει απο το χρηστη στο runtime
και κατανέμει μνημη βάση αυτου τοτε αν εχει βαλει 20+1 τοτε αυτη η μνημη καταρχην δημιουργειται κατα το runtime ????
Και τι θα συμβει αν ο χρηστης δωσει 15 ας πουμε.... η αλλη μενει αχρησιμοποιητη??? αλλα και παλι δεν μας ενδιαφερει μιας
και στο τελος θα την κάνουμε free ε?

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

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

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

Star_Light έγραψε:
Θα δοκιμασω παραδειγμα απευθειας με την calloc το θυμομουν αυτο που ειχες πει.

Η calloc() εκτός από ότι μηδενίζει τη μνήμη αυτόματα, σε εξαναγκάζει κιόλας να διαχωρίσεις στο μυαλό σου το length από το size, γιατί το 1ο της όρισμα είναι length και το 2ο το μέγεθος του κάθε στοιχείου (και προφανώς τα πολλαπλασιάζει μόνη της εσωτερικά).
Τελευταία επεξεργασία από migf1 και 16 Φεβ 2012, 19:33, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 16 Φεβ 2012, 19:32

Αν ρε παιδι μου εχεις εξαρχης ορισει εσυ σε ενα προγραμμα το μέγιστο μήκος ενος string
και μετα καλεις την calloc για να κατανείμεις μνημη για αυτο. ΑΝ τωρα ο χρηστης δεν δωσει οσο ειναι αυτο
αλλα δωσει μικροτερο μηκος... τοτε ο χωρος που μενει αδειος τι γινεται? απλα έχει γεμισει απο πριν με τους κενους
χαρακτηρες και στο τελος γινεται free ετσι? ενω σε εναν πινακα δεν θα γινοταν (στατικο) οποτε εδω κολλαει το δυναμικο

οκ... νταξει.... θα διαβασω και για την calloc και θα κανω την ασκηση που έβαλες.
Γνώσεις ⇛ 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 » 16 Φεβ 2012, 19:40

Star_Light έγραψε:Αν ρε παιδι μου εχεις εξαρχης ορισει εσυ σε ενα προγραμμα το μέγιστο μήκος ενος string
και μετα καλεις την calloc για να κατανείμεις μνημη για αυτο. ΑΝ τωρα ο χρηστης δεν δωσει οσο ειναι αυτο
αλλα δωσει μικροτερο μηκος... τοτε ο χωρος που μενει αδειος τι γινεται? απλα έχει γεμισει απο πριν με τους κενους
χαρακτηρες και στο τελος γινεται free ετσι? ενω σε εναν πινακα δεν θα γινοταν (στατικο) οποτε εδω κολλαει το δυναμικο

Και πάλι δεν καταλαβαίνω. Καταρχήν δεν είσαι υποχρεωμένος να δημιουργήσεις το string προκαταβολικά, μπορείς να το δημιουργήσεις εάν, όταν και στο μέγεθος που θα σου ζητήσει ο χρήστης. Έπειτα ο ορισμός ενός δείκτη: char *s δεν δημιουργεί string, δημιουργεί ένα δείκτη που δείχνει σε undefined περιοχή μνήμης. Το string το δημιουργεί η ανάθεση του δείκτη στη τιμή επιστροφής της malloc() ή της calloc(). Για την ακρίβεια η malloc()/calloc() δεσμεύουν το κομμάτι της μνήμης που ζήτησες, και με την ανάθεση της τιμής επιστροφής τους στον δείκτη σου τον βάζεις να δείχνει σε εκείνη τη μνήμη.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 16 Φεβ 2012, 19:48

ΟΚ. επειδη μου ειπες οτι ειναι δικια μου αποφαση αρχικα να το φτιάξω με MAXSLEN ή με καποιο νουμερο απο τον χρηστη .
Γνώσεις ⇛ 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 » 16 Φεβ 2012, 19:57

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

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

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

cron