Star_Light Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 Λοιπον δεν ξερω τι συζητουν ο Star_light με τον migf1. Δεν μπορω να ακολουθησω την συζητηση μετα απο 9 ωρες functional programming. @defacer: Θα το κοιταξω αυτο που μου λες. Οταν λεω by reference προφανως και ξερω οτι δεν εχει τετοιο πραγμα η C απλα σου δινει τον κωδικα σε C. Εξαλλου θα μπορουσε να σου ελεγε το περνω με αυτο τον κωδικα με 15 τροπους. Θελω να πω οτι εστιαζει στα passing methods παρα στο πως και αν υλοποιειται αυτο. Γιατί να ξαναδηλώσεις την μεταβλητή? Ορίζοντας την x έξω απο την main την θετεις global συνεπώς και οποιοδηποτε function η αναθεση την αλλαζει. Οι αλλαγες παραμενουν οπουδηποτε βρω το x. Το θέμα είναι ότι η C/C++ δεν ακολουθούν static scope? Αν ναι ποιος ο ρόλος του εδώ? Η μλκια ειναι οτι σου απανταω ακριβως σε αυτο που ρωτας. Eιπαμε στην 1η περιπτωση.... οριζει μια τοπικη μεταβλητη με το ιδιο ονομα αρα το προγραμμα δεν λαμβανει υποψιν του μεσα σε αυτο το ευρος... της main την global σου. Μετα μολις κληθει η συναρτηση και πάψει να ισχυει περα απο εκει η local επειδη το scope της τελειωνει στο block {...} απο εκει και περα παιζεις με την global οπου η τιμη της ειναι 0. Η π**στια εδω ειναι οτι η ονομασια σε μεταβλητες με διαφορετικο scope ειναι η ΙΔΙΑ. Ετσι οπως ειχες φτιαξει εσυ το προγραμμα ηταν διαφορετικο απο αυτο που σου εξηγει η σελιδα που δινεις γιατι ουσιαστικα ξαναεδινες τιμη στην global και εχανε την προηγουμενη της...δεν οριζες εκ νεου δηλαδη μια local μεσα στην main. Καταλαβες? EDIT: ΕΧΕΙ κανεις καναν free img server να ανεβασω την σελιδα του βιβλιου στον migf1??? Το imageshack εχει κανει κατι μλκιες και δεν βγαζω ακρη και εχω βαρεθει κιολας με αυτο.... πρεπει να εχω ξεχασει και το pass μου.
migf1 Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 ... Ορίζοντας την x έξω απο την main την θετεις global συνεπώς και οποιοδηποτε function η αναθεση την αλλαζει. Οι αλλαγες παραμενουν οπουδηποτε βρω το x. Το θέμα είναι ότι η C/C++ δεν ακολουθούν static scope? Αν ναι ποιος ο ρόλος του εδώ? Τα σχόλια που έβαλα στον κώδικα που είχες παραθέσει δεν σε βοήθησαν; @Starlight: Γράφαμε μαζί στο τελευταίο, εσύ απάντηση εγώ edit... νομίζω πως εννοούσες αυτό που γράφω στο edit ε; Αν ναι, συμφώνησα στο edit εκείνο ως προς το static (όχι όμως ως προς το global ). ... EDIT : Οπα μηπως τα ειπες αναποδα??? Τα globals δεν έχουν file scope??? Τσου, είναι διαθέσιμα και σε άλλα αρχεία (με το keyword extern στα άλλα αρχεία).
Star_Light Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 μΥΣΤΗΡΙΑ πραγματα ή με εχει βαρεσει η ζεστη.... γιατι το βιβλιο γραφει ξεκαθαρα πως οι εξωτερικες μεταβλητες ή αλλιως global έχουν file scope... και πως να μην έχουν άλλωστε? Επισης βλεπω οτι ταυτιζεις πολυ την έννοια του scope με το storage duration. Πως γινεται αυτο? Αφου μια static local δεν ειναι visible εκτος της συναρτησης της... ενω μια external ειναι... και έχουν και το ιδιο storage duration... εσυ σε αυτο θα ελεγες οτι παιζουμε την κολοκυθια και αρα ιδιο scope κτλπ κτλπ... πρεπει να ανεβασω τις σελιδες του βιβλιου δεν γινεται... δεν θελω να επιβαλλω την αποψη μου να το ξεκαθαρισω αυτο.
migf1 Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 μΥΣΤΗΡΙΑ πραγματα ή με εχει βαρεσει η ζεστη.... γιατι το βιβλιο γραφει ξεκαθαρα πως οι εξωτερικες μεταβλητες ή αλλιως global έχουν file scope... και πως να μην έχουν άλλωστε? Επισης βλεπω οτι ταυτιζεις πολυ την έννοια του scope με το storage duration. Πως γινεται αυτο? Αφου μια static local δεν ειναι visible εκτος της συναρτησης της... ενω μια external ειναι... και έχουν και το ιδιο storage duration... εσυ σε αυτο θα ελεγες οτι παιζουμε την κολοκυθια και αρα ιδιο scope κτλπ κτλπ... πρεπει να ανεβασω τις σελιδες του βιβλιου δεν γινεται... δεν θελω να επιβαλλω την αποψη μου να το ξεκαθαρισω αυτο. Το external είναι κeyword στην C, το οποίο το χρησιμοποιούμε όταν θέλουμε σε ένα αρχείο να χρησιμοποιήσουμε μια μεταβλητή που είναι ορισμένη ως global σε κάποιο άλλο αρχείο... είσαι σίγουρος πως το απόσπασμα του βιβλίου που παράθεσες χρησιμοποιεί τη λέξη external ως το keyword extrernal και όχι με μια ενδεχομένως ευρύτερη έννοια που ενδεχομένως έχει διευκρινίσει νωρίτερα; > // file: main.c int i_am_a_global; extern print_from_other_file(void); int main( void ) { i_am_a_global = 0; // δεν χρειάζεται, οι globals αρχικοποιούνται αυτόματα σε 0 printf( "%d\n", i_am_a_global); print_from_other_file( ); } // file: other_file.c int print_from_other_file( void ) { extern i_am_a_global; i_am_a_global = 1; printf( "%d\n", i_am_a_global); } // compile & run gcc main.c other_file.c ./a.out ΥΓ. Oops, extern είναι το keyword (τώρα μου ήρθε που έγραφα τον κώδικα).
migf1 Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 Αν δεν ξεκαθαρίζει κάπου αλλού το βιβλίο πως οι globals δεν έχουν file scope (αλλά το scope τους εκτείνεται και στα υπόλοιπα αρχεία... μπορεί να το συναντήσεις σε context που μιλάει για external linkage) εκτός αν οριστούν ως static globals, τότε είναι σοβαρή του παράλειψη. ΥΓ. Δοκίμασε τον κώδικα που σου έγραψα.
Star_Light Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 Λες να διορθώσουμε το βιβλιο του King? Μολις δει εμενα θα τραβαει τα γυαλιά του ο τύπος... χαχαχα τελοςπαντων θα τα δω και θα τα ξαναπουμε.
defacer Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 Τι εννοείς όταν λες duration? Η αυτολεξί μετάφραση του duration είναι διάρκεια, η οποία όμως στην πληροφορική μεταφράζεται ως scope (εμβέλεια). Όπως σου εξήγησα λοιπόν στη C τα global και τα static δεν έχουν το ίδιο scope (άρα ούτε το ίδιο duration)) και άρα ούτε τα ίδια properties. Όχι ότι έχει ξαναγίνει ποτέ τέτοιου είδους λάθος σ' αυτό το forum, αλλά lifetime (ο σωστός όρος για το λεγόμενο duration) και scope είναι δύο τελείως διαφορετικά πράγματα. Επίσης αυτό που έχουν διαφορετικό η global και η static global δεν είναι το scope αλλά το linkage. Επειδή όμως σίγουρα δεν τα λέω σωστά για κάποιο απροσδιόριστο ακόμα λόγο αναμένω flames. μΥΣΤΗΡΙΑ πραγματα ή με εχει βαρεσει η ζεστη.... γιατι το βιβλιο γραφει ξεκαθαρα πως οι εξωτερικες μεταβλητες ή αλλιως global έχουν file scope... και πως να μην έχουν άλλωστε? Επισης βλεπω οτι ταυτιζεις πολυ την έννοια του scope με το storage duration. Άσε τι λέει το βιβλίο. Αν είσαι migf1 εσύ ξέρεις καλύτερα.
Timonkaipumpa Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 Όχι ότι έχει ξαναγίνει ποτέ τέτοιου είδους λάθος σ' αυτό το forum, αλλά lifetime (ο σωστός όρος για το λεγόμενο duration) και scope είναι δύο τελείως διαφορετικά πράγματα. Επίσης αυτό που έχουν διαφορετικό η global και η static global δεν είναι το scope (και οι δύο έχουν global scope όπως θα έλεγε κανείς από το όνομά τους) αλλά το linkage. +1 για το linkage. Για αυτό και το extern, αν και "βοηθάει" να περάσεις τον compiler... στην ουσία είναι οδηγία για τον linker.
migf1 Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 +1 για το linkage. Για αυτό και το extern, αν και "βοηθάει" να περάσεις τον compiler... στην ουσία είναι οδηγία για τον linker. http://www.insomnia....ost__p__4850027 (ούτε σελίδα δεν χρειάζεται να αλλάξετε ) @starlight: το duration σκέτο δεν μου κανε κλικ. Αν το έγραφες storage-duration όπως είναι η ολοκληρωμένη ορολογία θα είχαμε συνεννοηθεί από την αρχή. Όπως και να 'χει όμως, ήδη συνεννοηθήκαμε στο συγκεκριμένο σε εκείνο το edit κατά το οποίο γράφαμε μαζί.
ChRis6 Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 Ο defacer εχει δικιο.Αλλο η εμβελεια μιας μεταβλητης και αλλο η διαρκεια ζωης της. Συνδεονται κατα καποιο τροπο, αλλα "μετρανε" διαφορετικο μεγεθος. Επισης, οι static global μεταβλητες εχουν εμβελεια μονο μεσα στο αρχειο που οριζονται και οχι "γενικο" global. Εξου και το linkage Οι υπολοιπες global,οπως ειπε ο migf1, γινονται προσπελασιμες μεσω του extern Οι static τοπικες εχουν εμβελεια μεσα στην συναρητηση που οριζονται και εχουν ιδια διαρκεια ζωης με τις global. Για αυτο εξαλλου δεν αποθηκευονται στην στοιβα οταν καλουμε μια συναρτηση, αλλα στο χωρο στατικων δεδομων ! Αν ειμαι καπου λαθος διορθωστε με
migf1 Δημοσ. 10 Ιουλίου 2012 Δημοσ. 10 Ιουλίου 2012 Ο defacer εχει δικιο.Αλλο η εμβελεια μιας μεταβλητης και αλλο η διαρκεια ζωης της. Συνδεονται κατα καποιο τροπο, αλλα "μετρανε" διαφορετικο μεγεθος. Επισης, οι static global μεταβλητες εχουν εμβελεια μονο μεσα στο αρχειο που οριζονται και οχι "γενικο" global. Εξου και το linkage Οι υπολοιπες global,οπως ειπε ο migf1, γινονται προσπελασιμες μεσω του extern Οι static τοπικες εχουν εμβελεια μεσα στην συναρητηση που οριζονται και εχουν ιδια διαρκεια ζωης με τις global. Για αυτο εξαλλου δεν αποθηκευονται στην στοιβα οταν καλουμε μια συναρτηση, αλλα στο χωρο στατικων δεδομων ! Αν ειμαι καπου λαθος διορθωστε με Πουθενά δεν είσαι λάθος Χρήστο. Έτσι είναι (από ότι ξέρω κι εγώ δλδ). Το όλο μπέρδεμα ξεκίνησε (σε ότι με αφορά δηλαδή) από εκείνο το duration του starlight το οποίο εκείνη τη στιγμή δεν το συνέδεσα με το storage-duration, αλλά θεώρησα αυτοματοποιημένα ότι εννοούσε scope. Όταν διάβασα το απόσπασμα του βιβλίου που το αναφέρει ολοκληρωμένα (storage-duration) τότε κατάλαβα τι εννοούσε ο starlight κι έκανα edit συμφωνώντας μαζί του, αναφέροντας του σε εκείνο το edit το πιο χαρακτηριστικό παράδειγμα της διαφοράς μεταξύ scope και storage-duration, που είναι τα static locals. Στη συνέχεια προσπάθησα να του το ξεδιαλύνω αποφεύγοντας να τον μπλέξω με linkage, δίνοντάς του όμως σχετικό hint σε παρένθεση για να το ψάξει περισσότερο αν ενδιαφέρεται κι έχει και χρόνο.
ChRis6 Δημοσ. 11 Ιουλίου 2012 Δημοσ. 11 Ιουλίου 2012 Πουθενά δεν είσαι λάθος Χρήστο. Έτσι είναι (από ότι ξέρω κι εγώ δλδ). Το όλο μπέρδεμα ξεκίνησε (σε ότι με αφορά δηλαδή) από εκείνο το duration του starlight το οποίο εκείνη τη στιγμή δεν το συνέδεσα με το storage-duration, αλλά θεώρησα αυτοματοποιημένα ότι εννοούσε scope. Όταν διάβασα το απόσπασμα του βιβλίου που το αναφέρει ολοκληρωμένα (storage-duration) τότε κατάλαβα τι εννοούσε ο starlight κι έκανα edit συμφωνώντας μαζί του, αναφέροντας του σε εκείνο το edit το πιο χαρακτηριστικό παράδειγμα της διαφοράς μεταξύ scope και storage-duration, που είναι τα static locals. Στη συνέχεια προσπάθησα να του το ξεδιαλύνω αποφεύγοντας να τον μπλέξω με linkage, δίνοντάς του όμως σχετικό hint σε παρένθεση για να το ψάξει περισσότερο αν ενδιαφέρεται κι έχει και χρόνο. Κλασσικα ο starlight με την περιεργεια του για μαθηση Καταλαβα τι εγινε και ειχες δικιο scope-ception το παραδειγμα του ts
defacer Δημοσ. 11 Ιουλίου 2012 Δημοσ. 11 Ιουλίου 2012 Scope, lifetime, storage duration και linkage είναι τέσσερα διαφορετικά πράγματα (βέβαια η έννοια του storage duration είναι πολύ στενά συνδεδεμένη με το lifetime, και πάλι όμως δεν είναι το ίδιο πράγμα: storage duration είναι μια αφηρημένη έννοια για την οποία αυθαίρετα λέμε ότι υπάρχουν 3 επιλογές, ενώ lifetime είναι μια χειροπιαστή έννοια που εν γένει έχει "διαφορετική τιμή" για κάθε διαφορετικό identifier ενός προγράμματος). Για όποιον ενδιαφέρεται να μάθει: 6.2.1 Scopes of identifiers 1 An identifier can denote an object; a function; a tag or a member of a structure, union, or enumeration; a typedef name; a label name; a macro name; or a macro parameter. The same identifier can denote different entities at different points in the program. A member of an enumeration is called an enumeration constant. Macro names and macro parameters are not considered further here, because prior to the semantic phase of program translation any occurrences of macro names in the source file are replaced by the preprocessing token sequences that constitute their macro definitions. 2 For each different entity that an identifier designates, the identifier is visible (i.e., can be used) only within a region of program text called its scope. Different entities designated by the same identifier either have different scopes, or are in different name spaces. There are four kinds of scopes: function, file, block, and function prototype. (A function prototype is a declaration of a function that declares the types of its parameters.) 3 A label name is the only kind of identifier that has function scope. It can be used (in a goto statement) anywhere in the function in which it appears, and is declared implicitly by its syntactic appearance (followed by a : and a statement). 4 Every other identifier has scope determined by the placement of its declaration (in a declarator or type specifier). If the declarator or type specifier that declares the identifier appears outside of any block or list of parameters, the identifier has file scope, which terminates at the end of the translation unit. If the declarator or type specifier that declares the identifier appears inside a block or within the list of parameter declarations in a function definition, the identifier has block scope, which terminates at the end of the associated block. If the declarator or type specifier that declares the identifier appears within the list of parameter declarations in a function prototype (not part of a function definition), the identifier has function prototype scope, which terminates at the end of the function declarator. If an identifier designates two different entities in the same name space, the scopes might overlap. If so, the scope of one entity (the inner scope) will be a strict subset of the scope of the other entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope. 5 Unless explicitly stated otherwise, where this International Standard uses the term ‘‘identifier’’ to refer to some entity (as opposed to the syntactic construct), it refers to the entity in the relevant name space whose declaration is visible at the point the identifier occurs. 6 Two identifiers have the same scope if and only if their scopes terminate at the same point. 7 Structure, union, and enumeration tags have scope that begins just after the appearance of the tag in a type specifier that declares the tag. Each enumeration constant has scope that begins just after the appearance of its defining enumerator in an enumerator list. Any other identifier has scope that begins just after the completion of its declarator. 6.2.2 Linkages of identifiers 1 An identifier declared in different scopes or in the same scope more than once can be made to refer to the same object or function by a process called linkage. There are three kinds of linkage: external, internal, and none. 2 In the set of translation units and libraries that constitutes an entire program, each declaration of a particular identifier with external linkage denotes the same object or function. Within one translation unit, each declaration of an identifier with internal linkage denotes the same object or function. Each declaration of an identifier with no linkage denotes a unique entity. 3 If the declaration of a file scope identifier for an object or a function contains the storage-class specifier static, the identifier has internal linkage. 4 For an identifier declared with the storage-class specifier extern in a scope in which a prior declaration of that identifier is visible, if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration. If no prior declaration is visible, or if the prior declaration specifies no linkage, then the identifier has external linkage. 5 If the declaration of an identifier for a function has no storage-class specifier, its linkage is determined exactly as if it were declared with the storage-class specifier extern. If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external. 6 The following identifiers have no linkage: an identifier declared to be anything other than an object or a function; an identifier declared to be a function parameter; a block scope identifier for an object declared without the storage-class specifier extern. 7 If, within a translation unit, the same identifier appears with both internal and external linkage, the behavior is undefined. 6.2.4 Storage durations of objects 1 An object has a storage duration that determines its lifetime. There are three storage durations: static, automatic, and allocated. Allocated storage is described in 7.20.3. 2 The lifetime of an object is the portion of program execution during which storage is guaranteed to be reserved for it. An object exists, has a constant address, and retains its last-stored value throughout its lifetime. If an object is referred to outside of its lifetime, the behavior is undefined. The value of a pointer becomes indeterminate when the object it points to reaches the end of its lifetime. 3 An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup. 4 An object whose identifier is declared with no linkage and without the storage-class specifier static has automatic storage duration. 5 For such an object that does not have a variable length array type, its lifetime extends from entry into the block with which it is associated until execution of that block ends in any way. (Entering an enclosed block or calling a function suspends, but does not end, execution of the current block.) If the block is entered recursively, a new instance of the object is created each time. The initial value of the object is indeterminate. If an initialization is specified for the object, it is performed each time the declaration is reached in the execution of the block; otherwise, the value becomes indeterminate each time the declaration is reached. 6 For such an object that does have a variable length array type, its lifetime extends from the declaration of the object until execution of the program leaves the scope of the declaration. If the scope is entered recursively, a new instance of the object is created each time. The initial value of the object is indeterminate.
migf1 Δημοσ. 11 Ιουλίου 2012 Δημοσ. 11 Ιουλίου 2012 Κλασσικα ο starlight με την περιεργεια του για μαθηση Καταλαβα τι εγινε και ειχες δικιο scope-ception το παραδειγμα του ts Όλοι δίκιο είχαμε στο συγκεκριμένο μπέρδεμα (η βασική διαφοροποίηση ήταν ο βαθμός ειρωνείας που επέλεξε ο καθένας για να υπερασπιστεί το δίκιο του). Με λίγα λόγια πάντως, για όποιον θέλει έναν απλό κανόνα για να κάνει τη δουλειά του χωρίς να χρειάζεται να ανατρέχει σε εγχειρίδια κάθε 3 και λίγο (rule of thumb) είναι πως όπου μπαίνει το keyword static τότε η διαθεσιμότητα του οτιδήποτε ακολουθεί το static περιορίζεται/εκτείνεται στο τρέχον αρχείο και μόνο (είτε πρόκειται για μεταβλητή, είτε για συνάρτηση). Οτιδήποτε global είναι διαθέσιμο και σε άλλα αρχεία, με χρήση του keyword extern (το οποίο συχνά είναι προ-αιρετικό, αλλά βάζετέ το για να είστε παντού καλυμένοι).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα