Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

>#include <stdio.h>

int x = 0;

void p(int y, int z){
printf("%d\n",x);
x = x+1;
y = y+1;
z = z+1;
printf("%d\n", x+y+z);
}

int main(){
x = 1;
printf("%d\n",x);
p(x,x);
}

 

Οταν θέλω να περάσω την παραμετρο x η C περνα by value. Γιατι ο compiler δινει ως αποτελεσμα στο αθροισμα 6 ενώ το

http://www.lix.polytechnique.fr/~catuscia/teaching/cg428/exercises/scope_solutions.html δίνει αποτέλεσμα 5?

Επίσης δεν καταλαβαίνω πως βγαζει by reference 7. Καμιά ιδέα κανείς?

  • Απαντ. 31
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσ.

Δοκίμασε μέσα στη main να δώσεις int x = 1 και δες τη διαφορά. Σκέψου πού οφείλεται. Μετά απ' αυτό πιθανόν να βγάλεις το συμπέρασμα μόνος σου.

 

By ref δεν ξέρω τι εννοείς γιατί δεν υπάρχει η έννοια στη C, αν θέλεις δώσε σχετικό κώδικα.

Δημοσ.

O compiler σωστά βγάζει 6...

 

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

int x = 0;		// global

//-----------------------------------------------
void p(int y, int z)
{
printf("x in p(): %d\n", x);
x = x+1;	// x is 1 because it comes from main(), so this evaluates to 2
y = y+1;	// y is 1, because x in main() is 1, so this evaluates to 2
z = z+1;	// z is 1, because x in main() is 1, so this evaluated to 2
printf("sum in p(): %d\n", x+y+z);	// 2+2+2 = 6
}

//-----------------------------------------------
int main( void )
{
x = 1;  // global x is set to 1
printf("x in main(): %d\n", x);
p(x,x);		// p(1,1)  --- global x is passed by value to p, in both its parameters

system( "pause" );
exit(0);
}

 

Για τα υπόλοιπα βαριέμαι να διαβάσω ολόκληρο το link που δίνεις για να βρω σε τι ακριβώς αναφέρεσαι :P

Κάνε αν θες τα συγκεκριμένα τμήματα εδώ σε παράθεση, ξεχωριστά για κάθε σου ερώτηση.

 

EDIT: Εγώ ξέρω τι εννοείς όταν λες by-ref, αλλά απλώς βαριέμαι να ψάχνω σε όλο το link που δίνεις.

 

EDIT2: Διόρθωση του σχολίου // unused για την global x, και προσθήκη ενός ακόμα στην main()

Δημοσ.

Κοιτα κατι μου λεει πως το προβλημα σου ειναι οτι δεν μπορεις να ξεχωρισεις την διαφορα

μεταξυ μιας καθολικης μεταβλητης και μιας τοπικης με το ιδιο ονομα... Λογικα εδω εκεινο που συμβαινει ειναι οτι μεσα στην main αγνοειται η καθολικη σου μεταβλητη που έχει και static χρονο ζωής. Η εμβελεια επηρεαζει τον χρονο ζωης μιας μεταβλητης. Μετα μολις μπει στη συναρτηση η τοπικη μεταβλητη εχει ξεπερασει την εμβελεια της και συνεχιζεις με την καθολικη. Προσεξε να δεις τι λεει στα κητάπια ->

The value printed is 5 (Since C++ has static scope, the x in the body of p is the global variable, which has value 1 when the print instruction is executed.)

 

Η x μεσα στο σωματακι της p ειναι η global σου επειδη τις εχει με ιδια ονοματα... αρα η αλλη σου λεει ειναι η τοπικη. Καταλαβες?

 

>Το Call by reference αστο για την ωρα και δες το μολις κανεις δεικτες και συναρτησεις... Call by reference δεν υπάρχει πραγματικα στη C απλα το πετυχαινεις μεσω δεικτων.

 

>Προσεξε και κατι σαν αυτο

 

>
#include <stdio.h>
int foo(int x , int y);
int c=1;

