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

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

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

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

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

η fgets δηλαδη αν ξεπερασεις τα ορια του buff πχ 255+1 που το οριζεις αρχικα... δεν θα βρίσκει τον '\0' απο μονη της... οποτε θα τρεχει συνεχως μεχρι να τον βρει οποτε θα τρεχει αιωνια?! Δεν βάζει δηλαδη στο τελος ενα '\0' απο μονη της στο δοθέν string?
Γνώσεις ⇛ 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, 15:11

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

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

Ο ταχύτερος τρόπος να αντιστρέψεις ένα s με μια συνάρτηση, περνώντας της σαν όρισμα το s είναι να χρησιμοποιήσεις 2 τοπικούς, προσωρινούς δείκτες, έναν στην αρχή του s ( char *cp1 = s; ) κι έναν στο τέλος του τρέχοντος μήκος του s ( char *cp2 = s + strlen(s) - 1;)

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

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

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

Star_Light έγραψε:η fgets δηλαδη αν ξεπερασεις τα ορια του buff πχ 255+1 που το οριζεις αρχικα... δεν θα βρίσκει τον '\0' απο μονη της... οποτε θα τρεχει συνεχως μεχρι να τον βρει οποτε θα τρεχει αιωνια?! Δεν βάζει δηλαδη στο τελος ενα '\0' απο μονη της στο δοθέν string?

'\0' βάζει εγγυημένα, '\n' όμως δεν βάζει αν ο χρήστης πληκτρολογήσει περισσότερους από 255 χαρακτήρες... το '\n' το συμπεριλαμβάνει (και σταματάει) μόνο αν το πατήσει ο χρήστης πριν συμπληρωθεί το πλήθος-1 των χαρακτήρων, που της το περνάς σαν 2ο όρισμα.

έγραψε:
http://pubs.opengroup.org/onlinepubs/00 ... fgets.html

NAME

fgets - get a string from a stream

SYNOPSIS

#include <stdio.h>

char *fgets(char *restrict s, int n, FILE *restrict stream);

DESCRIPTION

The fgets() function shall read bytes from stream into the array pointed to by s, until n-1 bytes are read, or a <newline> is read and transferred to s, or an end-of-file condition is encountered. The string is then terminated with a null byte.

...
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, 15:34

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

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

EDIT:
Αν θέλεις να μην υπάρχει σίγουρα '\n' έτσι κι αλλιώς, αντί για fgets() διάβαζε το string με την s_get() ή ακόμα καλύτερα με την s_getflushed()... αυτές τις έχω φτιάξει έτσι ώστε εγγυημένα να μην υπάρχει '\n' στο διαβασμένο string!


βασικα βαζω #define N 5
και δινω μια συμβολοσειρα πχ 7 χαρακτηρων μου βγαζει το hello MEXΡΙ ΤΟ hell και μετα κατι ασυναρτησιες κατι paths απο το λειτουργικο αν καταλαβαινω καλα οποτε αυτο εννοεις οτι ξαναμπαινει σε loop????... κοιτα μπορω να παρω μια δικια σου ετοιμη συναρτηση απλα θελω να παιδευτω λιγο παραπανω για να μην σας ζαλιζω συνεχεια να τα καταλαβω τελειως να ξεμπερδευω!!!!!!

p.s Μεσα στην for δεν κανω ελεγχο για '\0' αλλα για '\n' .
Γνώσεις ⇛ 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, 15:49

Το "hell" είναι Ν-1 χαρακτήρες, δηλαδή Ν μαζί με το '\0' που βάζει η fgets()... άρα το διαβασμένο σου string ισούται με:

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

{'h', 'e', 'l', 'l', '\0'}

Εκεί μέσα δεν υπάρχει πουθενά '\n', οπότε πως περιμένεις να σταματήσει ποτέ ένα loop που εκτελείται πάνω στο διαβασμένο σου string μέχρι να βρει τον χαρακτήρα '\n' ;;;;;;;;

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

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

Δημοσίευσηαπό Qdata » 16 Αύγ 2011, 16:02

Παιδιά μου δημιουργήθηκε τώρα τελευταία μια απορία.Πχ στο σύστημά μου ο τύπος δεδομένων int δεσμεύει 4 bytes από την μνήμη μου(RAM).Εγώ έχω 2GB μνήμη RAM.Τι θα γίνει αν πχ δημιουργήσω πολλούς πίνακες σαν τον παρακάτω;
Κώδικας: Επιλογή όλων
int arr[1024];

Μπορώ να φτάσω στο σημείο ώστε να μου τελειώσει η ελεύθερη μνήμη και να μην μπορώ να χρησιμοποιώ άλλα προγράμματα;Στη συνέχεια θα πρέπει να δεσμεύσω και την Swap;Και αν γεμίσω και την κατάτμηση Swap τι γίνετε;Μπορώ να προκαλέσω τέτοια ζημιά με ένα πρόγραμμα που απλώς δημιουργεί πίνακες;
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

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

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

