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

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

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

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

Δημοσίευσηαπό migf1 » 16 Αύγ 2011, 13:23

Η func() οκ είναι, με εξαίρεση πως δεν διαγράφεις το '\n' που βάζει στο str η fgets(). Η rev_func() δεν είναι οκ, γιατί το str_ptr δεν το αρχικοποιείς πουθενά!!!!

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

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

Δημοσίευσηαπό Star_Light » 16 Αύγ 2011, 13:26

εχει λογικα σφαλματα... επειδη αν παω να αλλαξω γραμμη... γινεται ροιδο. xD

δεν θελω να κοιταξω τελειως τον κωδικα σου 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/C++

Δημοσίευσηαπό Star_Light » 16 Αύγ 2011, 13:27

migf1 έγραψε:Η func() οκ είναι, με εξαίρεση πως δεν διαγράφεις το '\n' που βάζει στο str η fgets(). Η rev_func() δεν είναι οκ, γιατί το str_ptr δεν το αρχικοποιείς πουθενά!!!!

ΥΓ. Επίσης μονούς χαρακτήρες τύπωνέ τους με την putchar() γιατί η printf() είναι πάααρα πολύ αργή συνάρτηση. Α, και for με μια μόνο γραμμή κυρίως σώματος δεν χρειάζονται άγκιστρα ;)



ααααα για αυτο οταν παταω εντερ στο προγραμμα μου βγαζει πρωτα την μια εξοδο και μετα την αλλη ε??? Γιατι εχουμε πει πως στα GUI καθε εισοδος ειναι ενα string. Μα δεν ηθελα να αρχικοποιησω τον δεικτη στην 2η συναρτηση με την λογικη οτι διατηρει την τιμη του απο πριν βεβαια αυτο που με προβληματισε ειναι οτι δεν υπαρχει πουθενα call by ref.

π.σ η putchar μου δειχνει ο μεταγλωτιστης πως παιρνει ορισμα τυπου int ενω το *ptr_str ειναι δεικτης σε chars επομενως πως και μου τρέχει? :P
Γνώσεις ⇛ 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 » 16 Αύγ 2011, 13:44

Το *ptr_str είναι χαρακτήρας, το ptr_str είναι ο δείκτης.

Νομίζω είναι καλύτερα να δεις πρώτα τον κώδικά μου, κι αφού βεβαιωθείς πως έχεις καταλάβει πως και γιατί λειτουργεί (ειδικά η χρήση του προσωρινού δείκτη: cp) τότε να προσπαθήσεις να κάνεις μόνος σου κάποια άλλη άσκηση.

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

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

Δημοσίευσηαπό migf1 » 16 Αύγ 2011, 13:51

Star_Light έγραψε:
Μα δεν ηθελα να αρχικοποιησω τον δεικτη στην 2η συναρτηση με την λογικη οτι διατηρει την τιμη του απο πριν βεβαια αυτο που με προβληματισε ειναι οτι δεν υπαρχει πουθενα call by ref.

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

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

Δημοσίευσηαπό Star_Light » 16 Αύγ 2011, 13:52

migf1 έγραψε:->Το *ptr_str είναι χαρακτήρας, το ptr_str είναι ο δείκτης.

Νομίζω είναι καλύτερα να δεις πρώτα τον κώδικά μου, κι αφού βεβαιωθείς πως έχεις καταλάβει πως και γιατί λειτουργεί (ειδικά η χρήση του προσωρινού δείκτη: cp) τότε να προσπαθήσεις να κάνεις μόνος σου κάποια άλλη άσκηση.

Π.χ. μια συνάρτηση που θα ανακατεύει τους χαρακτήρες ενός string s που θα παίρνει σαν όρισμα. Ή δικές σου υλοποιήσεις των έτοιμων συναρτήσεων strncmp() και strncpy(). Ή μια συνάρτηση που θα παίρνει σαν όρισμα ένα strings s και θα συγκεντρώνει στην αρχή του s όλα τα σύμφωνα, στο τέλος του όλα τα φωνήεντα, και στη μέση όποιους χαρακτήρες δεν είναι γράμματα . Για ευκολία θεώρησε πως έχεις μόνο λατινικά γράμματα στο s.


ναι σωστα! ΛΟγω κεκτημενης το ειπα λαθος. Οκ!!! Θα δω τον κωδικα σου.

migf1 έγραψε:
Πως να τη διατηρήσει την τιμή του, αφού είναι ορισμένο ως τοπική μεταβλητή της func() οπότε όταν τερματίσει η συνάρτηση διαγράφεται ο δείκτης. Το ότι σου δουλεύει, αν σου δουλεύει, είναι τυχαίο.


ακριβως!!!!! Ισα ισα και να μου δουλευε κανονικα.... θα ερχομουν παλι να ρωτησω πως γινεται να δουλευει αυτο το πραγμα λολ.
Γνώσεις ⇛ 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 » 16 Αύγ 2011, 14:19

