ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

...ασύγχρονα μαθήματα γλώσσας C

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 24 Ιουν 2011, 00:22

1000 ευχαριστώ παιδιά για τα καλά σας λόγια, με κάνετε και κοκκινίζω όμως :)

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

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 24 Ιουν 2011, 01:16

migf1 έγραψε:1000 ευχαριστώ παιδιά για τα καλά σας λόγια, με κάνετε και κοκκινίζω όμως :)

Έχεις απόλυτο δίκιο φίλε Star_Light, το άλλαξα μόλις, καθώς και μερικά ακόμα που τα είχα και πάλι λάθος. Ευχαριστώ για την επισήμανση!


οπα! Ποια ηταν αυτα??? ΣΤους δεικτες???? Αν ειναι πες και σε εμας.... σε ποια σημεια
για να τα ξανακοιταξουμε. ΔΙαβασα ολους τους δεικτες και κρατησα και σημειωσεις προφανως!!!!!
Γνώσεις ⇛ 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: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 24 Ιουν 2011, 01:32

Απροσεξίες της ίδιας φύσης με αυτό που επισήμανες... π.χ *(nums+4) == nums[3] (και όχι nums[4] )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 24 Ιουν 2011, 15:39

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



#include <stdio.h>

int main(void)
{
int array[3]={1,2,3};
int *p;
p=array;

for(p=array; p=&array[4]; p++)
printf("%d", *p);

return 0;

}


γιατι μου δημιουργει ατερμονα βρογχο αυτο???? :/ Ενω ειναι οπως στο παραδειγμα στον οδηγο του migf1
Γνώσεις ⇛ 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: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 24 Ιουν 2011, 15:42

Γιατί στη συνθήκη αντι για < έχει =
Star_Light έγραψε:
Κώδικας: Επιλογή όλων



#include <stdio.h>

int main(void)
{
int array[3]={1,2,3};
int *p;
p=array;

for(p=array; p=&array[4]; p++)
printf("%d", *p);

return 0;

}


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

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 24 Ιουν 2011, 16:11

Α, και γιατί θέλει array[3]... δλδ...
Κώδικας: Επιλογή όλων

for (p=array; p < &array[3]; p++)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 26 Ιουν 2011, 00:27

ΕΥΧΑΡΙΣΤΩ migf1 να ρωτησω κατι αλλο.... στα αρχεια ας πουμε της C

Κώδικας: Επιλογή όλων
#include <stdio.h>
int main()
{
FILE *ptr; /*the file pointer*/
char *str="links.txt";

ptr=fopen(str,"a"); /*EPISTROFI deikti tipou FILE apo tin fopen
enw an sumvei la8os sti diarkeia tis diadikasias anoigmatos enos arxeiou 8a epistrepsei
enan deikti NULL diladi enan deikti pou deixnei se mi egkura dedomena */
fprintf(ptr,"The end of file");
fclose(ptr);

return 0;

}


ο δεικτης ptr που ειναι τυπου FILE ας πουμε και λεμε οτι δειχνει σε ενα αρχειο (καταρχην πιο πανω απλα ηθελα να κανω μια προσαρτησουλα στο links.txt) αυτος ο δεικτης... η μεταβλητη δεικτη ptr που ακριβως δειχνει δηλαδη? Ρωταω για να κατανοησω πληρως τι γινεται....
Γνώσεις ⇛ 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: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 26 Ιουν 2011, 01:55

To FILE είναι ένας τύπος δεδομένων (data type) που αντιστοιχεί σε μια συγκεκριμένη δομή (data structure) που ορίζεται στο αρχείο stdio.h. Στον κάθε compiler διαφέρει.

Π.χ. στον mingw ορίζεται ως εξής:
Κώδικας: Επιλογή όλων

typedef struct _iobuf
{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
} FILE;


ενώ στην Pelles-C ορίζεται ως εξής:
Κώδικας: Επιλογή όλων

#ifndef _WINCE
typedef struct FILE {
#if __POCC__ >= 500
unsigned int mode;
#else
unsigned short mode;
unsigned short pad;
#endif /* __POCC__ */
int fh;
unsigned char *buf, *bufend, *ptr;
unsigned char *getend, *putend, *backptr;
wchar_t *wbackptr, wbackbuf[2];
unsigned char *getback, *wgetend, *wputend;
mbstate_t wstate;
char *tmpnam;
unsigned char backbuf[8], cbuf;
#if __POCC__ >= 500
int locknum;
#endif /* __POCC__ >= 500 */
} FILE;


Ρίξε μια ματιά κι εδώ: http://en.wikipedia.org/wiki/Stdio.h (εκεί που λέει: Member Types).

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

Re: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό Star_Light » 26 Ιουν 2011, 02:43

