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

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

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

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

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

Παρεμπιπτόντως, αν θες να έχεις απόλυτη ελευθερία με τα strings (και τους πίνακες γενικότερα) ξεκίνα να τους ορίζεις δυναμικά, και όχι στατικά.

Π.χ. αντί για έτσι...

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

#define MAXSLEN (80+1)
int main( void )
{
char s[ MAXSLEN ] = {'\0'};
...
}

έτσι...

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

#define MAXSLEN (80+1)
int main( void )
{
char *s = calloc( MAXSLEN, sizeof(char));
if ( !s ) {
/* calloc() failed... handle the error */
}
...
if ( s )
free( s );

exit( EXIT_SUCCESS);
}


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

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

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

Δηλαδη για να καταλάβω η μονη διαφορα με τους στατικους ειναι οτι πριν ας πουμε δέσμευες 80+1 και το χρησιμοποιούσες βρέξει χιονισει?
ενω εδω με την calloc δεσμέυεις κατα το runtime οσο χρειαστει ? Αλλα αυτο που καθε φορα χρειαζεται δεν μπορει να ειναι πανω απο ΜΑΧSLEN?

Επισης εγω νομιζα πως μέγιστο μήκος ενος string ειναι ιδια έννοια με το μέγεθος ενος string ειμαι λαθος έτσι? και αν ναι γιατι???

επισης μεσα στον κωδικα το if στα δεικτακια s1 και s2 πχ

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

if( !s1 && !s2)
{
printf(" * Error * ");
return;
}


Ποτε επιστρεφει ακριβως error σε εισοδο χρηστη εννοω. Εκτος και αν ειναι θεμα εσωτερικα στο συστημα και δεν καταφερει να υλοποιησει τους δεικτες ? :problem:
Γνώσεις ⇛ 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, 14:48

Star_Light έγραψε:Δηλαδη για να καταλάβω η μονη διαφορα με τους στατικους ειναι οτι πριν ας πουμε δέσμευες 80+1 και το χρησιμοποιούσες βρέξει χιονισει?
ενω εδω με την calloc δεσμέυεις κατα το runtime οσο χρειαστει ? Αλλα αυτο που καθε φορα χρειαζεται δεν μπορει να ειναι πανω απο ΜΑΧSLEN?

Σε στατικούς το (80+1) δεν μπορεί να αλλάξει, σε δυναμικούς το αυξομειώνεις όσο θέλεις, όποτε θέλεις με realloc(). Επίσης στους στατικούς το όνομα-δείκτης τους δεν μπορεί να χρησιμοποιηθεί ως LVALUE, ενώ στους δυναμικούς μπορεί.

έγραψε:Επισης εγω νομιζα πως μέγιστο μήκος ενος string ειναι ιδια έννοια με το μέγεθος ενος string ειμαι λαθος έτσι? και αν ναι γιατι???

Στα strings επειδή ένας χαρακτήρας έχει μέγεθος 1 byte (αν κι αυτό έχει πάψει να είναι εγγυημένο, νομίζω από την C99 και μετά) εκεί όντως το μέγεθος είναι ίσο με μέγιστο μήκος. Αν όμως ένας compiler δεν μεταφράζει το char σε 1 byte (πράγμα εξαιρετικά σπάνιο) τότε παύουν να ισοδυναμούν αυτοί οι 2 όροι.

Το πιο εύκολο παράδειγμα είναι ένα πίνακας από int, μιας και ο int καταλαμβάνει εγγυημένα τουλάχιστον 2 bytes σε όλους τους compiler. Οπότε, αν π.χ. στο σύστημά σου ο int καταλαμβάνει ας πούμε 4 bytes, τότε ένας πίνακας 10 ακεραίων έχει μέγιστο μήκος ίσο με 10 στοιχεία (χαρακτήρες αν είναι string) αλλά μέγεθος ίσο με 10x4 = 40 bytes.

έγραψε:επισης μεσα στον κωδικα το if στα δεικτακια s1 και s2 πχ

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

