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

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

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

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

Δημοσίευσηαπό migf1 » 12 Σεπ 2011, 16:18

Star_Light έγραψε:ετσι οπως το λες ειναι σαν να το εχω κανει λαθος... ότι δηλαδη μεσα στην συναρτηση ΔΕΝ οριζουμε ως δεικτη...

Όχι, δεν εγραψα πουθενά ότι το είχες λάθος, πως ήταν αχρείαστα μπερδεμένο έγραψα ;)
έγραψε:
εγω το εχω ορισει μεν ως δεικτη αλλα οχι για να δουλεψει πανω στην μνημη (κατι που θα γινοταν με call by reference) εγω το δηλωνω ως δεικτη για να κανω μεσω αυτου προσπελαση στα στοιχεια της δομης για αναγνωση....οπα κατσε γιατι μπερδευτηκα τωρα...

Η ερώτηση είναι για ποιον λόγο όρισες ξεχωριστό δείκτη για να προσπελάσεις τα πεδία της μεταβλητής someone; Διότι εκτός του ότι δεν υπάρχει προφανής λόγος, μπερδεύει αχρείαστα και τον κώδικα.

έγραψε: ΛΟΛ αφου ο χρηστης τα δινει αρα ο δεικτης τα αποθηκευει στα στοιχεια της δομης (ή καλυτερα της μεταβλητης της δομης) αρα δουλευει στην μνημη μιας και εχει την δυνατοτητα να την τροποποιει ??? Eκτος αυτου προσθεσα μια printf αμεσως μετα την κληση και το τελος της συναρτησης στην main και ειδα πως ακομη και με call by value διατηρει τις τιμες της.... στα πεδια της (οταν τις εδινα σαν εισοδο στην συναρτηση) πως γινεται αυτο εφοσον ειναι by value? :/

Κώδικας: Επιλογή όλων
int main(void)
{

kostas someone , *p;

p=&someone;

struct_function(p) ;

===> printf("%s",p->surname); <==========

return 0;
}

Αυτό δεν είναι by value πέρασμα της someone, αυτό είναι by value πέρασμα του δείκτη p που δείχνει στην someone, που ισοδυναμεί με by reference πέρασμα της someone (οπότε ρωτάω ξανά, ποιος ο λόγος να μπερδέψεις έτσι τον κώδικα, ποιος είναι ο λόγος ύπαρξης του p σε αυτόν τον κώδικα; )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 12 Σεπ 2011, 17:27

Φυσικα και υπαρχει λογος. Ο λογος ειναι να τα ξεδιαλυνω τελειως! :D Μεσα στον κωδικα ομως οχι λογος δεν υπαρχει . Ειναι by value επειδη ο δεικτης σαν δεξια τιμη έχει ας πουμε την διευθυνση της someone ετσι? ΕΝω η αριστερη τιμη ειναι η δικη του διευθυνση δηλαδη η &p . Σε γενικες γραμμες δηλαδη οταν καλεις μια συναρτηση και εκει μεσα την στιγμη της κλησης υπάρχει τιμη που αντιστοιχει σε διευθυνση ειναι call by reference εγγυημενα ετσι? Και ενα παραδειγμα με swap's στα οποια ναι μεν μπλεκω αχρειαστα τον κωδικα και εισαγω παραπανω πολυπλοκοτητα απο αυτην που χρειαζεται και ειναι καταλληλη αλλα στο μυαλο μου τα ξεδιαλυνω

Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
void swap(int *x , int *y);
int main()
{

int x,y;

int *ptr_x , *ptr_y ;

ptr_x=&x;
ptr_y=&y;

printf("Dwste to x: \n");
scanf("%d",&x);
printf("Dwste to y: \n");
scanf("%d",&y);

swap(ptr_x, ptr_y);
printf("The value of x is : %d \n",x);
printf("The value of y is : %d \n",y);

return 0;
}
void swap(int *x, int *y)
{
int *tmp;

tmp=calloc(1,sizeof(int)); // one element

*tmp=*x;
*x=*y;
*y=*tmp;


return;
}


=> Nομιζω ειναι ακριβως οτι συζηταμε εδω .

Παει αυτο... η χθεσινη 3η μου απορια τωρα... Ορισα ξεχωριστο γιατι νομιζα πως δεν μπορεις να χρησιμοποιησεις μια μεταβλητη δομης σαν δεικτη... Μπορεις να χρησιμοποιησεις μια μεταβλητη δομης σαν δεικτη προς τα ιδια τα στοιχεια της ?

Στο μεταξυ δινω σε επομενο στιγμιοτυπο στον παραπανω κωδικα τα

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

printf("%p", &(*ptr_x)); // because this symbol actually produces the same value with the ptr_x
printf("\n");
printf("%p", ptr_x);
puts("\n"); // ptr_x gives the physical adress of x
printf("%p", &x); // And this is the evidence



αρα ειναι ισοδυναμα τα ptr_x με &(*ptr_x) .... τωρα καταλαβαινεις γιατι ηθελα να μαθω και assembly μ αρεσει να πονοκεφαλιαζομαι :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 » 12 Σεπ 2011, 17:44

Star_Light έγραψε:...
Και ομως το πιστευεις οτι εγω συμφωνω πιο πολυ με το &(*p) παρα με το p? Το p γιατι να το δεχθω σαν διευθυνση? Επειδη ετσι μου το οριζουν ή μου το λενε? Δεν εχω καποια αλλη ενδειξη... οταν παλιοτερα καποιος πηγε να μου εξηγησει τους δεικτες (πολυ παλιοτερα) μου ειχε πει οκ
οριζουμε int *p το p πλεον ειναι μεταβλητη δεικτη που φερει την διευθυνση ενω το * ειναι περιεχομενα....