Βασικα αυτο που ηθελα να κανω το εκανα οκ. Απλα εκανα προσαρτηση στο τελος της συμβολοσειρας που ειχα σαν δευτερο ορισμα μεσα στην fprintf. Απλα εκεινο που ηθελα να ρωτησω εγω ειναι που ακριβως δειχνει ο ptr στο ανοιχτο αρχειο???? Στην διευθυνση μνημης που ειναι αποθηκευμενο το αρχειο πχ???
Ενα αυτο... δευτερο στις βιβλιοθηκες που μου εδωσες να κοιταξω , ουσιαστικα οταν λεμε βιβλιοθηκη εννοουμε ενα ανεξαρτητο αρχειο πηγαιου κωδικα το οποιο μπορει να χρησιμοποιηθει για να οριστουν εκει μεσα καποιες συναρτησεις οι οποιες θα χρησιμοποιηθουν απο αλλα πηγαια αρχεια???

Και σορρυ αν σε ζαλιζω!
Γνώσεις ⇛ 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: ΚΕΦΑΛΑΙΟ 6 - ΔΕΙΚΤΕΣ

Δημοσίευσηαπό migf1 » 26 Ιουν 2011, 04:07

Ξεκινώντας από το δεύτερο, τα <stdio.h> κλπ δεν είναι βιβλιοθήκες (κακώς χρησιμοποιείται αυτός ο όρος στα Ελληνικά), είναι header files, τα οποία περιέχουν μέσα τους σταθερές, ορισμούς καθολικών μεταβλητών & δομών δεδομένων που έχουν χρησιμοποιηθεί για τη δημιουργία της εκάστοτε βιβλιοθήκης.

Δεν είναι όμως απαραίτητο να αναφέρονται υποχρεωτικά σε βιβλιοθήκες. Μπορείς κι εσύ να φτιάξεις δικά σου header files με σταθερές, ορισμούς, κλπ που σκοπεύεις να χρησιμοποιήσεις σε περισσότερα του ενός .c αρχείου (αν δλδ το πρόγραμμά σου αποτελείται από πολλά .c αρχεία), προσθέτοντας τη γραμμή: #include "myheader.h" (τα "", αντί για <>, λένε στον compiler να ψάξει για το header file πρώτα στον ίδιο φάκελο που υπάρχουν τα .c αρχεία του προγράμματος, κι αν δεν το βρουν εκεί τότε να το αναζητήσουν στο standard INCLUDE path.

Σου παραθέτω 3 links που εξηγούν περί header files: link-1, link-2, link-3

(αν δεις τον κώδικα της Ξερής στο άλλο νήμα, χρησιμοποιώ κι εγώ εκεί δικά μου header files, τα οποία τα καλώ σε όποιο .c τα χρειάζομαι).

Οι βιβλιοθήκες τώρα, είναι συλλογές από object files (.o στον gcc) που παράγει ο compiler για κάθε πηγαίο αρχείο .c, πριν παράξει το τελικό εκτελέσιμο αρχείο. Οι συλλογές αυτές στον gcc γίνονται archived σε ένα αρχείο .a με το εργαλείο ar και πρέπει πάντα να ξεκινάνει το όνομά του με "lib" (δες εδώ ένα mini-tutotial: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html).

Αν μια βιβλιοθήκη σου (library) την έχεις ονομάσει για παράδειγμα: libmine.a, τότε για να τη συμπεριλάβεις στο compilation του κώδικά σου, προσθέτεις στη γραμμή εντολών του gcc το flag -l ακολουθούμενο ΚΟΛΛΗΤΑ από το όναμα της βιβλιοθήκης σου, ΧΩΡΙΣ το "lib" και το ".a". Δηλαδή: gcc blabla -lmine, με την προϋπόθεση πως έχεις βάλει το αρχείο: libmine.a στο LIB path του shell σου (αλλιώς θα πρέπει στη γραμμή του gcc να δώσεις και το path στο οποίο βρίσκεατι η βιβλιοθήκη σου. Δες εδώ αναλυτικά tutorials: 1. http://www.crasseux.com/books/ctutorial ... #Libraries 2. http://www.crasseux.com/books/ctutorial ... brary.html)

Η διαδικασία και οι ονομασίες δεν είναι ίδια σε όλους τους compilers! Σχετικό-Άσχετο: τα αρχεία .dll που βλέπεις στα Windows είναι βιβλιοθήκες ;)

Τώρα, σε ότι αφορά το που δείχνει ο δείκτης ptr. Είναι δείκτης σε μεταβλητές του πρόσθετου τύπου FILE (που ουσιαστικά είναι ένα struct που ορίζεται μέσα στο στάνταρ header file <stdio.h>). Αντί π.χ. να είναι pointer of int, είναι pointer of struct _iobuf (στον mingw) το οποίο struct με τη σειρά του έχει οριστεί μέσα στο <stdio.h> με την εντολή typedef να είναι πρόσθετος τύπος δεδομένων (custom data type) με την ονομασία FILE.

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

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

Επιστροφή στο Μαθήματα C