vraxoulis Δημοσ. 17 Ιανουαρίου 2010 Δημοσ. 17 Ιανουαρίου 2010 γενικα καθε συναρτηση επιστρεφει μια μονο τιμη.Αν θελουμε μια συναρτηση να αλλαζει τιμη σε περισσοτερες απο μια μεταβλητες της καλουσας συναρτησης(πχ κυριου προγραμματος) πως μπορουμε να το επιτυχουμε αυτο??
C6WGMN Δημοσ. 17 Ιανουαρίου 2010 Δημοσ. 17 Ιανουαρίου 2010 α) με struct β) με δείκτες Το πρώτο είναι υποπερίπτωση του δευτερου. Γενικά μπορείς με δείκτες η global state.
bxenos Δημοσ. 17 Ιανουαρίου 2010 Δημοσ. 17 Ιανουαρίου 2010 ...Το πρώτο είναι υποπερίπτωση του δευτερου.... όχι > struct x { int a; int b; char c[65]; }; struct x foo(void){ struct x q; q.a = (q.b = 3) + 1; q.c[0] = '\0'; return q; }
C6WGMN Δημοσ. 17 Ιανουαρίου 2010 Δημοσ. 17 Ιανουαρίου 2010 όχι > struct x { int a; int b; char c[65]; }; struct x foo(void){ struct x q; q.a = (q.b = 3) + 1; q.c[0] = '\0'; return q; } Κι όμως Η ερώτηση στην οποια εγώ απάντησα ρωτούσε: γενικα καθε συναρτηση επιστρεφει μια μονο τιμη. Αν θελουμε μια συναρτηση να αλλαζει τιμη σε περισσοτερες απο μια μεταβλητες της καλουσας συναρτησης(πχ κυριου προγραμματος) πως μπορουμε να το επιτυχουμε αυτο?? Η συνάρτηση που έγραψες, struct x foo(void), γυρνάει μια τιμή (aggregate μεν, αλλα δεν παύει νά'ναι μια). Επίσης το q βγαίνει έξω από το λεξικό πεδίο στο οποιο ανήκει, οποτε απλός καλώντας την συνάρτηση αυτή θα έχεις μια απροσδιοριστία στο πρόγραμμα σου. Αλλα και αν υποθέσουμε ότι γραφεις σωστά το πρόγραμμα (και απαντήσεις στην ερώτηση του αρχικού poster), πάλι με χρήση pointer θα είναι. Υπάρχουν δυο τρόποι για επιστροφή πολλαπλών τιμών. Ο πρώτος είναι η γλώσσα να προτιμήσει μεγαλύτερο api από semantics, δηλαδή οι συναρτήσεις να επιστρέφουν μια λίστα της οποιας τα μέλη δίνουν την τιμή σε λεξικές μεταβλητές (destructuring bind των tuples, όπως πχ η python), είτε με κάποιον άλλο μηχανισμό που επιτρέπει πολλαπλές τιμές (όπως VALUES σε lisp).
Evgenios1 Δημοσ. 18 Ιανουαρίου 2010 Δημοσ. 18 Ιανουαρίου 2010 Κυριολεκτικα στη C δεν μπορεις να επιστρεψεις πανω απο μια τιμη. Ειτε το κανεις με struct ειτε με δεικτη, η επιστροφη ειναι μια. Οσο για το "by ref" δεν υπαρχει καμια επιστροφη.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.