ενω αντιθετως... στο
Κώδικας: Επιλογή όλων
&(*p)


το & ειναι τελεστης διευθυνσης και δινει την διευθυνση... ειναι αξιωμα. Δεν σου λεει ο αλλος ειναι δικο μου αξιωμα οποτε δεξου το και εσυ... καταλαβαινεις γενικα πως ειναι αξιωμα. Οκ? Απο την αλλη και το (*p) ειναι και αυτο γενικο αξιωμα οτι δινει το περιεχομενο αρα ολο μαζι
δηλαδη το &(*p) δινει την διευθυνση του περιεχομενου στο οποιο δειχνει ο δεικτης... ακριβως με αυτη τη διευθυνση που έχεις αρχικοποιησει και τον δεικτη στο να δειχνει... καταλαβαινεις τι λεω ή ειμαι για δεσιμο? :lol:

Κοίτα, όσο αξίωμα είναι το (*p) άλλο τόσο αξίωμα είναι και το p... άλλωστε όλα ξεκινάνε από το p, χωρίς αυτό δεν υπάρχει ούτε (*p) ούτε &(*p)

Γράψε μου π.χ με τον δικό σου τρόπο τη μια γραμμή στο κώδικα της συνάρτησης:
Κώδικας: Επιλογή όλων
command_settext( UI *commands, const int pos, const char *text )
που αναθέτει το text ως όνομα της pos-στής εντολής, σε έναν πίνακα από διαθέσιμες εντολές, όταν έχεις το παρακάτω:

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

typedef struct command {
...
char name[ 255+1 ];
} Command;

typedef struct ui {
...
Command cmdlist[ 10 ];
} UI;

// --------------------------------------------------------------------------------------------
int command_settext( UI *commands, const int pos, const char *text )
{
...
// εδώ η γραμμή που θέλουμε
...
return 1;
}

// --------------------------------------------------------------------------------------------
int main( void )
{
UI commands;
...
command_settext( &commands, 10, "print");
...
return 0;
}


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

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

Δημοσίευσηαπό migf1 » 12 Σεπ 2011, 17:51

Star_Light έγραψε:
...
αρα ειναι ισοδυναμα τα ptr_x με &(*ptr_x) .... τωρα καταλαβαινεις γιατι ηθελα να μαθω και assembly μ αρεσει να πονοκεφαλιαζομαι :lol: :lol:

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

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

Δημοσίευσηαπό Star_Light » 12 Σεπ 2011, 18:09

Εγω δεν διαφωνω μαζι σου οτι θα ειναι δυσαναγνωστο. Αν διαφωνουσα θα ημουν ηλιθιος διοτι εισαι επαγγελματιας τοσα χρονια. Ή κομπλεξικος θα ημουν ή ηλιθιος. :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++

Δημοσίευσηαπό migf1 » 12 Σεπ 2011, 18:20

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

Κράτα πως οι δομές κατά βάση είναι τύποι δεδομένων και πως για να τις χρησιμοποιήσουμε ορίζουμε μεταβλητές τέτοιου τύπου. Καθώς επίσης και το πότε χρησιμοποιείς τελεία και πότε -> για να αναφερθείς στα πεδία αυτής της μεταβλητής. Αυτά είναι παραπάνω από αρκετά για να γράψεις τον κώδικα της
Κώδικας: Επιλογή όλων
Bool table_fill_randomly( Table *table, const int maxval )
και να συνεχίσουμε παρακάτω :)

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

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

Δημοσίευσηαπό stamatiou » 12 Σεπ 2011, 18:23

Σόρρυ απειδή χάθηκα πάλι, ο κώδικάς μου είναι σωστός;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 12 Σεπ 2011, 18:25

migf1 έγραψε:Σωστό είναι, από την αρχή ήταν σωστό :)
Απλά, τόσο μεγάλη ανάλυση δεν χρειάζεται παντού & πάντα γιατί συνήθως αναγκαστικά σε απομακρύνει από το τρέχον πρόβλημα που έχεις να λύσεις και άρα σε αποπροσανατολίζει.

Κράτα πως οι δομές κατά βάση είναι τύποι δεδομένων και πως για να τις χρησιμοποιήσουμε ορίζουμε μεταβλητές τέτοιου τύπου. Καθώς επίσης και το πότε χρησιμοποιείς τελεία και πότε -> για να αναφερθείς στα πεδία αυτής της μεταβλητής. Αυτά είναι παραπάνω από αρκετά για να γράψεις τον κώδικα της
Κώδικας: Επιλογή όλων
Bool table_fill_randomly( Table *table, const int maxval )
και να συνεχίσουμε παρακάτω :)

ΥΓ. Και προσπάθησε ακόμα και στα πρόχειρα παραδείγματα που κάνεις μόνος σου, τα ονόματα που χρησιμοποιείς για τις μεταβλητές, τις σταθερές και τους πρόσθετους τύπους να είναι ευανάγνωστα και σε αντιστοίχιση όσο το δυνατόν μεγαλύτερη αντιστοιχία με την ανθρώπινη σκέψη :)


Α οκ... επομενως για αυτο και μπορεις να χρησιμοποιησεις (οχι το ονομα της δομης) αλλα το ονομα της μεταβλητης που έχει σαν τύπο μια δομή ως δείκτη σε αυτην. :)

Π.Σ Τωρα θα ηταν τρομερο να φυγουμε για τιποτα λιστες ξανα... αλλα αστο! :lol: :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 » 12 Σεπ 2011, 18:28

stamatiou έγραψε:Σόρρυ απειδή χάθηκα πάλι, ο κώδικάς μου είναι σωστός;

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

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

Δημοσίευσηαπό stamatiou » 12 Σεπ 2011, 18:36

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

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

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