Δημοσιεύτηκε: 03 Σεπ 2011, 09:42
από migf1
Star_Light έγραψε:Bασικα τo char δεν εχουμε πει οτι ειναι μέγεθος 1 byte ??? πως και το βάζεις 4 ? στα 2 πρωτα?

Αυτό είναι ένα από τα βασικά σημεία που ήθελα να ξεδιαλύνουμε.

Λοιπόν, στα
Κώδικας: Επιλογή όλων
char *s
char *s = NULL
το s δεν ορίζεται ως σκέτο char (τότε θα είχε μέγεθος 1 byte) αλλά ως δείκτης σε char.

Οι μεταβλητές που ορίζονται ως δείκτες έχουν πάντα το ίδιο μέγεθος στη μνήμη, είτε ορίζονται να δείχνουν σε char, είτε σε int, είτε σε struct είτε σε οποιονδήποτε άλλον τύπο. Το μέγεθος αυτό είναι implementation dependent, αλλά πολύ συχνά είναι ίσο με sizeof( unsigned int ).

Για να δείτε το μέγεθος που πιάνουν οι δείκτες στη δική σας πλατφόρμα/compiler ορίστε έναν οποιονδήποτε δείκτη, π.χ. float *ptr; και κατόπιν τυπώστε το αποτέλεσμα του: sizeof( ptr );

έγραψε:στο 4 πχ το 1 byte που βάζεις ειναι επειδη τουλαχιστο θα έχει τον κενό χαρακτήρα? ακομη και αν ο χρηστης δεν δωσει καμια συμβολοσειρα.
Κώδικας: Επιλογή όλων
char s[] = ""; // αρχικοποιημένο string (1 byte)

Εδώ το s ορίζεται & αρχικοποιείται ως string. Δεν θα έχει τουλάχιστον έναν χαρακτήρα, έχει ήδη μόνο έναν χαρακτήρα (τον μηδενικό) λόγω της συγκεκριμένης αρχικοποίησης και δεν μπορεί να έχει περισσότερους. Οποιαδήποτε μετέπειτα απόπειρα να του βάλουμε περισσότερους από 1 χαρακτήρα θα μας δώσει segmentation-fault (crash).

έγραψε:ΣΤο 5 και 6 συμφωνουμε οκ στο 7 παιρνει την τιμη του μεγέθους του πίνακα ε?
Κώδικας: Επιλογή όλων

char s[] = "testing"; // αρχικοποιημένο string (8 bytes)
char s[8] = "testing"; // αρχικοποιημένο string (8 bytes)
char s[100] = "testing"; // αρχικοποιημένο string (100 bytes)

Ωραία, οι ορισμοί 5 και 6 είναι ισοδύναμοι: ορίζουν κι αρχικοποιούν ένα string με μέγεθος 8 χαρακτήρων (8 bytes). Κανένα από τα 2 δεν μπορεί να δεχτεί περισσότερους από 8 χαρακτήρες, συμπεριλαμβανομένου του μηδενικού στο τέλος.

0 7ος ορισμός είναι διαφορερτικός! Ορίζει ένα string μεγέθους 100 χαρακτήρων (100 bytes) αλλά το αρχικοποιεί με μια τιμή που πιάνει 8 χαρακτήρες (συμπεριλαμβανομένου του μηδενικού χαρακτήρα στο τέλος). Μπορεί όμως να δεχτεί τιμές που εχουν πλήθος έως και 100 χαρακτήρες (συμπεριλαμβανομένου του μηδενικού χαρακτήρα στο τέλος).

έγραψε:και στο 8 οκ.
Κώδικας: Επιλογή όλων
char s[80]; // μη-αρχικοποιημένο string (80 bytes)

Εδώ το ακριβές σχόλιο που έπρεπε να κάνω θα ήταν: // μη-αρχικοποιημένος πίνακας χαρακτήρων (80 bytes). Αντί για "πίνακας" έγραψα "string" για να μη χαθεί τελείως η μπάλα.

Βασικά η μπάλα είναι έτσι κι αλλιώς λίγο χαμένη με τα strings στη C, γιατί δεν τα υποστηρίζει εγγενώς ως ξεχωριστό τύπο δεδομένων (data type). Για να τα διαχειριστούμε μας αναγκάζει να τα ορίσουμε είτε σαν πίνακες χαρακτήρων είτε σαν μια συνεχόμενη σειρά από χαρακτήρες στη μνήμη, με έναν δείκτη στον 1ο από αυτούς. Είτε στην 1η είτε στη 2η περίπτωση (και με εξαίρεση τις επί τούτου αρχικοποιήσεις κατά τον ορισμό των strings) το αφήνει πάνω μας να σηματοδοτήσουμε το τρέχον μήκος του κάθε string με τον μηδενικό χαρακτήρα. Το οποίο όμως τρέχον μήκος δεν ισούται κατά ανάγκη με το συνολικό μέγεθος του string.

Που είναι η μπάλα οεο; :lol:

Πάω να κάνω κάτι δουλίτσες κι επανέρχομαι σε καμιά ωρίτσα για τυχόν απορίες πάνω σε αυτό.

έγραψε:ΤΩρα κατι αλλο... δεν ειναι ισοδυναμο να πω ας πουμε οτι το char *s="testing" ειναι ενας δεικτης σε συμβολοσειρα testing με το αρχικοποιημενο string που λες και εσυ?

Επειδή με τις Ελληνικές ορολογίες δεν τα πάω πολύ καλά (τα έχω διδαχτεί στην αγγλική γλώσσα) αν η "συμβολοσειρά" είναι το ακριβές ισοδύναμο του "string" (και όχι π.χ του "string literal") τότε δεν ισχύει αυτό που γράφεις.

Δείκτης σε string θα μπορούσε π.χ. να είναι κάποιο από τα παρακάτω:
Κώδικας: Επιλογή όλων

char *ps[STRINGSIZE];
char **ps;

τα οποία βασικά είναι πίνακες από strings.

έγραψε:
Π.Σ Στο μεταξυ εκανα και τα test cases και στον κωδικα με την συναρτηση για τις δυναμεις και διαπιστωσα πως ολα οκ εκτος και αν και η βάση αλλα και ο εκθέτης ειναι διψηφιοι εκει πλεον το αποτελεσμα ξεφευγει και δεν δινει σωστες τιμες. Εδω ας πουμε τι θα μπορουσαμε να κανουμε ?

(σε καμιά ωρίτσα που θα επιστρέψω ;) )