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

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

Δημοσ.

Καλα και εμενα δεν με τρέλαναν :P

 

migf1 να σε ρωτήσω κατι?

 

Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της.

Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει?

Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση?

 

ASSembly-στικα ειναι αυτα που ρωτάω? :P

 

Μπαίνει στο CALL STACK του προγράμματος ως διεύθυνση, για περισσότερα δες εδώ (αναλυτικότατο άρθρο).

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

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

Δημοσ.

Έχω μια απορία αν και δεν είναι ακριβώς C ο κώδικας δίνεται σε C οπότε είπα να ρωτήσω εδώ

>
void foo(int x, int y, int z) {
  int t = z; z = y; y = x; x = t
}

void main {
  int k = 2; t[5] = {1,3,2,3,1};
  foo(t[k], t[4], k);
}

 

Ποιες τιμές θα έχουν το κ και το t μετα την κληση της foo αν η x,y,z μεταβιβαζονται κατ'αναφορα και κατα τιμη αποτελεσμα.

τι εχω βρει στο spoiler

 

 

by ref: k = 1 / t =2

by value-result: k = 1 / t =2

 

Δημοσ.

Η απορία ποια είναι; Εννοώ τρέχοντας τον κώδικα δεν σου λύνεται;

 

EDIT:

 

Btw, στον κώδικα που δίνεις δεν περνάς τίποτα by-reference, όλα by-value τα περνάς.

Δημοσ.

Η απορία ποια είναι; Εννοώ τρέχοντας τον κώδικα δεν σου λύνεται;

 

EDIT:

 

Btw, στον κώδικα που δίνεις δεν περνάς τίποτα by-reference, όλα by-value τα περνάς.

 

Ναι ειναι by value σαν κωδικας αλλα σου λεει κανοντας το στο χαρτι τρεχτο σαν by reference και σαν by value-result.

Aυτο συμβουλευτηκα για να βγαλω τα αποτελεσματα

http://www.cs.rutgers.edu/~lou/314-f04-slides/topic10_params.pdf

Δημοσ.

Ναι ειναι by value σαν κωδικας αλλα σου λεει κανοντας το στο χαρτι τρεχτο σαν by reference και σαν by value-result.

Aυτο συμβουλευτηκα για να βγαλω τα αποτελεσματα

http://www.cs.rutger...ic10_params.pdf

Οκ, αλλά γιατί δεν το τρέχεις και ως by-reference και να δεις το αποτέλεσμα;

 

>
void foo(int *x, int *y, int *z) {
  int t = *z;
  *z = *y;
  *y = *x;
  *x = t;
}

void main {
  int k = 2; t[5] = {1,3,2,3,1};
  foo( &t[k], &t[4], &k );
}

Δημοσ.

οκ ειμαι σωστος στο by-reference. Τωρα το by value-result είναι το ίδιο?

Για να είμαι ειλικρινής δεν καταλαβαίνω που είναι το πρόβλημα. Έχεις τον κώδικα για να κάνεις οποιαδήποτε επαλήθευση/διάψευση επιθυμείς.

Δημοσ. (επεξεργασμένο)

Ναι, περιπου αυτο συμβαινει. Για καθε προγραμμα υπαρχει ο program counter καταχωρητης ( $pc ) που δειχνει ποια ειναι η επομενη προς εκτελεση εντολη . Προτου ο $pc αλλαξει στην διευθυνση που βρισκεται η συναρτηση σου, αποθηκευεται η επομενη εντολη ( $pc + 4 αν καθε εντολη ειναι 4 bytes ) στην στοιβα και για να επιστρεψει η συναρτηση , παιρνει την διευθυνση μνημης του προγραμματος που λεει η στοιβα και την βαζει στον $pc . Ετσι το προγραμμα συνεχιζει απο το σημειο που εγινε η κληση της συναρτησης

 

Καλη εξήγηση :P

 

ο migf1 ελεγε οτι ειναι πιο μνημοβορα η αναδρομη λογω του παραδειγματος που θα δωσω.

Μιας και πιασαμε το CALL STACK Και ειδα και λιγο stack overflow.

 

Έστω

>
#include <stdio.h>
int func1(int x , int y);
int func2(int x , int y);

int main(void)
{
  int r1 , r2;
  int x, y ;
  
  printf("Give x: ");
  scanf("%d" , &x);
  
  printf("Give y : ");
  scanf("%d" , &y);
  
  r1=func1(x,y);
  r2=func2(x,y);
  printf("%d + %d = %d" , x , y , r1);
  printf("\n%d - %d = %d" ,x ,y , r2);
  
  
       return 0;
}
int func1(int x , int y)
{
  return x+y;
}
int func2( int x , int y)
{
  
  return x-y;
}

 

