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

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

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

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

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

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

Καταρχήν είναι κατανοητό αυτό εδώ το σχέδιο;

Εικόνα

που αντιστοιχεί σε αυτόν εδώ τον κώδικα;
Κώδικας: Επιλογή όλων
int n=10, *p = &n, **p = &p; // όπου 10 είναι Value στο σχέδιο
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 09 Σεπ 2011, 16:25

migf1 έγραψε:Επειδή το value και το bits είναι πεδία ενός union, άρα μοιράζονται την ίδια περιοχή μνήμης... αυτό κάνει το union, όλα τα πεδία του μοιράζονται την ίδια περιοχή μνήμης.

Κώδικας: Επιλογή όλων
typedef union byte { // an unsigned byte represented as union
unsigned char value; // ... the numerical rerpesentation of the byte
Bits bits; // ... the bit representation of the byte
} Byte;

Άρα το .value και το .bits μοιράζονται την ίδια μνήμη, την οποία μνήμη μπορείς να την καλέσεις είτε γράφοντας: .value είτε .bits.bX

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

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

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

Τέσπα, είναι δεν είναι κατανοητό το σχέδιο, ο συμβατός κώδικας για διαχείριση διευθύνσεων δεικτών είναι κάτι σαν το παρακάτω...

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

#include <stdio.h>

typedef union ptraddress {
int **pp; // address of p
unsigned long int paddr; // address of p expressed as unsigned long
unsigned long int *p; // p itself expressed as unsigend long
} PtrAddress;

// -------------------------------------------------------------------------------------
int main( void )
{

int n = 10, *p = &n;
PtrAddress ptraddress; // ή με αρχικοποίηση: ptraddress = { .pp = &p };

ptraddress.pp = &p;
printf("h dieythynsh toy p einai:\t%lu\n", ptraddress.paddr);

printf("o p periexei th dieythynsh:\t%lu\n", *(ptraddress.p) );

printf("h dieythynsh sthn opoia deixnei o p periexei thn timh:\t%d\n",
**ptraddress.pp );

return 0;
}

Και η λογική του είναι πως για να μη χρειάζεται να καταφεύγουμε σε casting (μιας και το cast από δείκτη σε απρόσημο ακέραιο είναι πλέον ασύμβατο) ορίζουμε έναν δείκτη στον δείκτη του οποίου τη διεύθυνση (αλλά και τα περιεχόμενα) θέλουμε να διαχειριστούμε. Δείκτη σε δείκτη δηλαδή.

Αν int *p είναι ο δείκτης μας, ορίζουμε τον int **pp να δείχνει στη διεύθυνση του p: pp = &p; Και αυτή την διεύθυνση την εκφράζουμε ως unsigned long βάζοντας την μαζί με τον διπλό δείκτη μας μέσα σε ένα union:
Κώδικας: Επιλογή όλων

typedef union ptraddress {
int **pp; // address of p
unsigned long int paddr; // address of p expressed as unsigned long
} PtrAddress;

Οπότε διαβάζουμε τη διεύθυνση του p ως δείκτη σε δείκτη: ptraddress.pp = &p; αλλά κατόπιν μπορούμε να τη διαχειριστούμε ελεύθερα σαν να ήταν unsigned long μέσω του: ptraddress.paddr
Κώδικας: Επιλογή όλων

printf("h dieythynsh toy p einai:\t%lu\n", ptraddress.paddr);


Αν τώρα θέλουμε να διαχειριστούμε ως unsigned long όχι μόνο τη διεύθυνση του p αλλά και τη διεύθυνση που περιέχει ο p μέσα του (η οποία είναι η διεύθυνση στην οποία δείχνει ο p) τότε αρκεί να προσθέσουμε μέσα στο union άλλο ένα πεδίο που θα μονός δείκτης αλλά όχι σε int που είναι ο p, αλλά σε unsigned long int που θέλουμε να μετατραπεί).

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

typedef union ptraddress {
int **pp; // address of p
unsigned long int paddr; // address of p expressed as unsigned long
unsigned long int *p; // p itself expressed as unsigend long
} PtrAddress;

Η αρχική ανάθεση παραμένει η ptraddress.pp = &p; για να μην έχουμε διένεξη τύπων κατά την ανάθεση (type conflict) μόνο που τώρα μπορούμε να διαχειριστούμε ΚΑΙ τη διεύθυνση που περιέχει ο p ως unsigned long, μέσω του ptraddress.p...
Κώδικας: Επιλογή όλων

printf("o p periexei th dieythynsh:\t%lu\n", *(ptraddress.p) );

Και η τελική τιμή (του n δηλαδή) είναι προσβάσιμη μέσω του: **ptraddress.pp ...
Κώδικας: Επιλογή όλων

printf("h dieythynsh sthn opoia deixnei o p periexei thn timh:\t%d\n",
**ptraddress.pp );


!!! ΚΑΤΑΛΑΒΑΙΝΩ ΠΩΣ ΕΧΕΙ ΧΑΘΕΙ ΤΕΛΕΙΩΣ Η ΜΠΑΛΑ... ΔΕΝ ΠΕΙΡΑΖΕΙ... ΜΗΝ ΧΑΛΙΕΣΤΕ... ΑΥΤΑ ΕΙΝΑΙ ΟΝΤΩΣ ADVNACED ΠΡΑΓΜΑΤΑ !!!!

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

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