int main(void)
{
	int i , j;
	
	for(i=0 , j=0; i<5; i++ , j++)
	printf(" Πρόσθεση του %d και %d δίνει %d. \n \n" , i , j , foo(i,j));
	
   return 0;
}
int foo(int x , int y)
{
c=2;

printf(" Αυτη είναι η %d κλήση της συνάρτησης \n " , ++c);

return x+y ;
}

 

Απο την στιγμη που θέτεις ξανα c=2 δεν έχει πλεον σημασια η "static" φυση της global μεταβλητης... καλα οχι πως εχει και μεγαλο νοημα να μην αρχικοποιησεις εξαρχης την μεταβλητη στο 2 και να το κανεις μετα... μεταξυ μας για μενα δεν εχει απλα δες και αυτο.

 

O compiler σωστά βγάζει 6...

 

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

int x = 0;		// global

//-----------------------------------------------
void p(int y, int z)
{
printf("x in p(): %d\n", x);
x = x+1;	// x is 1 because it comes from main(), so this evaluates to 2
y = y+1;	// y is 1, because x in main() is 1, so this evaluates to 2
z = z+1;	// z is 1, because x in main() is 1, so this evaluated to 2
printf("sum in p(): %d\n", x+y+z);	// 2+2+2 = 6
}

//-----------------------------------------------
int main( void )
{
x = 1;  // global x is set to 1
printf("x in main(): %d\n", x);
p(x,x);		// p(1,1)  --- global x is passed by value to p, in both its parameters

system( "pause" );
exit(0);
}

 

Για τα υπόλοιπα βαριέμαι να διαβάσω ολόκληρο το link που δίνεις για να βρω σε τι ακριβώς αναφέρεσαι :P

Κάνε αν θες τα συγκεκριμένα τμήματα εδώ σε παράθεση, ξεχωριστά για κάθε σου ερώτηση.

 

EDIT: Εγώ ξέρω τι εννοείς όταν λες by-ref, αλλά απλώς βαριέμαι να ψάχνω σε όλο το link που δίνεις.

 

EDIT2: Διόρθωση του σχολίου // unused για την global x, και προσθήκη ενός ακόμα στην main()

 

Υποτιθεται πως σε μια global σε ενδιαφερει το static duration. Με την εκχωρηση που κανεις ομως το αναιρεις

γιατι χανει πλεον την τιμη του. Διαφορετικο ειναι αυτο που κανεις με το int x ξανα που γράφτηκε πιο πάνω

 

Δεν ξαναβλεπεις την τιμη του ξανα μπροστα σου δηλαδη επειδη η τοπικη μεταβλητη "έχασε" πλεον την εμβελεια της.

Αυτο μπορει να χει νοημα πες μονο αν σε ενδιαφερει να ειναι visible η μεταβλητη σε ολες τις συναρτησεις

που την χρησιμοποιεις αλλα αυτο με τη σειρα του εχει αλλες παρενεργειες... πχ μνήμη. :P

Δημοσ.

...

Υποτιθεται πως σε μια global σε ενδιαφερει το static duration. Με την εκχωρηση που κανεις ομως το αναιρεις

γιατι χανει πλεον την τιμη του. Διαφορετικο ειναι αυτο που κανεις με το int x ξανα που γράφτηκε πιο πάνω

 

Δεν ξαναβλεπεις την τιμη του ξανα μπροστα σου δηλαδη επειδη η τοπικη μεταβλητη "έχασε" πλεον την εμβελεια της.

Αυτο μπορει να χει νοημα πες μονο αν σε ενδιαφερει να ειναι visible η μεταβλητη σε ολες τις συναρτησεις

που την χρησιμοποιεις αλλα αυτο με τη σειρα του εχει αλλες παρενεργειες... πχ μνήμη. :P

Οι μεταβλητές δεν χάνουν την εμβέλειά τους ποτέ. Παραμένει σταθερή η εμβέλεια από τη στιγμή που την ορίζουμε και δεν μπορούμε να την ξαναλλάξουμε. Αυτό που μπορούμε να αλλάξουμε είναι οι τιμές των μεταβλητών, ανεξαρτήτως της εμβέλειας που έχουν.

 

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

Δημοσ.

