I@n15 Δημοσ. 5 Αυγούστου 2009 Δημοσ. 5 Αυγούστου 2009 Γεια και χαρα σε ολους τους φιλους,η ερωτηση μου ειναι πως μπορω να χρησιμοποιησω στατικα struct,δινω το παρακατω παραδειγμα και θα θελα να μου πειτε αν ειναι προγραμματιστικα σωστο διοτι το αποτελεσμα ειναι ενταξει.Απλα εμφανιζω τους αριθμους απο 0-5 >#include <stdio.h> struct mystruct{ int x; }; static struct mystruct st; void func1() { extern struct mystruct st; printf("%i\n",st.x++); } int main() { int i; for(i = 0; i <= 4; i++) { func1(); } }
Billman Δημοσ. 5 Αυγούστου 2009 Δημοσ. 5 Αυγούστου 2009 http://wiki.answers.com/Q/What_is_a_static_identifier_in_C Το struct σου πέφτει στην περίπτωση της global μεταβλητής που θα αναγνωρίζεται μόνο μέσα στο αρχείο που έχει δηλωθεί.
I@n15 Δημοσ. 5 Αυγούστου 2009 Μέλος Δημοσ. 5 Αυγούστου 2009 α οποτε θα ισχυει μονο μεσα στην συναρτηση func1 αν καταλαβα καλα?
Billman Δημοσ. 5 Αυγούστου 2009 Δημοσ. 5 Αυγούστου 2009 Έτσι όπως είναι δηλωμένο, μπορεί να χρησιμοποιηθεί σε όποιο σημείο θες. Αν βγάλεις το extern blabla μέσα από την func1 δεν θα έχει κάποια επίδραση στο πως λειτουργεί το πρόγραμμα. Αν το struct είχε δηλωθεί σαν static μέσα στην func1 (και καθόλου από έξω), τότε το scope του θα ήταν μόνο μέσα στην func1, αλλά μεταξύ κλήσεων θα συνέχιζε να διατηρεί την τελευταία τιμή που του έδωσες.
karabouzouk... Δημοσ. 6 Αυγούστου 2009 Δημοσ. 6 Αυγούστου 2009 To extern απ ότι διάβασα εδώ χρησιμοποιήται για να διαχειριστείς μια μεταβλητή η οποία έχει δηλωθεί στον κώδικα άλλου προγράμματος C που εκτελείται την ίδια χρονική στιγμή. Και δεν έχει ουσία όπως είπε και ο προλαλήσαντας να το χρησιμοποιήσεις για να διαχειριστείς μεταβλητή που έχει δηλωθεί.. στο ίδιο πρόγραμμα..
bxenos Δημοσ. 6 Αυγούστου 2009 Δημοσ. 6 Αυγούστου 2009 To extern απ ότι διάβασα εδώ χρησιμοποιήται για να διαχειριστείς μια μεταβλητή η οποία έχει δηλωθεί στον κώδικα άλλου προγράμματος C που εκτελείται την ίδια χρονική στιγμή. αρχείου .c/.cpp του ίδιου προγράμματος Και δεν έχει ουσία όπως είπε και ο προλαλήσαντας να το χρησιμοποιήσεις για να διαχειριστείς μεταβλητή που έχει δηλωθεί.. στο ίδιο πρόγραμμα.. ...........................
I@n15 Δημοσ. 6 Αυγούστου 2009 Μέλος Δημοσ. 6 Αυγούστου 2009 οποτε αν καταλαβα καλα ειναι σωστο προγραμματιστικα ετσι οπως ειναι ο κωδικας?
karabouzouk... Δημοσ. 6 Αυγούστου 2009 Δημοσ. 6 Αυγούστου 2009 bxenos μπορείς να εξηγήσεις λίγο περισσότερο γιατί σαν νέος δεν το έπιασα..! Η αλήθεια ότι και μένα δεν μου κόλλαγε καλά έτσι όπως το κατάλαβα στην αρχή.. Τι εννοείς δλδ όταν λές άλλο αρχείο .c στο ίδιο πρόγραμμα..? Κάθε .c δεν έχει και το δικό του εκτελέσιμο...?
Evgenios1 Δημοσ. 6 Αυγούστου 2009 Δημοσ. 6 Αυγούστου 2009 Εγω παντος, το extern το ξερω ως extern "C" και ξερω οτι ειναι για import & export functions (σε cpp). Μια απορια. >[color="#8000ff"]int[/color] value; [color="#8000ff"]int[/color] main() { } Αυτο δεν ειναι στην ουσια >[color="#0000ff"][b]static[/b][/color] [color="#8000ff"]int[/color] value; [color="#0000ff"][b]static[/b][/color] [color="#8000ff"]int[/color] main() { }
bxenos Δημοσ. 6 Αυγούστου 2009 Δημοσ. 6 Αυγούστου 2009 το extern "C" είναι επιπλέον δήλωση για να γνωρίζει ο μεταγλωττιστης την ονοματολογία. Δηλαδή οι συναρτησεις void xxx(int) και double xxx(char *) στην C αποθηκεύονται στο object (compiled) αρχείο με το ίδιο ονομα (αρα δεν μπορουν να υπάρχουν στο ιδιο project), ενω στη cpp αποθηκεύονται με διαφορετικό όνομα το οποίο περιλαμβάνει και τους τύπους των ορισμάτων (ας πούμε xxxint και xxxcharp - παράδειγμα λέω, δεν θυμάμε πως μεταφράζονται τα ονόματα!). Ο linker που πέρνει όλα τα μεταγλωττισμένα (obj) και φτιάχνει το exe, πρέπει να βρεί ίδια ονόματα στη συνάρτηση κατα τον ορισμό και κατα την κλήση της. Αν λοιπόν έχουμε ενωσει ένα C αρχειο με ένα cpp και θέλουμε να καλούμε (ή να μπορουμε να καλέσουμε) συναρτησεις του ενός στο άλλο, πρέπει να διαλέξουμε κοινη ονοματολογια. Και το μόνο κοινο μεταξύ c/cpp είναι η ονοματολογια της C. ---------- Το μήνυμα προστέθηκε στις 12:44 ---------- ... > int value; int main() { } Αυτο δεν ειναι στην ουσια > static int value; static int main() { } το static int main() δεν θα μπορεσει να το βρεί ο linker αρα δεν θα κάνει exe, διότι το όνομα που θα πάρει η main στο object file είναι μοναδικό για όλο το project. Αρα δεν θα μπορέσει ο "loader" της C που καλεί τη main να τη βρεί, αρα ο Linker δεν μπορεί να κάνει link την main στον loader. Το static int value πέρνει και αυτό τυχαίο όνομα, αλλα αναλογα με τη λογική του προγραμματος, μπορεί να μην μας αφορα (αν δεν προσπαθούμε να προσπελάσουμε την value απο άλλο αρχείο ή δεν δηλώσουμε static value και σε άλλο αρχείο) ---------- Το μήνυμα προστέθηκε στις 12:44 ---------- Σ'αρεσαν τα χρωματάκια του karnage εεε;
Evgenios1 Δημοσ. 6 Αυγούστου 2009 Δημοσ. 6 Αυγούστου 2009 [οφτοπικ] @bxenos Αυτο το πραμα δε μου αρεσει με τη c++, δηλαδη, μερικοι compiler μπορουν να το κανουν μερικοι οχι κλπ κλπ.... πχ αυτο που παραθεσα, σε vc express edition γινετε compile χωρης warnings errors etc... re: σε αρεσαν τα... Αμε
bxenos Δημοσ. 6 Αυγούστου 2009 Δημοσ. 6 Αυγούστου 2009 @Εvgenios: Καλά πως το έβγαλες το bwoxen; ---------- Το μήνυμα προστέθηκε στις 13:07 ---------- bxenos μπορείς να εξηγήσεις λίγο περισσότερο γιατί σαν νέος δεν το έπιασα..! Η αλήθεια ότι και μένα δεν μου κόλλαγε καλά έτσι όπως το κατάλαβα στην αρχή..Τι εννοείς δλδ όταν λές άλλο αρχείο .c στο ίδιο πρόγραμμα..? Κάθε .c δεν έχει και το δικό του εκτελέσιμο...? > //αρχείο x1.c int xxx = 3; static int yyy = 4; > //αρχείο x2.c #include <stdio.h> extern int xxx;//η μεταβλητη είναι σε άλλο .c αρχειο int main(){ printf("xxx=%d",xxx); } cl x1.c x2.c ή gcc x1.c x2.c ένωσε τα δύο αρχεία .c για να φτιάξεις ένα exe. Π.χ σκέψου πως είναι γραμμένο ένα οποιοδήποτε πρόγραμμα (που δεν είναι απλά μια σχολική άσκηση). Εχει χιλιάδες γραμμές κώδικα, δεν είναι βολικο να το επεξεργαζόμαστε έτσι μεγάλο αν είναι σε ένα αρχείο. Βέβαια δεν το κόβουμε με τον αριθμό γραμμών αλλά με τη λειτουργικότητα του περιεχομένου του. άσχετο: αλλα τους πραγματικους αριθμους float/double τους κατάλαβες; δεν είχα πάρει απάντηση τοτε
karabouzouk... Δημοσ. 7 Αυγούστου 2009 Δημοσ. 7 Αυγούστου 2009 άσχετο: αλλα τους πραγματικους αριθμους float/double τους κατάλαβες; δεν είχα πάρει απάντηση τοτε Είχα ρίξει αρκετές ώρες διάβασμα τότε για να καταλάβω τι παίζει γενικότερα.. μπορώ να πώ στο μεγαλύτερο ποσοστό ότι τα έχω κατανοήσει..! Σόρρυ που δεν απάντησα τότε αλλά είχες κάνει πολύ καλή δουλειά και βοήθησε πολύ..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.