Directx Δημοσ. 4 Ιουνίου 2012 Δημοσ. 4 Ιουνίου 2012 Καλα και εμενα δεν με τρέλαναν migf1 να σε ρωτήσω κατι? Αν εγω έχω ας πουμε μια συναρτηση μέσα στην main() και την καλέσω απο κάποιο σημείο της. Το σημείο αυτο μπαίνει στην στοίβα ωστε μολις η συνάρτηση τελειώσει να ξέρει που θα επιστρέψει? Αυτο το σημείο ας πούμε πως ταυτοποιείται μέσα στην στοίβα κλήσεων? Σαν διευθυνση? ASSembly-στικα ειναι αυτα που ρωτάω? Μπαίνει στο CALL STACK του προγράμματος ως διεύθυνση, για περισσότερα δες εδώ (αναλυτικότατο άρθρο).
Anubis13 Δημοσ. 5 Ιουνίου 2012 Δημοσ. 5 Ιουνίου 2012 Έχω μια απορία αν και δεν είναι ακριβώς 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
migf1 Δημοσ. 5 Ιουνίου 2012 Δημοσ. 5 Ιουνίου 2012 Η απορία ποια είναι; Εννοώ τρέχοντας τον κώδικα δεν σου λύνεται; EDIT: Btw, στον κώδικα που δίνεις δεν περνάς τίποτα by-reference, όλα by-value τα περνάς.
Anubis13 Δημοσ. 5 Ιουνίου 2012 Δημοσ. 5 Ιουνίου 2012 Η απορία ποια είναι; Εννοώ τρέχοντας τον κώδικα δεν σου λύνεται; 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
migf1 Δημοσ. 5 Ιουνίου 2012 Δημοσ. 5 Ιουνίου 2012 Ναι ειναι 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 ); }
Anubis13 Δημοσ. 5 Ιουνίου 2012 Δημοσ. 5 Ιουνίου 2012 οκ ειμαι σωστος στο by-reference. Τωρα το by value-result είναι το ίδιο?
migf1 Δημοσ. 5 Ιουνίου 2012 Δημοσ. 5 Ιουνίου 2012 οκ ειμαι σωστος στο by-reference. Τωρα το by value-result είναι το ίδιο? Για να είμαι ειλικρινής δεν καταλαβαίνω που είναι το πρόβλημα. Έχεις τον κώδικα για να κάνεις οποιαδήποτε επαλήθευση/διάψευση επιθυμείς.
Star_Light Δημοσ. 10 Ιουνίου 2012 Δημοσ. 10 Ιουνίου 2012 (επεξεργασμένο) Ναι, περιπου αυτο συμβαινει. Για καθε προγραμμα υπαρχει ο program counter καταχωρητης ( $pc ) που δειχνει ποια ειναι η επομενη προς εκτελεση εντολη . Προτου ο $pc αλλαξει στην διευθυνση που βρισκεται η συναρτηση σου, αποθηκευεται η επομενη εντολη ( $pc + 4 αν καθε εντολη ειναι 4 bytes ) στην στοιβα και για να επιστρεψει η συναρτηση , παιρνει την διευθυνση μνημης του προγραμματος που λεει η στοιβα και την βαζει στον $pc . Ετσι το προγραμμα συνεχιζει απο το σημειο που εγινε η κληση της συναρτησης Καλη εξήγηση ο 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. Επεξ/σία 10 Ιουνίου 2012 από Star_Light
Star_Light Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 Εχω λάθος εδω που βγαζει ματι :S Οι func1 και 2 δεν ειναι αναδρομικες καταρχην. Η στοιβα μπορει να γεμισει οχι μονο λογω αναδρομικοτητας αλλα και γενικα αμα καλεις την μια συναρτηση μεσα απο την άλλη. Χωρις να καλείς ξεχωριστα συναρτήσεις μεσα απο την main και οταν τελειωνει η μια να αρχιζει η άλλη. Καλα κανεις δεν ειδε το λάθος? και εγω τυχαια το ειδα ελεος!
migf1 Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 ... Καλα κανεις δεν ειδε το λάθος? και εγω τυχαια το ειδα ελεος! Εγώ πάντως δεν είδα καν το ποστ
ChRis6 Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 ο migf1 ελεγε οτι ειναι πιο μνημοβορα η αναδρομη λογω του παραδειγματος που θα δωσω. Θυμαμαι πηγα να σου απαντησω, αλλα λεω "κατσε μπορει να κανει EDIT και να βαλει και αναδρομη"
Star_Light Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 Θυμαμαι πηγα να σου απαντησω, αλλα λεω "κατσε μπορει να κανει EDIT και να βαλει και αναδρομη" Καλα δεν πειράζει αφου το βρήκα μονος μου. Καλύτερα !!!! Κοιτα τα έβαλα γρηγορα και δεν το προσεξα καλα... τωρα που το ειδα καλυτερα ανακαλυψα την πατατουλα. Εγώ πάντως δεν είδα καν το ποστ Kακως! Γιατι αφενος ειναι ενα σημαντικο θεμα και αφετερου μπορει καποιος να το καταλαβει ευκολα με ενα απλο διαγραμμα και να μπει στο νοημα. EDIT: Τελοςπαντων κραταμε αυτα τα 2 διαγραμματα τωρα απλα στο ενα που η func2 μπαινει πανω απο την 1 παρομοια δουλευει και η αναδρομη μεσα στην στοιβα.
ChRis6 Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 Καλα δεν πειράζει αφου το βρήκα μονος μου. Καλύτερα !!!! Κοιτα τα έβαλα γρηγορα και δεν το προσεξα καλα... τωρα που το ειδα καλυτερα ανακαλυψα την πατατουλα. Ετσι μπραβο. Απο το να σου πει καποιος : ε μαστορα εδω δεν εχεις αναδρομη ( ) , καλυτερα που το βρηκες μονος σου.
Star_Light Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 Ετσι μπραβο. Απο το να σου πει καποιος : ε μαστορα εδω δεν εχεις αναδρομη ( ) , καλυτερα που το βρηκες μονος σου. χαχαχχα αστο δεν με συμφερει να το συζηταω αλλο γιατι εβγαζε ματι. edit: Παιδια απλα οποιος έχει χρονο να κοιτάει και αυτο εδω το θρεντ να διορθωνει καμια πατάτα που διαφεύγει απο τους γράφοντες. Τωρα ο μιγφ1 που ειπε οτι δεν το κοιταξε δεν ξερω γιατι το ειπε αυτο :/ Γενικα απο τις συζητησεις μαθαινεις καλυτερα καμια φορα... τα βιβλια ειναι βουβά. Δεν απαντάνε παντα σε ολες τις ερωτησεις μας ειδικα αν προκυψουν παρερμηνειες που ειναι συχνο φαινομενο
migf1 Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 ...Τωρα ο μιγφ1 που ειπε οτι δεν το κοιταξε δεν ξερω γιατι το ειπε αυτο :/ ... Δεν κοίταξα καν το συγκεκριμένο ποστ γιατί θεώρησα πως δεν θα χρειαστεί περαιτέρω ανάλυση μετά την ανάγνωση του link που δώσαμε κι εγώ κι ο direct-x. Είναι δηλαδή προφανές μετά την ανάγνωση του link πως κάθε νέα κλήση συνάρτησης αυξάνει το stack-space και κάθε τερματισμός κλήσης το μειώνει.
Προτεινόμενες αναρτήσεις