Οι μεταβλητές δεν χάνουν την εμβέλειά τους ποτέ. Παραμένει σταθερή η εμβέλεια από τη στιγμή που την ορίζουμε και δεν μπορούμε να την ξαναλλάξουμε. Αυτό που μπορούμε να αλλάξουμε είναι οι τιμές των μεταβλητών, ανεξαρτήτως της εμβέλειας που έχουν.

 

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

 

Nαι οταν λεω έχασε την εμβελεια της εννοουσα οτι εχει local scope και αρα

δεν εχει πιο περα πεδιο δρασης οταν καλειται η αλλη συναρτηση δεν ειναι με ακριβεια διατυπωμενο. Τις τιμες των μεταβλητων μπορεις

να τις αλλαξεις ουτως ή αλλως ειτε μιλας για scope ειτε οχι.

 

Το global βασικα επειδη εχει τα ιδια properties με μια static int x πχ μπορεις να

το χρησιμοποιησεις οπως θα χρησιμοποιούσες και την static στο παραδειγμα που έδωσα πιο πανω με την προυποθεση οτι θα εβγαζες την γραμμη της δηλωσης της global και μεσα στην συναρτηση θα εγραφες static int ....

ωστε να "θυμαται" η συναρτηση την τιμή που θέλεις αναμεσα στις διαδοχικες της κλησεις. Οταν ελεγα αναιρεις εννοουσα οτι παυει να θυμαται την τιμη στις διαδοχικες κλησεις της. Κατα τα αλλα ναι οκ την χρησιμοποιεις για να ειναι visible παντου.

 

Διαφωνεις ?

Δημοσ.

Nαι οταν λεω έχασε την εμβελεια της εννοουσα οτι εχει local scope και αρα

δεν εχει πιο περα πεδιο δρασης οταν καλειται η αλλη συναρτηση. Τις τιμες των μεταβλητων μπορεις

να τις αλλαξεις ουτως ή αλλως ειτε μιλας για scope ειτε οχι.

 

Το global βασικα επειδη εχει τα ιδια properties με μια static int x πχ μπορεις να

το χρησιμοποιησεις οπως θα χρησιμοποιούσες και την static στο παραδειγμα που έδωσα πιο πανω με την προυποθεση οτι θα εβγαζες την γραμμη της δηλωσης της global και μεσα στην συναρτηση θα εγραφες static int ....

ωστε να "θυμαται" η συναρτηση την τιμή που θέλεις αναμεσα στις διαδοχικες της κλησεις. Οταν ελεγα αναιρεις εννοουσα οτι παυει να θυμαται την τιμη στις διαδοχικες κλησεις της.

 

Διαφωνεις ?

Διαφωνώ, γιατί το static και το global δεν έχουν τα ίδια properties. Το static περιορίζει την εμβέλεια στο τρέχον μπλοκ, που αν μιλάμε για static global τότε είναι το τρέχον αρχείο. Το global είναι διαθέσιμο και σε άλλα αρχεία.

Δημοσ.

Διαφωνώ, γιατί το static και το global δεν έχουν τα ίδια properties. Το static περιορίζει την εμβέλεια στο τρέχον μπλοκ, που αν μιλάμε για static global τότε είναι το τρέχον αρχείο. Το global είναι διαθέσιμο και σε άλλα αρχεία.

 

Ιδια properties ως προς το duration :P

διορθώνω....

Δημοσ.

Ιδια properties ως προς το duration :P

διορθώνω....

Τι εννοείς όταν λες duration? Η αυτολεξί μετάφραση του duration είναι διάρκεια, η οποία όμως στην πληροφορική μεταφράζεται ως scope (εμβέλεια).

 

Όπως σου εξήγησα λοιπόν στη C τα global και τα static δεν έχουν το ίδιο scope (άρα ούτε το ίδιο duration)) και άρα ούτε τα ίδια properties.

Δημοσ.

Τι εννοείς όταν λες duration? Η αυτολεξί μετάφραση του duration είναι διάρκεια, η οποία όμως στην πληροφορική μεταφράζεται ως scope (εμβέλεια).

 

