theoamd Δημοσιεύτηκε Ιούλιος 27, 2012 #1 Κοινοποίηση Δημοσιεύτηκε Ιούλιος 27, 2012 Καλησπέρα.Είναι δυνατόν μέσω μιας συνάρτησης να επιστρέψω δύο τιμές στη main κι αν ναι πως?(δεν δουλεύουν τα 2 συνεχόμενα return μου) Link to comment Share on other sites More sharing options...
ganastasiou Ιούλιος 27, 2012 #2 Κοινοποίηση Ιούλιος 27, 2012 Αν δεν κάνω λάθος η C/C++ δεν επιστρέφει παραπάνω απο μία τιμές,αλλά μπορείς να το κάνεις με Pass by reference(πέρασμα με αναφορά).7.3 — Passing arguments by reference « Learn C++ Link to comment Share on other sites More sharing options...
nucleus Ιούλιος 27, 2012 #3 Κοινοποίηση Ιούλιος 27, 2012 Εύκολο το βάζεις να επιστρέφει πίνακα και βάζεις εκεί τις τιμές που θες Link to comment Share on other sites More sharing options...
theoamd Ιούλιος 27, 2012 Author #4 Κοινοποίηση Ιούλιος 27, 2012 Mε μπερδεύουν λίγο οι αναφορές.Σε περίπτωση που θέλω μέσω πίνακα, στη συνάρτηση τι θα επιστρέψω?επιστρέφοντας το μεγαλύτερο στοιχείο του πίνακα,δεν παίζει Link to comment Share on other sites More sharing options...
ganastasiou Ιούλιος 27, 2012 #5 Κοινοποίηση Ιούλιος 27, 2012 return arrayName; Link to comment Share on other sites More sharing options...
theoamd Ιούλιος 27, 2012 Author #6 Κοινοποίηση Ιούλιος 27, 2012 return arrayName;ούτε το return arrayName, αλλά ούτε και το return *arrayName δουλεύουν Link to comment Share on other sites More sharing options...
ganastasiou Ιούλιος 27, 2012 #7 Κοινοποίηση Ιούλιος 27, 2012 Δείξε τον κώδικα καλύτερα. Link to comment Share on other sites More sharing options...
theoamd Ιούλιος 27, 2012 Author #8 Κοινοποίηση Ιούλιος 27, 2012 int ep(int v,int a,int b,int u){ int epist[2]; int emvado = v*u/2; epist[0]=emvado; int per = v+a+b; epist[1]=per; return *epist;}int main(void){int z,x,c,v,perm,per,emvadon,epist[2]; cout<<"Dwse plevres trigwnou kai epeita upsos"<<endl; cin>>z>>x>>c>>v; cout<<"Trigwno me plevres "<<z<<x<<c<<" kai upsos "<<v<<" exei emvado"<<epist[0]<<" kai perimetro"<<epist[1]<<endl; system("PAUSE"); return EXIT_SUCCESS;} Link to comment Share on other sites More sharing options...
nucleus Ιούλιος 27, 2012 #9 Κοινοποίηση Ιούλιος 27, 2012 *σλαπ* Με έκανες να ξαναπιάσω C++ μετά από καιρό :SCompile ME!!! (VS2003 .NET 1.1)#include <stdio.h>int *iReturnAnArrayOfValuesFunction(){ int returnValues[2] = {1,2}; return returnValues;}int _tmain(int argc, _TCHAR* argv[]){ int *output = iReturnAnArrayOfValuesFunction(); printf("first=%d,second=%d",output[0],output[1]); return 0;}#include "stdafx.h"EDIT:Τα λάθη στον κώδικα σου που παρέθεσες αφήνονται σαν άσκηση προς τον αναγνώστη Link to comment Share on other sites More sharing options...
inetus3r Αύγουστος 6, 2012 #10 Κοινοποίηση Αύγουστος 6, 2012 Οι μεταβλητές που έχουν οριστεί, α) int epist[2] και β) int returnValues[2] = {1,2},έχουν local scope, δηλαδή "φαίνονται" μόνο από την συνάρτηση στην οποία έχουν οριστεί.Ο κώδικας στο post #8 πρέπει να γίνει:int epist[2];int ep(int v,int a,int b,int u){...}EDIT: δεν χρειάζεται καν να γυρνάει κάποια τιμή (εκτός από success/failure) γιατί η μεταβλητή είναι πλέον προσβάσιμη !int main(void) {...}έτσι ώστε η μεταβλητή int epist[2] να προσβάσιμη από παντού στο αρχείο που είναι ορισμένη.Ο κώδικας στο post #9 πρέπει να γίνει:int *iReturnAnArrayOfValuesFunction(){static int returnValues[2] = {1,2};return returnValues;}γιατί χωρίς το static, ο compiler επιστρέφει το παρακάτω μήνυμα:"warning C4172: returning address of local variable or temporary".Με άλλα λόγια, είναι στην ευχέρεια του compiler πως θα χειριστεί την επιστροφή μεταβλητής που έχει οριστεί στο stack.EDIT: Δεν χρειάζεται πλέον το return returnValues; αφού η μεταβλητή είναι πλέον static ! Link to comment Share on other sites More sharing options...
dop Αύγουστος 6, 2012 #11 Κοινοποίηση Αύγουστος 6, 2012 1) ΠΟΤΕ global μεταβλητές. Φτου κακά, κακό στυλ.2) ΠΟΤΕ επιστροφή references/pointers σε local μεταβλητές. Είναι ΛΑΘΟΣ.-3) static μεταβλητές ΜΟΝΟΝ όταν ξέρεις τι κάνεις. Και αυτό πολύ καλά. Και εξάντλησες όλες τις άλλες πιθανότητες.#include <iostream>#include <utility>std::pair<int,int> ep(int v, int a, int b, int u){ const int e = v*u/2; const int p = v + a + b; return std::make_pair(e,p);}int main(void){ using std::cout; using std::cin; using std::endl; cout << "Dwse plevres trigwnou kai epeita upsos" << endl; int z,x,c,v; cin >> z >> x >> c >> v; std::pair<int,int> r = ep(z, x, c, v); cout << "Trigwno me plevres " << z << ' ' << x << ' ' << c << " kai upsos " << v << " exei emvado " << r.first << " kai perimetro " << r.second << endl; return 0;} Link to comment Share on other sites More sharing options...
inetus3r Αύγουστος 7, 2012 #12 Κοινοποίηση Αύγουστος 7, 2012 Εγώ μίλησα για το variable scope κι εσύ για το coding style. Link to comment Share on other sites More sharing options...
dop Αύγουστος 7, 2012 #13 Κοινοποίηση Αύγουστος 7, 2012 Εγώ μίλησα για το variable scope κι εσύ για το coding style.Με το που θα βάλεις threads, οι static μεταβλητές σου ήδη έγιναν ένα ακόμα σημείο για bugs (data races κλπ κλπ).Αφού πλέον ο κόσμος είναι multicore (και άρα το multithreading είναι κανόνας) γιατί να διδάσκουμε το πώς να δημιουργούμε πιθανά bugs και απλά να μην πάμε σε αυτό που είναι σωστό σε κάθε περίπτωση; Link to comment Share on other sites More sharing options...
inetus3r Αύγουστος 7, 2012 #14 Κοινοποίηση Αύγουστος 7, 2012 Σε γενικές γραμμές, συμφωνώ με το coding style που προτείνεις, αλλά:Όμως όταν μεταφέρεις γνώση σε κάποιον, καλό είναι να ξεκινάς από τα βασικά:α) τι είναι η μεταβλητή (variable) - πιστεύω ότι όλοι έχουν μια ιδέαβ) ποια είναι η ορατότητα (scope) της μεταβλητής - εδώ κι αν γίνεται χαμός από παρεξηγήσειςγ) ποιες είναι καλύτερες πρακτικές για την χρήση των μεταβλητών (best practices/recommendations) - αν δεν κάνω λάθος, αναφέρθηκες εδώΠιστεύω ότι το αρχικό post είχε πρόβλημα στην κατανόηση του β) κι εκεί αναφέρθηκα.Με το που θα βάλεις threadsΣυμφωνώ με την χρήση threads, αλλά δεν είναι η πανάκεια για όλα τα προβλήματα.οι static μεταβλητές σου ήδη έγιναν ένα ακόμα σημείο για bugs (data races κλπ κλπ)Υπάρχουν λύσεις και γι' αυτό (thread synchronization).(και άρα το multithreading είναι κανόνας)Ανέφερα και παραπάνω ότι τα threads δεν είναι η λύση για όλα τα προβλήματα.γιατί να διδάσκουμε το πώς να δημιουργούμε πιθανά bugsΗ μέθοδος ονομάζεται "Διδασκαλία δια του παραδείγματος".Δείχνεις σε κάποιον τον τρόπο με τον οποίο μπορεί να κάνει κάτι και ποια είναι τα αποτελέσματα.Προσωπικά, νομίζω ότι είναι καλύτερη μέθοδος από την ΠΟΤΕ-ΜΑΚΡΥΑ-ΜΗ-ΔΕΝ. Link to comment Share on other sites More sharing options...
dop Αύγουστος 7, 2012 #15 Κοινοποίηση Αύγουστος 7, 2012 Όταν θα αποκτήσει μεγαλύτερη πείρα μπορεί να μάθει τι είναι static μεταβλητές, global κλπ. Τώρα που μαθαίνει, ας μάθει αυτά που προάγουν καλό, bug-free κώδικα.Και η goto είναι μέρος της γλώσσας, αλλά κανένας δε τη διδάσκει - καιρός είναι και οι static και global variables να βρεθούν σε αυτή την κατηγορία. Link to comment Share on other sites More sharing options...
inetus3r Αύγουστος 8, 2012 #16 Κοινοποίηση Αύγουστος 8, 2012 IMHOΤώρα που μαθαίνει, ας μάθει αυτά που προάγουν καλό, bug-free κώδικα.Αυτή η αντιμετώπιση είναι καλύτερη. Link to comment Share on other sites More sharing options...
Jaco Αύγουστος 8, 2012 #17 Κοινοποίηση Αύγουστος 8, 2012 Θα διαφωνήσω ότι οι global και οι static μεταβλητές είναι κακός προγραμματισμός, απεναντίας είναι καλός όταν χρησιμοποιούνται σωστά... ακόμα και το extern που πολλοί εξορκίζουν είναι σωτήριο σε πάρα πολλές περιπτώσεις, κυρίως σε embedded...Όλα τα εργαλεία που παρέχει η γλώσσα είναι χρήσιμα, όπως και η goto αρκεί να χρησιμοποιούνται έξυπνα...Για αρχή όμως θα συμφωνήσω πως δεν πρέπει να τα χρησιμοποιεί κάποιος αν δεν ξέρει καλά τι κάνει... Link to comment Share on other sites More sharing options...
dop Αύγουστος 8, 2012 #18 Κοινοποίηση Αύγουστος 8, 2012 Προσωπικά χρειάστηκε να χρησιμοποιήσω global / static μεταβλητές σε εξαιρετικά περίπλοκες περιπτώσεις (πχ για memory management schemes, error reporting κλπ) και ποτέ σε απλούς κώδικες όταν μόλις είχα αρχίσει με τη γλώσσα. Το 99% των περιπτώσεων που χρησιμοποιούν global μεταβλητές ή static είναι κατάχρηση, όχι χρήση.Και για την ιστορία, κάθε φορά που χρησιμοποιείς static ή global μεταβλητές, αναγκάζεις τον compiler να εγκαταλείψει αρκετά τρικ για optimization. Link to comment Share on other sites More sharing options...
inetus3r Αύγουστος 9, 2012 #19 Κοινοποίηση Αύγουστος 9, 2012 Τώρα ανοίγεις ένα άλλο μεγάλο κεφάλαιο: το compiler optimization. Link to comment Share on other sites More sharing options...
dop Αύγουστος 9, 2012 #20 Κοινοποίηση Αύγουστος 9, 2012 Αυτό που θέλω να πω είναι ότι δεν υπάρχει κανένα (μα κανένα) πλεονέκτημα για global/static μεταβλητές στους σύγχρονους compilers όταν υπάρχουν εναλλακτικές, ακόμα και αν ο προγραμματιστής αναγκαστεί να σκεφτεί πιο έξυπνα - κάτι που δεν είναι καθόλου κακό.Σε όλα τα μεγάλα projects που έχω δουλέψει, μεγάλο μέρος των bugs είναι επειδή 1) κάποιος είχε μια global μεταβλητή και την έκανε άθελά του shadow με local και 2) static μεταβλητές που κρατούσαν state. Εξ ου και η αγανάκτησή μου προς αυτά τα δύο. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.