Κώδικας: Επιλογή όλων
for (cp = s; *cp != '\0' && *cp != '\n'; cp++) // έως ότου βρεις '\0' ή '\n'
; // ... επανέλαβε


γιατι ή? εφοσον χρησιμοποιεις τον τελεστη && θες και τα 2 να ειναι TRUE
Γνώσεις ⇛ 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 » 16 Αύγ 2011, 14:41

Star_Light έγραψε:
Κώδικας: Επιλογή όλων
for (cp = s; *cp != '\0' && *cp != '\n'; cp++) // έως ότου βρεις '\0' ή '\n'
; // ... επανέλαβε


γιατι ή? εφοσον χρησιμοποιεις τον τελεστη && θες και τα 2 να ειναι TRUE

Ναι, απλά όταν το περιγράφεις με λόγια η συνθήκη σταματάει είτε όταν εκπληρωθεί η 1η σύγκριση είτε η 2η, γιατί αν π.χ. βρει '\n' τότε το *cp != '\n' γίνεται FALSE, οπότε TRUE && FALSE δίνει FALSE, οπότε σταματάει το loop. Ομοίως, αν βρει '\0' γίνεται FALSE το *cp != '\0'.

Οπότε στην πράξη το loop σταματάει όταν βρει '\0' ή όταν βρει '\n'. Τον έλεγχο για το '\0' τον έβαλα για την περίπτωση που ο χρήστης μας πληκτρολογήσει περισσότερους από MAX_SLEN χαρακτήρες, οπότε σε αυτές τις περιπτώσεις η fgets() βάζει το '\0' στον MAX_SLEN-1 χαρακτήρα του s, χωρίς να περιέχεται καθόλου '\n' στο s.

Αν δεν έβαζα αυτόν τον έλεγχο και άφηνα μονάχα τον *cp != '\n' τότε σε περιπτώσεις όπως η παραπάνω το loop θα έτρεχε... αιώνια :lol:

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

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

Δημοσίευσηαπό Star_Light » 16 Αύγ 2011, 14:46

migf1 έγραψε:
Ναι, απλά όταν το περιγράφεις με λόγια η συνθήκη σταματάει είτε όταν εκπληρωθεί η 1η σύγκριση είτε η 2η, γιατί αν π.χ. βρει '\n' τότε το *cp != '\n' γίνεται FALSE, οπότε TRUE && FALSE δίνει FALSE, οπότε σταματάει το loop. Ομοίως, αν βρει '\0' γίνεται FALSE το *cp != '\0'.

Οπότε στην πράξη το loop σταματάει όταν βρει '\0' ή όταν βρει '\n'. Τον έλεγχο για το '\0' τον έβαλα για την περίπτωση που ο χρήστης μας πληκτρολογήσει περισσότερους από MAX_SLEN χαρακτήρες, οπότε σε αυτές τις περιπτώσεις η fgets() βάζει το '\0' στον MAX_SLEN-1 χαρακτήρα του s, χωρίς να περιέχεται καθόλου '\n' στο s.

Αν δεν έβαζα αυτόν τον έλεγχο και άφηνα μονάχα τον *cp != '\n' τότε σε περιπτώσεις όπως η παραπάνω το loop θα έτρεχε... αιώνια :lol:

ΥΓ. Τελικά θα φύγω αύριο κι εγώ.


α ναι.

Κοιταξε εγω το εχω αφησει ετσι

Κώδικας: Επιλογή όλων
for(str_ptr=str; *str_ptr!='\n'; str_ptr++)


θεωροντας πως θα σταματησει μολις ο χρηστης δωσει την φραση του και πατησει εντερ γιατι να τρεχει αιωνια δηλαδη???
εκτος και αν ο χρηστης πληκτρολογει αιωνια.... βεβαια καταλαβαινω την λογικη σου στα παραπανω... επομενος στοχος ειναι να παιζω με ολα αυτα
αλλα δημιουργωντας και μια δευτερη συναρτηση στην οποια θα βαζω εκει να υπολογιζει το αντιστροφο της φρασης μας και θα την καλω με αναφορα.
Γνώσεις ⇛ 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 » 16 Αύγ 2011, 14:52

Μα σου εξήγησα γιατί θα τρέχει αιώνια σε περίπτωση που ο χρήστης σου πληκτρολογήσει περισσότερους από MAX_SLEN χαρακτήρες στην κύρια είσοδο. Δεν θα υπάρχει '\n' μέσα στο string σε αυτή την περίπτωση (μονάχα '\0' θα υπάρχει).

Δοκίμασέ το και μόνος σου, βάλε το MAX_SLEN ίσο ξέρω γω με 5 και στην κύρια είσοδο πληκτρολόγησέ του 7 χαρακτήρες... θα μπει σε infinite loop αν δεν κάνεις έλεγχο και για '\0'.

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

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

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