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

ερωτηση σε C


vraxoulis

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

Δημοσ.

γενικα καθε συναρτηση επιστρεφει μια μονο τιμη.Αν θελουμε μια συναρτηση να αλλαζει τιμη σε περισσοτερες απο μια μεταβλητες της καλουσας συναρτησης(πχ κυριου προγραμματος) πως μπορουμε να το επιτυχουμε αυτο??

Δημοσ.
...Το πρώτο είναι υποπερίπτωση του δευτερου....

 

όχι

 

 

>
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 {
  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).

 

 

Δημοσ.

Κυριολεκτικα στη C δεν μπορεις να επιστρεψεις πανω απο μια τιμη. Ειτε το κανεις με struct ειτε με δεικτη, η επιστροφη ειναι μια. Οσο για το "by ref" δεν υπαρχει καμια επιστροφη.

Αρχειοθετημένο

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

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