jtsc21 Δημοσ. 8 Ιανουαρίου 2008 Δημοσ. 8 Ιανουαρίου 2008 γεια σας παιδια! μηπως γνωριζει καποιος,πως γινετε μια συναρτηση στη c να επιστρεφει περισσοτερες απο μια τιμες????:rolleyes:
teo64x Δημοσ. 8 Ιανουαρίου 2008 Δημοσ. 8 Ιανουαρίου 2008 Όρισε ένα struct (έτσι τα λένε; Δε θυμάμαι) και κάνε τη συνάρτηση αυτού του τύπου.
Directx Δημοσ. 8 Ιανουαρίου 2008 Δημοσ. 8 Ιανουαρίου 2008 γεια σας παιδια! μηπως γνωριζει καποιος,πως γινετε μια συναρτηση στη c να επιστρεφει περισσοτερες απο μια τιμες????:rolleyes: Όπως περίπου τα λέει ο φίλος teo64x (υποθέτω πως θέλεις να επιστρέφεις πολλές τιμές σε μια return εντολή), μόνο που δεν πρόκειται για απλό struct αλλά για typedef struct με το οποίο υποδεικνύεις στον Compiler πως το δηλωθέν struct πρόκειται για νέο Τύπο δεδομένων τον οποίο μπορείς φυσικά να επιστρέψεις με την εντολή return από την συνάρτηση (function) σου (υπάρχουν και άλλοι τρόποι πέραν της return, αλλά αυτός είναι ο ευκολότερος όταν θέλουμε να επιστρέψουμε πολλά δεδομένα από τις συναρτήσεις μας). Ακολουθούν δυο απλά παράδειγμα, το πρώτο αφορά την χρήση μη δυναμικά δεσμευμένου typedef struct (ρουτίνα MyFunction) και το δεύτερο δυναμικά δεσμευμένου typedef struct από το heap (MyFunctionD), γραμμένα σε CodeGear Turbo C++ 2006 σε μορφή ANSI-C. > /*-DIRECTX SIMPLE RETURN TYPEDEF STRUCT---------------------------------------*/ #include <stdio.h> #include <stdlib.h> #ifdef __BORLANDC__ #pragma hdrstop #endif /*---------------------------------------------------------------------------*/ typedef struct { int A,B,C; char szData[100]; }_TValues; _TValues MyFunction(int A,int B,int C) { /* Non Dynamic _TValues */ _TValues Values; Values.A = A; Values.B = B; Values.C = C; sprintf(Values.szData,"%d",Values.A+Values.B+Values.C); return Values; } _TValues* MyFunctionD(int A,int B,int C) { /* Dynamic _TValues */ _TValues *Values = (_TValues*)calloc(1,sizeof(_TValues)); Values->A=A; Values->B=B; Values->C=C; sprintf(Values->szData,"%d",Values->A+Values->B+Values->C); return Values; } #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { _TValues ourVal = MyFunction(1,2,3), *ptrVal = MyFunctionD(4,5,6); printf("A=%d\nB=%d\nC=%d\n=%s\n --- \n",ourVal.A,ourVal.B,ourVal.C,ourVal.szData); printf("A=%d\nB=%d\nC=%d\n=%s\n",ptrVal->A,ptrVal->B,ptrVal->C,ptrVal->szData); free(ptrVal); getchar(); return 0; } /*---------------------------------------------------------------------------*/ Καλή συνέχεια.
RubiksCube Δημοσ. 8 Ιανουαρίου 2008 Δημοσ. 8 Ιανουαρίου 2008 Ο πιο απλός και πιο δημοφιλής τρόπος δεν είναι ούτε με struct ούτε με typedef. Απλά πρέπει να χρησιμοποιήσεις δείκτες. Αν δεν ξέρεις τι είναι οι δείκτες καλό θα ήταν να το διαβάσεις αφού χρησιμοποιούνται συνέχεια στην C. Ακολουθεί ένα απλό παράδειγμα μιας συνάρτησης που επιστρέφει 2 μεταβλητές. Αυτό που κάνει είναι να ανταλάσσει τις τιμές 2 μεταβλητων void enalagi(int *proti,int *defteri) { int prosorini; prosorini=*proti; *proti=*defteri; *defteri=prosorini; } για να καλέσεις την συνάρτηση γράφεις enalagi(&a,& //se periptosi pou den fainetai &= πατάς shift+7 δηλαδή αν έχεις πριν την εκτέλεση της συνάρτησης a=10, b=20 μετά θα έχεις a=20, b=10. Με τον ίδιο τρόπο επιστρέφεις όσες μεταβλητές θέλεις. Ελπίζω να σε κάλυψα
jtsc21 Δημοσ. 8 Ιανουαρίου 2008 Μέλος Δημοσ. 8 Ιανουαρίου 2008 σας ευχαριστω πολυ παιδια! βλεπετε τωρα αρχιζω και μαθαινω να προγραμματιζω...
Directx Δημοσ. 9 Ιανουαρίου 2008 Δημοσ. 9 Ιανουαρίου 2008 Ο πιο απλός και πιο δημοφιλής τρόπος δεν είναι ούτε με struct ούτε με typedef. Απλά πρέπει να χρησιμοποιήσεις δείκτες. Αν δεν ξέρεις τι είναι οι δείκτες καλό θα ήταν να το διαβάσεις αφού χρησιμοποιούνται συνέχεια στην C. Ακολουθεί ένα απλό παράδειγμα μιας συνάρτησης που επιστρέφει 2 μεταβλητές. Αυτό που κάνει είναι να ανταλάσσει τις τιμές 2 μεταβλητων void enalagi(int *proti,int *defteri) { int prosorini; prosorini=*proti; *proti=*defteri; *defteri=prosorini; } για να καλέσεις την συνάρτηση γράφεις enalagi(&a,& //se periptosi pou den fainetai &= πατάς shift+7 δηλαδή αν έχεις πριν την εκτέλεση της συνάρτησης a=10, b=20 μετά θα έχεις a=20, b=10. Με τον ίδιο τρόπο επιστρέφεις όσες μεταβλητές θέλεις. Ελπίζω να σε κάλυψα Ποίο εύκολος μπορεί να είναι (σε λίγα ορισμάτα), πιο εύχρηστος και κομψός τρόπος όταν έχεις να περάσεις αλλά και να επιστρέψεις πολλαπλές μεταβλητές (όπως ήδη εξήγησα και στο προηγούμενο μήνυμα μου) δεν είναι, ειδικά όταν πρόκειται για μεγάλα και πολύπλοκα projects, εκεί δεν συμφέρει να δημιουργήσεις μια ρουτίνα «τέρας» που επιστρέφει άκομψα και ατσούμπλα, για παράδειγμα 10 pointers, στον καλούντα κώδικα, οπότε εκεί συμφέρει να τους πακετάρεις όλους σε μια κομψή typedef struct καθώς μπορείς να την διαχειρισθείς πολύ ευκολότερα (προσθέτοντας ή αφαιρώντας members για παράδειγμα) από ότι το υποτιθέμενο declaration μιας τέτοιες function -ειδικά όταν αυτή καλείται από πολλαπλά σημεία του υπό κατασκευή κώδικα. Φυσικά όταν πρόκειται για λίγα ορίσματα σαφώς η δήλωση τους ως ανεξάρτητων pointers συμφέρει
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.