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

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

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

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

Δημοσίευσηαπό stamatiou » 30 Αύγ 2011, 18:21

Ευχαριστώ πολύ! Λοιπόν λογικά το *save=s1 σημαίνει εάν δηλώνεται εκείνη τη γραμμή ότι το save κάνει point στο s1 και (γι αυτό δεν είμαι σίγουρος :D ) το return share εάν ειναι συμβολοσειρά επιστρέφει τον πρώτο χαρακτήρα της συμβολοσειράς και αν είναι ένας pointer σε κάτι άλλο μάλλον τη διεύθυνση...
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 30 Αύγ 2011, 18:34

Να ρωτήσω τώρα κάτι άσχετο;
1. Ποιο είναι το μέγεθος ενός αριθμού που είναι από το 0-255;
2. Αν θέλουμε να βάλουμε μερικά 0 σε ένα μια ακολουθία από bits χωρίς να αλλοιωθεί, η μόνη λύση είναι να τα βάλουμε στην αρχή;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 30 Αύγ 2011, 18:41

Δεν είναι: *save = s1; αλλά: save = s1;

Στον κώδικα που έχω δώσει είναι αρχικοποίηση: char *save = s1; Δηλαδή ορισμός και ανάθεση αρχικής τιμής σε ένα βήμα.

ΥΓ1. Γιώργο, με "a", "ab" δεν λειτουργεί σωστά, αλλά αλγοριθμικά το έχεις προσεγγίσει πολύ! :) Τον έλεγχο για το αν το s1[i] είναι '\0' βγάλτο από τη συνθήκη του loop και βάλτο με ένα if μέσα στο loop... αν ισχύει, επέστρεφε 0. Έξω από το loop επέστρεψε: s1[i] - s2[--i] :)

ΥΓ2. Κώστα, έχω την εντύπωση πως το %p δεν είναι στάνταρ, δεν είμαι 100% σίγουρος όμως.
Star_Light έγραψε:
stamatiou έγραψε:Αυτό το %p στην printf τι είναι; Πρώτη φορά το βλέπω! Έγραψα στο terminal man printf αλλά μου έβγαλε (μάλλον) μια εντολή του bash...


Ο μορφοποιητης %p φιλε σταματιου χρησιμοποιειται απο την ANSI τυποποιηση εχω διαβασει πως αν για καποιο λογο ο μεταγλωτιστης σου δεν το υποστηριζει μπορεις να δοκιμασεις με τους %u ή %lu .

Btw Με αυτη την "παρουσιαση" που εκανα καταλαβα και τα *s1=*s2 γιατι μπορουμε να τα χρησιμοποιησουμε απευθειας αλλωστε οι συμβολοσειρες ειναι πινακες χαρακτηρων. Τωρα μενει μονο να καταλαβω γιατι *save=s1;
και return save; Απλα δεν καταλαβαινω το γεγονος οτι δηλαδη το *save περιμενει δεξια τιμη λογω αστερισκου αρα πως του βάζουμε εμεις αριστερη τιμη... εχω φαει κομπλα σε αυτο γερη. Παω να ψωνισω τιποτα απο το σουπερμαρκετ και επανερχομαι. :lol: :lol:

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

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

Δημοσίευσηαπό stamatiou » 30 Αύγ 2011, 18:54

Ωπ, το char *save = s1 νόμιζα πως ήταν ότι το save κάνει point στο s1. Αν θέλουμε να το κάνουμε να πάρει απλά την τιμή τι πρέπει να κάνουμε;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

stamatiou έγραψε:Να ρωτήσω τώρα κάτι άσχετο;
1. Ποιο είναι το μέγεθος ενός αριθμού που είναι από το 0-255;
2. Αν θέλουμε να βάλουμε μερικά 0 σε ένα μια ακολουθία από bits χωρίς να αλλοιωθεί, η μόνη λύση είναι να τα βάλουμε στην αρχή;

