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

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

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

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

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

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

Εδώ παρατηρώ πως έχεις γενικό κενό, με τα strings γενικότερα... το %s περιμένει string, δηλαδή πίνακα από χαρακτήρες, δηλαδή δείκτη στον 1ο χαρακτήρα ενός string, ενώ το %c περιμένει απλό χαρακτήρα, δηλαδή το περιεχόμενο του δείκτη save στο δικό μας παράδειγμα (δηλαδή τον χαρακτήρα *save, που είναι ο 1ος χαρακτήρας του string) .
Αυτό που γράφεις παραπάνω το κάνεις συνέχεια λάθος :(... εφόσον το save είναι δείκτης σε χαρακτήρα το *save είναι απλός χαρακτήρας.

Ή θα πρέπει λοιπόν να γράψεις:
Κώδικας: Επιλογή όλων
printf("%s", save)

ή
Κώδικας: Επιλογή όλων
printf("%c", *save);

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

printf("%s", *save);
printf("%c", save);
είναι και τα 2 λάθος!

Ακριβώς όπως είναι λάθος και τα παρακάτω:
Κώδικας: Επιλογή όλων

char s[] = "this is a test";
printf("%s", *s);
printf("%c", s);
ΛΑΘΟΣ!!!!

Το σωστό είναι:
Κώδικας: Επιλογή όλων

char s[] = "this is a test";
printf("%s", s); // τυπώνει: this is a test
printf("%c", *s); // τυπώνει: t


Ελπίζω να ξεκαθάρισαν, αν όχι πες μου να τα ξανα δούμε :)

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

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

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

Παρακαλώ Γιώργο :)

Λοιπόν δίνω και τη δική μου υλοποίηση της s_compare() που είναι με δείκτες. Ότι δεν καταλαβαίνετε να το ξεδιαλύνουμε και κατόπιν να το μετατρέψετε μόνοι σας σε έκδοση που αντί για δείκτες θα χρησιμοποιεί μετρητές (θα σας βοηθήσει να κατανοήσετε καλύτερα και τις 2 εκδόσεις).

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

int s_compare( const char *s1, const char *s2 )
{
while ( *s1 == *s2++ )
if ( !*s1++ )
return 0;

return (int)(*s1 - *--s2);
}

Κατόπιν θα προσθέσουμε κάποιους έξτρα ελέγχους, που δεν τους κάνει ούτε η strcmp() με τους οποίους θα αποτρέπουμε τη πιθανότητα να κρασάρει το πρόγραμμά μας αν έστω και κατά λάθος περαστούν ως NULL είτε το s1 είτε το s2 στη συνάρτησή μας (η strcmp κρασάρει... δοκιμάστε π.χ.: strcmp( NULL, "ab") ή strcmp( "", NULL) ή strcmp( NULL, NULL )... θα κρασάρει).

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

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

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

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

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

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

char *save;
save = s1;

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

Το κάνω και σχηματικά, μήπως βοηθήσει καλύτερα στην κατανόησή του:

Ο παρακάτω κώδικας...
Κώδικας: Επιλογή όλων

char s[] = "testing";
char *save = s;
...

σχηματικά πάει κάπως έτσι...
Κώδικας: Επιλογή όλων

save
|
v
s -> testing\0
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 31 Αύγ 2011, 01:20

Back :D Καλά ηταν. Καφεδάκι στα floca πανω στο Γαλάτσι στο Zepellin , έχει επιστρέψει και ο κόσμος. Σιγα - σιγά κάθε κατεργάρης στον πάγκο του...συνάντησα σχετική κίνηση και στην Αχαρνών , μεταξύ μας καθως κανω τις συγκρίσεις με τις διακοπές και τα μέρη που επισκέφτηκα δεν θα με χαλούσε να μένω ουτε Ρέθυμνο αλλα ουτε και Ηράκλειο το χειμώνα. Άν ποτε βγάλω λεφτά εκτός απο την Αθήνα θα κοιτάξω να πάρω κάνα σπιτάκι και εκτος Αθηνων σε κανα μεγάλο νησί να την κάνω για αλλαγη!

Πίσω στα δικά μας. Κατάλαβα τι θέλεις να μου πεις :D
Αλλα συνεχιζω να εχω ενα μικρο-προβλημα με την τιμη επιστροφης.
Εφοσον επιστρέφει την διεύθυνση της συμβολοσειρας πως μετα αυτη τυπώνεται?
Γνώσεις ⇛ 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 » 31 Αύγ 2011, 01:59

α νομιζω τωρα πρεπει να καταλαβα τελειως... ουσιαστικα βάζεις τον save να δειχνει στην αρχη της συμβολοσειρας σαν δεικτης που ειναι και η δουλεια μετα γινεται μεμονομενα στους χαρακτηρες απο τα