Qdata έγραψε:Παιδιά μου δημιουργήθηκε τώρα τελευταία μια απορία.Πχ στο σύστημά μου ο τύπος δεδομένων int δεσμεύει 4 bytes από την μνήμη μου(RAM).Εγώ έχω 2GB μνήμη RAM.Τι θα γίνει αν πχ δημιουργήσω πολλούς πίνακες σαν τον παρακάτω;
Κώδικας: Επιλογή όλων
int arr[1024];

Μπορώ να φτάσω στο σημείο ώστε να μου τελειώσει η ελεύθερη μνήμη και να μην μπορώ να χρησιμοποιώ άλλα προγράμματα;Στη συνέχεια θα πρέπει να δεσμεύσω και την Swap;Και αν γεμίσω και την κατάτμηση Swap τι γίνετε;Μπορώ να προκαλέσω τέτοια ζημιά με ένα πρόγραμμα που απλώς δημιουργεί πίνακες;


τι εννοεις να σου τελειωσει η ελευθερη μνημη? Καθε στιγμη στην RAM τρεχει ενα στιγμιοτυπο του προγραμματος βασικα το φορτωνει ο loader στην RAM οποτε καθε στιγμη αναλογα με την αποφαση του πυρηνα ο επεξεργαστης εκτελει ενα συγκεκριμενο προγραμμα που βρισκεται στην RAM. Αρα δεν τελειωνει κατι...
Τελευταία επεξεργασία από Star_Light και 16 Αύγ 2011, 16:09, έχει επεξεργασθεί 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/C++

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

migf1 έγραψε:Το "hell" είναι Ν-1 χαρακτήρες, δηλαδή Ν μαζί με το '\0' που βάζει η fgets()... άρα το διαβασμένο σου string ισούται με:

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

{'h', 'e', 'l', 'l', '\0'}

Εκεί μέσα δεν υπάρχει πουθενά '\n', οπότε πως περιμένεις να σταματήσει ποτέ ένα loop που εκτελείται πάνω στο διαβασμένο σου string μέχρι να βρει τον χαρακτήρα '\n' ;;;;;;;;

Αυτό που κάνει λοιπόν είναι να συνεχίζει και μετά το τέλος του string σου... ε, κάποια στιγμή σε κάποιο τυχαίο byte της μνήμης θα βρει κι ένα '\n' και θα σταματήσει :lol:

μαλιστα. Καταλαβα τι εννοεις... απλα εγω το ορισα μεσα στην for με την λογικη οτι ο χρηστης θα δινει μια φραση και θα παταει μετα enter επομενως τελειωνει το διαβασμα εκει. Απλα εσυ μιλας για οριακα σημεια δηλαδη στα σημεια που καποιος δωσει 255 μηκος συμβολοσειρα χαρακτηρων για να ειμαι ειλικρινης αυτο δεν το ειχα σκεφτει (οριακο) σημειο οταν εφτιαχνα τον κωδικα.
Γνώσεις ⇛ 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, 16:17

ααααα τωρα καταλαβα... δηλαδη αν εγω δωσω ας πουμε 4 χαρακτηρων συμβολοσειρα στο παραπανω με #define N 5 και πατουσα enter παλι δεν θα γινοταν αυτο το νταβαντουρι???? κανονικα πρεπει να δωσω 3 για να ειναι το ισοδυναμο string

Κώδικας: Επιλογή όλων
{ 'h', 'e' ,'l' , '\n' , '\0' }


Ή

Κώδικας: Επιλογή όλων
{'h' , 'e' , 'l' , '\n' }

οποτε και θα τελειωνε εδω ? επειδη βρισκει \n ας πουμε η fgets αρα τερματιζει.
Γνώσεις ⇛ 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, 16:35

@star_light: έτσι :) Αλλά στο 2ο παράδειγμα θα είχε κι ένα '\0' μετά το '\n'.

@qdata: στο συγκεκριμένο παράδειγμα, το arr[1024] πιάνει μόλις 1024 * 4 = 4096 bytes (δηλαδή 4 Kbytes). Στα σύγχρονα λειτουργικά συστήματα για το κάθε πρόγραμμα παραχωρείται συγκεκριμένη μνήμη κι αν αυτό ζητήσει περισσότερη από όση του έχει διατεθεί (π.χ. με malloc()) του εκχωρείται κι άλλη. Σε ότι αφορά την εξάντληση της RAM, αν πάει να συμβεί κάτι τέτοιο, τότε χρησιμοποιείται μέρος από το σκληρό σου δίσκο στα πλαίσια της διαχείρισης εικονικής μνήμης (virtual memory) που κάνει έτσι κι αλλιώς το λειτουργικό σύστημα.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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