Η εικονα εδω περιγράφει τι γινεται στη στοιβα...

http://imageshack.us/photo/my-images/859/18027figure352.gif/

 

στην περιπτωση της αναδρομης ομως η στοιβα δεν "αδειαζει" αν εχω καταλαβει καλα

οπως στην περιπτωση της μη αναδρομης... πχ

 

http://imageshack.us/photo/my-images/20/18027figure351.gif/

 

ΑΝ μέσα απο την func1 καλέσεις την func2.

Επεξ/σία από Star_Light
Δημοσ.

Εχω λάθος εδω που βγαζει ματι :S

 

Οι func1 και 2 δεν ειναι αναδρομικες καταρχην.

 

Η στοιβα μπορει να γεμισει οχι μονο λογω αναδρομικοτητας

αλλα και γενικα αμα καλεις την μια συναρτηση μεσα απο την άλλη.

Χωρις να καλείς ξεχωριστα συναρτήσεις μεσα απο την main και οταν τελειωνει η μια να αρχιζει η άλλη.

 

Καλα κανεις δεν ειδε το λάθος? :P

 

και εγω τυχαια το ειδα ελεος!

Δημοσ.

ο migf1 ελεγε οτι ειναι πιο μνημοβορα η αναδρομη λογω του παραδειγματος που θα δωσω.

 

Θυμαμαι πηγα να σου απαντησω, αλλα λεω "κατσε μπορει να κανει EDIT και να βαλει και αναδρομη" ^_^

Δημοσ.

Θυμαμαι πηγα να σου απαντησω, αλλα λεω "κατσε μπορει να κανει EDIT και να βαλει και αναδρομη" ^_^

 

Καλα δεν πειράζει αφου το βρήκα μονος μου. Καλύτερα !!!!

Κοιτα τα έβαλα γρηγορα και δεν το προσεξα καλα... τωρα που το ειδα καλυτερα

ανακαλυψα την πατατουλα. :P

 

Εγώ πάντως δεν είδα καν το ποστ :lol:

 

 

Kακως! Γιατι αφενος ειναι ενα σημαντικο θεμα

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

και να μπει στο νοημα. :P

 

EDIT: Τελοςπαντων κραταμε αυτα τα 2 διαγραμματα τωρα απλα στο ενα που η func2 μπαινει πανω απο την 1 παρομοια δουλευει και η αναδρομη μεσα στην στοιβα.

Δημοσ.

Καλα δεν πειράζει αφου το βρήκα μονος μου. Καλύτερα !!!!

Κοιτα τα έβαλα γρηγορα και δεν το προσεξα καλα... τωρα που το ειδα καλυτερα

ανακαλυψα την πατατουλα. :P

 

Ετσι μπραβο. Απο το να σου πει καποιος : ε μαστορα εδω δεν εχεις αναδρομη ( :mrgreen: ) , καλυτερα που το βρηκες μονος σου.

Δημοσ.

Ετσι μπραβο. Απο το να σου πει καποιος : ε μαστορα εδω δεν εχεις αναδρομη ( :mrgreen: ) , καλυτερα που το βρηκες μονος σου.

 

 

χαχαχχα αστο δεν με συμφερει να το συζηταω αλλο γιατι εβγαζε ματι. :P

 

edit: Παιδια απλα οποιος έχει χρονο να κοιτάει και αυτο εδω το θρεντ να διορθωνει

καμια πατάτα που διαφεύγει απο τους γράφοντες. Τωρα ο μιγφ1 που ειπε οτι δεν το κοιταξε

δεν ξερω γιατι το ειπε αυτο :/

 

Γενικα απο τις συζητησεις μαθαινεις καλυτερα καμια φορα... τα βιβλια ειναι βουβά.

Δεν απαντάνε παντα σε ολες τις ερωτησεις μας ειδικα αν προκυψουν παρερμηνειες που ειναι

συχνο φαινομενο

Δημοσ.

...Τωρα ο μιγφ1 που ειπε οτι δεν το κοιταξε

δεν ξερω γιατι το ειπε αυτο :/

...

Δεν κοίταξα καν το συγκεκριμένο ποστ γιατί θεώρησα πως δεν θα χρειαστεί περαιτέρω ανάλυση μετά την ανάγνωση του link που δώσαμε κι εγώ κι ο direct-x.

 

Είναι δηλαδή προφανές μετά την ανάγνωση του link πως κάθε νέα κλήση συνάρτησης αυξάνει το stack-space και κάθε τερματισμός κλήσης το μειώνει.

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

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