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

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

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

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

Δημοσίευσηαπό stamatiou » 31 Ιαν 2012, 19:05

Star_Light έγραψε:Χιονίζει !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

@stamatiou επειδη την συνάρτηση την καλώ με τον p2 και οχι με τον p3 οπως
κανονικα θα επρεπε . Τσεκαρε την καλυτερα με την παραμετρο της. Αυτο το πραγμα
δουλεψε κατα τυχη!

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

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

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 19:50

Οχι γιατι ο p2 εχει αρχικοποιηθει με την διευθυνση του a !

Οι δυο δεικτες ειναι ξεχωριστοι... χρησιμοποιησε μια printf για να το δεις.
Γνώσεις ⇛ 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 Ιαν 2012, 20:20

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

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

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 22:41

Ναι ο p2 αρχικοποιειται με την διευθυνση μνημης της a.

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


Ελπιζω να λεω για τον μονο δεικτη. Ο διπλος θελει να τον αρχικοποιησεις
με την διευθυνση ενος αλλου δεικτη πρωτα ομως. Θα αλλαξει τον a επειδη κανει simulation
το call by reference στην C (Γιατι κανονικα και με την ευρυτερη εννοια δεν υπάρχουν αναφορες στην C) γενικα ηταν ενα θεμα που μας ειχε απασχολησει τον Σεπτεβριο αν θυμαμαι καλα. Αλλαζει τον a κανονικα επειδη η δουλεια γινεται απευθειας στην μνημη αλλα το ορισμα με το οποιο
γινοταν η κληση της συναρτησης δεν ηταν ο σωστος δεικτης.

Αν προσεξεις ο p3 δεν αρχικοποιειται με κατι . Εφοσον δεν εχει αρχικοποιηθει δειχνει μεν καπου αλλα δεν ξερουμε που. Και σε αυτο το αγνωστο που δειχνει (που μπορει να ειναι οπουδηποτε) πας εσυ και βαζεις την τιμη 3. Η διευθυνση δεν μπαινει σε εναν δεικτη με μαγικα θα πρεπει να την εκχωρησεις εσυ. Το να χρησιμοποιησεις εναν δεικτη που δεν ειναι αρχικοποιημενος (δεν τον εχεις βαλει δηλαδη να δειχνει καπου οπως εγινε με τον λαθεμενο κωδικα που ανεβασα) ειναι ενα κενο ασφάλειας και αρκετα καταστροφικό για ορισμενους.

Επομενως απο αυτο και μονο ο προηγουμενος κωδικας κοβεται!
Γνώσεις ⇛ 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 » 01 Φεβ 2012, 13:57

Την αντιμετάθεση πινάκων θα την καταφέρει κανείς; :)

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

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

Δημοσίευσηαπό Star_Light » 01 Φεβ 2012, 14:58

Εννοειται απλα χθες κοιτουσα και δεικτες σε συναρτησεις και συναρτησεις που επιστρεφουν δεικτες κτλπ...

Θα την ξεκινησω σημερα αν προλαβω!!!!
Γνώσεις ⇛ 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 » 01 Φεβ 2012, 15:40

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

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

Δημοσίευσηαπό Star_Light » 01 Φεβ 2012, 15:49

:lol: :lol: :lol:

οκ!!! Λοιπον εχω καποιες αποριες ομως απο χθες...
Καταρχην μου λεγανε παλι σε ενα τσατ πως αν ορισεις εναν πινακα πχ int array[2]; ξερω γω το array απο μονο του δεν ειναι
ο δεικτης στο 1ο στοιχειο... κατι τετοιο ειναι υπερ-απλοποιημένο. Ειναι απλα ενας προσδιοριστης... το value του δεικτη του array ειναι λεει ο δεικτης
αυτος εννοουσε ας πουμε το *array γιατι το λεει δεικτη ομως αυτο ρε συ? Αυτο ειναι ενας int δεν ειναι δεικτης.... ο δεικτης ειναι το array που δειχνει
στο 1ο στοιχειο το array[0] και αν τον κανεις deference δινει αυτο που εχεις αρχικοποιησει (εδω 0 γιατι δεν εχουμε αρχικοποιησει τιποτα) :D

ΠΑΕΙ ΑΥΤΟ.... μετα δευτερον λες οτι τα C-strings ειναι δεικτες στον 1ο χαρακτηρα.... εδω εχω ενα κολλημα με τον ορισμο... γιατι αν με ρωτουσε καποιος αυτο δεν θα του ελεγα οτι ειναι δεικτες θα του ελεγα θες να μαθεις τι ειναι ενα C- sting? παρε το ονομα σου βαλτο σε εναν πινακα χαρακτηρων και στο τελος κοτσαρισε του και ενα '\0' και εισαι ετοιμος. Και αν θες τωρα να εχεις προσβαση σε αυτο θα χρησιμοποιησεις εναν δεικτη που δειχνει στον 1ο χαρακτηρα αυτου του string μιας και η σημαια για το τελος υπάρχει ('\0') .