Όπως σου εξήγησα λοιπόν στη C τα global και τα static δεν έχουν το ίδιο scope (άρα ούτε το ίδιο duration)) και άρα ούτε τα ίδια properties.

 

Μια πρωτη πηγη που μου ερχεται στο μυαλο ειναι το βιβλιο του King

στην Σελ. 221

 

p.s Δεν μιλησα για scope... για διαρκεια ζωης της μεταβλητης μιλησα.

Ιδιο scope σιγουρα δεν εχουν μιας και οι global έχουν file scope .

Δημοσ.

Μια πρωτη πηγη που μου ερχεται στο μυαλο ειναι το βιβλιο του King

στην Σελ. 221

Ο οποίος λέει τι;

 

...

p.s Δεν μιλησα για scope... για διαρκεια ζωης της μεταβλητης μιλησα.

ρε συ Κώστα την κολοκυθιά θα παίξουμε τώρα; Η διάρκεια ζωής είναι το scope λέμε!

Δημοσ.

Ο οποίος λέει τι;

 

External Variables have static storage duration , just like local variables that have been declared static. Α value stored in an external variable will stay there indefinitely

 

Λες να έπεσα τοσο έξω στα Αγγλικά? :P

 

Και το έχω δει και με παραδειγμα οτι ισχυει αυτο που σου έγραψα

δεν το εγραψα ετσι...

Δημοσ.

External Variables have static storage duration , just like local variables that have been declared static. Α value stored in an external variable will stay there indefinitely

 

Λες να έπεσα τοσο έξω στα Αγγλικά? :P

 

Και το έχω δει και με παραδειγμα οτι ισχυει αυτο που σου έγραψα

δεν το εγραψα ετσι...

Τι σχέση έχει αυτό με το ότι τα globals έχουν τα ίδια properties με τα static στο οποίο επιμένεις;

 

EDIT:

 

Οκ, έπιασα τι εννοείς. Εννοείς τα static locals εσύ, ε; Αν ναι, τότε ναι...έχεις δίκιο, έχουν κι αυτά file scope ;)

 

Τα globals δεν έχουν όμως.

Δημοσ.

Κοιτα αν δεν εχεις το βιβλιο δεν μπορουμε να συζητησουμε. :/

 

Μια απο τις 2 ιδιοτητες που εχει μεσα σε τελιτσες ειναι ο χρονος ζωης της μεταβλητης ή αλλιως storage duration... και λεει πως ως προς αυτο και οι εξτερναλ και οι στατικ λοκαλ μπορουν να ταυτιζονται.

Το προβλημα ποιο ειναι?

 

Διαφωνω οτι το scope ειναι ιδιο με τη διαρκεια ετσι οπως το γραφει το βιβλιο εδω

αλλα αν δεν το εχεις... οπως ειπα και πριν τι μπορουμε να πουμε? :/

 

Εφοσον εχουν ιδια διαρκεια τα στατικ λοκαλς με τα γκομπαλ το scope τους δεν ειναι ιδιο ομως...

 

EDIT : Οπα μηπως τα ειπες αναποδα??? :P

Τα globals δεν έχουν file scope???

Δημοσ.

Λοιπον δεν ξερω τι συζητουν ο Star_light με τον migf1. Δεν μπορω να ακολουθησω την συζητηση μετα απο 9 ωρες functional programming.

@defacer: Θα το κοιταξω αυτο που μου λες. Οταν λεω by reference προφανως και ξερω οτι δεν εχει τετοιο πραγμα η C απλα σου δινει τον κωδικα σε C. Εξαλλου θα μπορουσε να σου ελεγε το περνω με αυτο τον κωδικα με 15 τροπους. Θελω να πω οτι εστιαζει στα passing methods παρα στο πως και αν υλοποιειται αυτο.

 

Γιατί να ξαναδηλώσεις την μεταβλητή? Ορίζοντας την x έξω απο την main την θετεις global συνεπώς και οποιοδηποτε function η αναθεση την αλλαζει. Οι αλλαγες παραμενουν οπουδηποτε βρω το x. Το θέμα είναι ότι η C/C++ δεν ακολουθούν static scope? Αν ναι ποιος ο ρόλος του εδώ?

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...