*s1=*s2;

έχουν κάνει την δουλειά μέσα στην μνήμη. Ναι σαν να ξεκαθαριζονται σιγα σιγα φιλε migf1 ευχαριστουμε για την υπομονη σου. Δυστυχως το επιπεδο της δικης μου σχολης στον προγραμματισμο ηταν αρκετα χαμηλο (φυσικα ειχε κατι φοιτητες θυμαμαι τρομερους στον προγραμματισμο αλλα ηταν αυτοδιδακτοι και με 40 μαθηματα στην πλατη).... και αυτη ηταν και η τραγικη ειρωνια να ειναι καλυτεροι και απο καθηγητες και στο τελος να μην παρουν πτυχιο . Οι καθηγητες απλα δεν το ειχαν στο προγραμματισμο. Ή ακομα και αν το ειχαν δεν μπηκαν ποτε στην διαδικασια να το δειξουν και σε εμας... φαινεται έχουν και αλλες πιο σοβαρες προτεραιοτητες.

Δυστυχως πρεπει να αλλαξουν αρκετα πραγματα στην Ελλαδα... ειδικα στην εκπαιδευση. Δεν ειναι δυνατον να βγαζεις ενα πανεπιστημιο και να βγαζεις την πιστη στον migf1 μετα για να μαθεις τους δεικτες :lol: :lol:

απλα διακομωδω την κατασταση γιατι ειναι για γελια τελικα... ουτε παραπονιεμαι ουτε γκρινιαζω δεν θελω να εκκληφθει ετσι ;)
Γνώσεις ⇛ 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 » 31 Αύγ 2011, 02:32

Star_Light έγραψε:
...
Δεν ειναι δυνατον να βγαζεις ενα πανεπιστημιο και να βγαζεις την πιστη στον migf1 μετα για να μαθεις τους δεικτες :lol: :lol:
...
)

:lol: :lol: :lol:

Δεν υπάρχει κανένα πρόβλημα ρε συ, άμα δεν ήθελα δεν θα συμμετείχα :)

Χαίρομαι που τα κατάλαβες, ακριβώς αυτό κάνει: o δείκτης s1 αλλάζει τα περιεχόμενα της μνήμης καθώς προχωράει (τους αντιγράφει ότι περιέχει το string s2) ενώ ο save μένει... μπάστακας :lol: στην αρχή του s1, ώστε ουσιαστικά να επιστρέψει στη main μέσω του return save το αλλαγμένο s1 :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 31 Αύγ 2011, 02:38

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

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

Δημοσίευσηαπό stamatiou » 31 Αύγ 2011, 11:01

migf1 έγραψε:Πάντως είναι πολύ βασικό πράμα το να γράφεις κώδικα, πολύ κώδικα! Χωρίς συγγραφή κώδικα δεν μαθαίνεις.

Για αυτό και πιστεύω ότι για να μάθεις προγραμματισμό πρέπει να το θέλεις. Πολλοί φίλοι μου μου λέγανε "Μάθε μου να προγραμματίζω! Να φτιάχνω παιχνίδια!" και τους έλεγα εγώ να ξεκινήσουν από τα βασικά. Σε όλους μέχρι τώρα όταν είδαν είτε tutorial είτε κάποιο βιβλίο, μόλις τους το έδειξα είπαν ένα χαρακτηριστικό "Μπα, άσε καλύτερα βαριέμαι...". Δεν είναι και κακό, απλά δεν το ήθελαν πραγματικά και γι' αυτό και δεν το προχώρησαν :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Να ρωτησω και κατι τελευταιο... το όνομα της διάταξης οταν πρόκειται για μια συμβολοσειρα μπορει να χρησιμοποιηθει και για να δειχθει η διευθυνση της συμβολοσειρας αλλα και για να έχουμε προσπελαση της μετα μιας και στην RAM η αποθηκευση γινεται σειριακα?

Στην RAM η αποθηκευση γίνεται παντα σειριακα ενω η προσπελαση τυχαια λογω και της ονομασιας της ?? :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/C++

Δημοσίευσηαπό stamatiou » 31 Αύγ 2011, 15:47

Τελικά ο κώδικας αυτός δουλεύει;
Spoiler: show
Κώδικας: Επιλογή όλων
int s_compare(char *string1,char *string2) {
int i = 0;
for(i = 0;(string1[i] == string2[i]) && (string1[i] != '\0');i++);
if(string2[i] == '\0') return 0;
if(string1[0] < string2[0]) return -1;
if(string1[0] > string2[0]) return 1;
return 2;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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