1. Αν εννοείς πόσο χώρο πιάνει στη μνήμη, τότε 1 byte (δηλαδή 8 bits)... στη C το μόνο data type που πιάνει εγγυημένα 1 byte είναι το char. Αν είναι δηλωμένο unsigned (δλδ χωρίς πρόσημο, μόνο θετικοί) μπορεί να φιλοξενήσει τιμές από το 0 έως το 255. Αν είναι δηλωμένο ως signed τότε μπορεί να φιλοξενήσει τιμές από -128 έως 127.

Όταν μιλάμε για unsigned μπορείς να το υπολογίσεις και μόνος σου, αφού το κάθε bit είναι ουσιαστικά μια δύναμη του 2, ξεκινώντας από την 0. Για παράδειγμα σε ένα byte, που έχει δλδ 8 bits, η μέγιστη τιμή που μπορεί να φιλοξενήσει υπολογίζεται ως εξής:
2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 + 2^7 (που ισούται με 255 ;) )

Για τους αρνητικούς αριθμούς (signed) συνήθως χρησιμοποιείται μια τεχνική που λέγεται 2's Complement, αλλά αρκετά σε έπρηξα :lol: Γκουγκλάρισέ το αν θες να δεις τι κάνει (βασικά αντιστρέφει όλα τα bits του θετικού και προσθέτει το 1).

Βέβαια οι σύγχρονοι υπολογιστές δεν μπορούν να αναφερθούν σε 1 μόνο byte, αναφέρονται στα λεγόμενα words που ανάλογα την πλατφόρμα μπορεί να είναι από 2, 4 ακόμα και 8 bytes (16, 32 και 64 bits αντίστοιχα)... υπάρχουν κι ενδιάμεσα words, π.χ. με 24 bits αλλά είναι πιο σπάνια).

Οπότε αν π.χ. η πλατφόρμα σου δουλεύει με 16-μπιτα words (2 bytes) όταν δηλώνεις στην C ένα char, πιάνει το 1 από τα 2 bytes (και το άλλο πρέπει να γίνει padding). Αν η πλατφόρμα σου δουλεύει με 32-μπιτα words, τότε πρέπει να γίνουν pad τα υπόλοιπα 3 bytes και πάει λέγοντας. Οι μέγιστες ταχύτητες εκτέλεσης επιτυγχάνονται όταν τα data είναι aligned σε πολλαπλάσια του word, αφού δεν χρειάζεται να γίνουν πρόσθετες πράξεις προκειμένου να βρεθούν. Επίσης, ανάλογα την πλατφόρμα, τα bytes μπορεί να ξεκινάνε από αριστερά προς τα δεξιά (low byte order) ή από τα δεξιά προς το αριστερά (high byte order). Όλα αυτά τα διδάσκεσαι στην Αρχιτεκτονική Υπολογιστών και στην Assembly.

Για να επιστρέψουμε στη C, αν θέλεις να δεις στην πλατφόρμα σου πόσο χώρο καταλαμβάνει στη μνήμη μια μεταβλητή χ, κάνεις: sizeof(x)... ή μπορείς να το κάνεις και με data types, π.χ. sizeof(char) ή sizeof(int)... μπορείς να το κάνεις και με δικά σου data types, π.χ...
Κώδικας: Επιλογή όλων

typedef struct myrecord {
int n;
float x;
char s[10+1];
} MyRecord;

int main( void )
{
...
printf( "%d\n", sizeof(MyRecord) );
...
}

Η εντολή sizeof σου γυρίζει πάντα bytes (αν το πολλαπλασιάσεις με 8 βλέπεις το πλήθος των bits).
Κώδικας: Επιλογή όλων

int nbits = sizeof( MyRecord ) * 8;


2. Ναι, αλλά ανάλογα την πλατφόρμα η αρχή διαφέρει... σε low byte order πλατφόρμες η αρχή είναι από αριστερά, σε high byte order είναι από δεξιά.
Τελευταία επεξεργασία από migf1 και 30 Αύγ 2011, 19:25, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 30 Αύγ 2011, 19:22

stamatiou έγραψε:Ωπ, το char *save = s1 νόμιζα πως ήταν ότι το save κάνει point στο s1. Αν θέλουμε να το κάνουμε να πάρει απλά την τιμή τι πρέπει να κάνουμε;