if( !s1 && !s2)
{
printf(" * Error * ");
return;
}


Ποτε επιστρεφει ακριβως error σε εισοδο χρηστη εννοω. Εκτος και αν ειναι θεμα εσωτερικα στο συστημα και δεν καταφερει να υλοποιησει τους δεικτες ? :problem:

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

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

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

οκ τα ιδια σκεφτόμασταν απλα ηθελα να τα επιβεβαιώσω .
Γνώσεις ⇛ 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, 14:56

migf1 έγραψε:
...
Αυτός ο έλεγχος εγγυάται πως το πρόγραμμά σου δεν θα κρασάρει αν έστω και κατά λάθος σε κάποιο σημείο του κώδικά σου περνάς κάποιο από τα s1, s2 ή και τα 2 ως NULL στην εν λόγω συνάρτηση.

Π.χ. ...

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

void test( char *s )
{
// bla bla
}

int main( void )
{
char *s = NULL;
...
// έχω ξεχάσει να δημιουργήσω το s
...
test( s );
...
}

Χωρίς έλεγχο για !s μέσα στην test() ο παραπάνω κώδικας θα παράξει seg-fault, με τον έλεγχο θα κάνει ότι του έχεις πει εσύ να κάνει σε αυτή την περίπτωση ;)
Τελευταία επεξεργασία από migf1 και 16 Φεβ 2012, 15:00, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Btw, o σωστός έλεγχος είναι if (!s1 || !s2) και όχι if (!s1 && !s2)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

migf1 έγραψε:Btw, o σωστός έλεγχος είναι if (!s1 || !s2) και όχι if (!s1 && !s2)


Οκ κατάλαβα !

Αυτο που δεν μπορω ακομη να καταλαβω ειναι πως δουλευουν και τα 2 string
που έχουν διαφορετικό τρέχον μήκος (λογικα για αυτο θα με διορθωσες πριν γιατι ελεγα για ανομοιο που αυτο ειναι άλλο)
με την while ( s1[i] || s2[i]!='\0') αν το 1 ειναι μικροτερο απο το αλλο δεν θα σταματησουμε πριν τελειωσει η ολη διαδικασια ?
Γνώσεις ⇛ 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, 15:16

Star_Light έγραψε:
migf1 έγραψε:Btw, o σωστός έλεγχος είναι if (!s1 || !s2) και όχι if (!s1 && !s2)


Οκ κατάλαβα !

Αυτο που δεν μπορω ακομη να καταλαβω ειναι πως δουλευουν και τα 2 string
που έχουν διαφορετικό τρέχον μήκος (λογικα για αυτο θα με διορθωσες πριν γιατι ελεγα για ανομοιο που αυτο ειναι άλλο)
με την while ( s1[i] || s2[i]!='\0') αν το 1 ειναι μικροτερο απο το αλλο δεν θα σταματησουμε πριν τελειωσει η ολη διαδικασια ?

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

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

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

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

Ναι αλλα γιατι μολις τελειωσει το string με μεγαλύτερο τρέχον μήκος και οχι αυτο με το μικρότερο?
Αφου ειναι διάζευξη αρα ή το ένα ή το αλλο... εγω τουλαχιστον απο τις πιθανοτητες ετσι το θυμαμαι :ugeek:

ΕΠισης να ξεκαθαρισουμε και κατι ακομη.... ανομοια ειναι αυτα με διαφορετικο μεγιστο μήκος ετσι και δεν μπορουμε να τα εναλλαξουμε
(αν ειναι στατικα) διοτι διαφορετικο μέγεθος εχει ανατεθει στο ενα και στο αλλο... Ισως για αυτο δεν ειναι σωστο να οριζω 2 define για 2 πινακες
που τελικα έχουν το ιδιο μεγεθος πχ

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


#define N 6
#define M 6



αλλα

Κώδικας: Επιλογή όλων
define SIZE 6
Τελευταία επεξεργασία από Star_Light και 16 Φεβ 2012, 15:24, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ 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, 15:21

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

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

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