Δημοσίευσηαπό stamatiou » 09 Σεπ 2011, 16:46

Δεν ξέρω για το Star_Light αλλά για μένα όχι μόνο έφυγε η μπάλα, έβαλα και αυτοgoal :lol:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

:lol: :lol: :lol:
Εντάξει είναι λογικό ρε συ! Το παράκανα (μη μου δίνετε πολύ θάρρος :lol:)... έτσι κι αλλιώς είναι μάλλον αδύνατον να χρειαστεί να διαχειριστείτε διευθύνσεις μνήμης δεικτών στο άμεσο μάλλον (εκτός αν ξέρω-γω σκοπεύετε να φτιάξετε κάνα garbage-collector για κάνα OS :P).

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

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

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

Λοιπόν τι λέτε να επιστρέψουμε για λίγο σε πίνακες ακεραίων που θέλει άλλη προσέγγιση, πιο προσιτή κι ελπίζω και πιο ενδιαφέρουσα από τα strings (δεν είμαστε ακόμα για βιβλιοθήκη από string);

Λέω να ξεκινήσουμε με έναν πίνακα απλών ακεραίων και να θέσουμε ως αρχικό στόχο να φτιάξουμε συναρτήσεις για τις εξής λειτουργίες:
α) Εισαγωγή στοιχείου στον πίνακα
β) Διαγραφή στοιχείου από τον πίνακα
γ) Ενημέρωση στοιχείου του πίνακα
δ) Αναζήτηση στοιχείου του πίνακα

Κατόπιν μπορούμε να φτιάξουμε συναρτήσεις για πιο σύνθετες λειτουργίες (π.χ. ταξινόμηση)

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

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

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

@stamatiou εβαλες αυτογκολ γιατι καθε ποστ του θελει ενα μισαωρακι διαβασμα :lol: :lol: δεν ειναι να τα περνας στο ετσι :lol:

@migf1 Καλη η προταση αλλα δεν εχω διαβασει καθολου αυτα που ειπα πριν ωστε να δω αν με παιρνουν η οχι... κατσε να ανοιξει λιγο το ματι... γιατι κοιμομουν και το μεσημερι.... ;) καφεδες δεν πινω στο μεταξυ το τσιγαρο το εχω κοψει.... ε κανα μισαωρο θα το χρειαστω χαχαχαχα

Π.Σ Advanced πραγματα θελω.... επανερχομαι σε λιγο για να τα πιασω και να γινει χαμος. Χθες δεν ειχα προβλημα με τους δεικτες παντως απλα δεν καταλαβα εξαρχης τι ζητουσες :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 » 09 Σεπ 2011, 18:38

Καλησπέρα, καλό ξύπνημα :)

Advanced ναι, αλλά ok ρε συ αυτά είναι αρκετά εξειδικευμένα κι εν πολλοίς αχρείαστα σε αυτή τη φάση... δεν είναι για να χάνουμε χρόνο σε αυτά (και να τα καταλάβεις τώρα, μέχρι να τύχει να τα χρησιμοποιήσεις, αν τύχει ποτέ δηλαδή, δεν θα θυμάσαι τίποτα). Ενώ τα strings π.χ. είναι πολύ πιο στοιχειώδη... ομοίως και οι πίνακες και οι δομές.

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

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

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

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

migf1 έγραψε:Καλησπέρα, καλό ξύπνημα :)

Advanced ναι, αλλά ok ρε συ αυτά είναι αρκετά εξειδικευμένα κι εν πολλοίς αχρείαστα σε αυτή τη φάση... δεν είναι για να χάνουμε χρόνο σε αυτά (και να τα καταλάβεις τώρα, μέχρι να τύχει να τα χρησιμοποιήσεις, αν τύχει ποτέ δηλαδή, δεν θα θυμάσαι τίποτα). Ενώ τα strings π.χ. είναι πολύ πιο στοιχειώδη... ομοίως και οι πίνακες και οι δομές.

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

Έχει πολλά ερωτήματα που πρέπει να απαντηθούν πριν καν αποφασίσουμε πως θα τον ορίσουμε εξαρχής τον πίνακα (π.χ. θα έχει την ευελιξία να αυξομειώνει το μήκος του ανάλογα με το πλήθος των στοιχείων του ή θα είναι στατικός; )


ΩΡΑΙΑ... Μιας και θεωρεις εσυ οτι καποιος θα "χασει" χρονο με αυτα... μεχρι που να διαβασω απο αυτα που εδωσες???
Να μην διαβασω καν αυτα με τα unios και τους δεικτες δηλαδη επειδη θα ανοιξεις νεο section με πινακες?
Περιμενω signal :lol: :lol:

Ειχα σκοπο να διαβασω σελιδες 130-131.
Γνώσεις ⇛ 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 » 09 Σεπ 2011, 19:18

Παντως προτεινω... ειτε κανουμε το ενα ειτε κανουμε το αλλο... να μας βαζεις μικρες ασκησουλες migf1 οπως η χθεσινη... που να μην θελει πχ πανω απο 15-20 λεπτα να λυθει (καλα οχι πως οσες μας εχεις βαλει ως τωρα ηθελαν καμια ωρα) αλλα λεω... πιστευω ειναι πολυ αποδοτικο και αποτελεσματικο το κολπο με τις ασκησεις.
Γνώσεις ⇛ 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
Εκτύπωση

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

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