Το char *save = s1; ισοδυναμεί με:

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

char *save;
save = s1;

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

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

Δημοσίευσηαπό Star_Light » 30 Αύγ 2011, 19:43

migf1 έγραψε:
stamatiou έγραψε:Ωπ, το char *save = s1 νόμιζα πως ήταν ότι το save κάνει point στο s1. Αν θέλουμε να το κάνουμε να πάρει απλά την τιμή τι πρέπει να κάνουμε;

Το char *save = s1; ισοδυναμεί με:

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

char *save;
save = s1;

Οπότε ο δείκτης save δείχνει εκεί που δείχνει και ο s1... δηλαδή στον 1ο χαρακτήρα του s1 :)


ΕΓω συμφωνω με την τελευταια σου προταση... εξαρχης συμφωνουσα βασικα... απλα με κομπλαριζε αυτη η χυμα δηλωση
Κώδικας: Επιλογή όλων
char *save=s1;

το ιδιο ακριβως προβλημα ειχα και στις λιστες επομενως εγω θα κρατησω αυτο εδω που γραφεις...
και το μονο που μενει τωρα ειναι.... το return save δηλαδη επιστρέφουμε στην main την διεύθυνση της συμβολοσειράς s1?
Και ετσι δεν εκτυπωνει την διευθυνση της συμβολοσειρας ας πουμε? Πως απο μια επιστρεφομενη διευθυνση παμε μετα στον τελεστη διευθυνσιοδοτησης οπου τελικα μας δειχνει τα περιεχομενα? εκει σκαλωνω.....
Θα το καταλαβαινα αμεσως αν ειχαμε πχ στην main μια printf("%s",*save);
:/

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

Οσο για τον μορφοποιητη %p ε νταξει απλα ετυχε και επεσα σε ειδικη σημειωση πανω στο 24ωρο βιβλιο του γκιουρδα (μαθετε την C σε 24 ωρες) εχω αυτο και ενα αλλο που λεει εγχειριδιο της C παλι του γκιουρδα.
Γνώσεις ⇛ 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 » 30 Αύγ 2011, 19:47

migf1 έγραψε:
...
Όταν μιλάμε για unsigned μπορείς να το υπολογίσεις και μόνος σου, αφού το κάθε bit είναι ουσιαστικά μια δύναμη του 2, ξεκινώντας από την 0. Για παράδειγμα σε ένα byte, που έχει δλδ 8 bits, η μέγιστη τιμή που μπορεί να φιλοξενήσει υπολογίζεται ως εξής:
2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 + 2^7 (που ισούται με 255 ;) )
...

Κάτσε να στο εξηγήσω πιο καλά, το παραπάνω λοιπόν αν κάνεις τις πράξεις των δυνάμεων ισούται με:
1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 (που όλο μαζί ισούται με 255)

Ο κάθε όρος από τους παραπάνω, αντιστοιχεί σε ένα bit... άρα όταν και τα 8 bit είναι "αναμμένα" αθροίζονται σε 255.
Αν αφήσεις αναμμένο μονάχα το 3ο bit ( 00100000) τότε η δεκαδική τιμή που αντιστοιχεί είναι η 4... ομοίως για να πάρεις την δεκαδική τιμή 9, ανάβεις το 1ο και το 4ο bit (10010000) που δίνει 1+8 = 9... και πάει λέγοντας.

Βέβαια οι παραπάνω δυαδικές μορφές είναι ανάποδα γραμμένες, σύμφωνα με το πως έχουμε συνηθίσει εμείς να γράφουμε. Τα παραπάνω πρέπει να διαβαστούν από δεξιά προς τα αριστερά ή απλά να τα αντιστρέψουμε, για να τα καταλάβουμε δηλαδή...
00000100 είναι το 4
00001001 είναι το 10
κλπ

Είναι όμως καλό παράδειγμα για τα low και high byte orders που έγραψα στο προηγούμενο post :)
Τελευταία επεξεργασία από migf1 και 30 Αύγ 2011, 20:08, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 30 Αύγ 2011, 19:57

Οκ, ευχαριστώ!
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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