και τριτον.... εδω

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

#include<stdio.h>
#include<stdlib.h>

typedef struct customer /*xreiazetai kai i leksi customer wste na kserei mesa sto swma
tou se ti tupo anaferetai o deiktis next */
{
int id;
struct customer *next;
} Customer;

void list_print(Customer *head);
void list_prepend(Customer **head , int id);

int main ()
{
int static id;
Customer *head ,*newnode;

head = NULL;
newnode=NULL;

for(id=1; id<10; id++)
{
list_prepend(&head,id);
}

list_print(head);
free(newnode);
free(head);

return 0;
}
void list_prepend(Customer **head , int id)
{

Customer *newnode= calloc(1,sizeof(Customer));
if(!newnode)
return;

newnode->id=id;
newnode->next=(*head);
(*head)=newnode;
return;
}


void list_print(Customer *head)
{
while(head)
{
printf("%d \n",head->id);
head=head->next;
}
putchar('\n');
return;
}


με σκαλωνει λιγο που στην κληση εχεις :

Κώδικας: Επιλογή όλων
list_prepend(&head,id);


το head εδω ειναι διπλος δεικτης..... γιατι &head? Αυτο δεν δινει την διευθυνση ας πουμε του ιδιου του δεικτη? Οχι αυτη στην οποια δειχνει.
Γνώσεις ⇛ 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 » 01 Φεβ 2012, 16:05

Βασικά όλα αυτά τα έχουμε αναλύσει και στο παρελθόν, ενώ τα περισσότερα από αυτά τα αναλύω και στο site μου (στα links της υπογραφής μου). Και βασικά σου χρειάζονται να τα ξέρεις προκειμένου να μπορέσεις να υλοποιήσεις αντιμετάθεση πινάκων μέσω δεικτών και όχι μέσω αντιγραφής των στοιχείων τους ένα-ένα :)

Εν τάχει, ξεκινώντας από την ερώτηση για το &head, πρόκειται ουσιαστικά για by-reference πέρασμα του δείκτη head στην list_prepend() διότι η συνάρτηση μετακινεί τον δείκτη head μέσα της και θέλω να ξέρω που πήγε ο δείκτης όταν επιστρέψει η συνάρτηση.

Σε ότι αφορά τους πίνακες τώρα (το ίδιο είναι και για τα c-strings), το όνομά τους είναι δείκτης στο 1ο τους στοιχείο, και ως τέτοιος μπορεί να χρησιμοποιηθεί είτε ως *array_name είτε ως array_name[0] για πρόσβαση στην τιμή που περιέχει ο πίνακας στο 1ο του στοιχείο.

Αυτό όμως που ΔΕΝ μπορούμε να κάνουμε στα ονόματα πινάκων, όταν έχουν οριστεί σαν πίνακες, είναι να τα διαχειριστούμε ως LVALUES (δεν μπορούμε δηλαδή να τους μετακινήσουμε σε άλλη θέση).

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

int *array = NULL;

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

int array[ARRLEN ] = {0};

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

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

Δημοσίευσηαπό Star_Light » 01 Φεβ 2012, 16:24

Ακριβως αυτο με τα LVALUES μου ειπανε και αυτοι ! Βασικα το ιδιο πραγμα λεγαμε πανω κατω γιατι τους ρωτουσα αν το λενε ετσι επειδη ουσιαστικα δεν μπορεις να χρησιμοποιησεις εναν πινακα (ονομα του) για να κανεις pointer arithmetic. Aπλα επειδη τα αγγλικα μου ειναι σε επιπεδο lower δεν μπορουσα να συνεννοηθω 100% μαζι τους.

Οκ για τα C- strings. Το πιασα...

Νταξει και με το head . Απλα ξαναρωτησα επειδη το καλοκαιρι μιας και υπηρχε βομβαρδισμός εννοιών μας ειχες βαρεθει σε καποια φαση :lol: :lol: και μας λες παιδια.... οταν θα παιζει συναρτηση στις λιστες με διπλο δεικτη μεσα θα την χειριζεστε με εναν αστερισκο και θα την καλειτε με το '&' .

Απλα επειδη πλεον και οσο προχωραμε δεν μου φτανει αυτο .... ειχα και εναν ενδοιασμο στο

Κώδικας: Επιλογή όλων
newnode->next=(*head);
(*head)=newnode;


αλλα οκ έφτιαξα ενα δικο μου παραδειγμα και το καταλαβα καπως

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

#include<stdio.h>

int main()
{
int **p

, *p2 , b=1 , *p3 ;

p=NULL;
p2=NULL;
p3=NULL;

p3=&b;

p = &p3;

p2=(*p);


printf("%d", *p2);


return 0;
}


Μπορεις δηλαδη σε εναν μονο δεικτη p2 να βάλεις την διευθυνση του διπλου ετσι -> (*p)
Γνώσεις ⇛ 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
Εκτύπωση

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

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