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

μια βοηθεια στη c...


jtsc21

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

Δημοσ.

γεια σας παιδια!

 

 

μηπως γνωριζει καποιος,πως γινετε μια συναρτηση στη c να επιστρεφει περισσοτερες απο μια τιμες????:rolleyes::rolleyes::rolleyes:

Δημοσ.
γεια σας παιδια!

 

 

μηπως γνωριζει καποιος,πως γινετε μια συναρτηση στη c να επιστρεφει περισσοτερες απο μια τιμες????:rolleyes::rolleyes::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;
}
/*---------------------------------------------------------------------------*/

 

Καλή συνέχεια.

Δημοσ.

Ο πιο απλός και πιο δημοφιλής τρόπος δεν είναι ούτε με struct ούτε με typedef. Απλά πρέπει να χρησιμοποιήσεις δείκτες. Αν δεν ξέρεις τι είναι οι δείκτες καλό θα ήταν να το διαβάσεις αφού χρησιμοποιούνται συνέχεια στην C.

Ακολουθεί ένα απλό παράδειγμα μιας συνάρτησης που επιστρέφει 2 μεταβλητές. Αυτό που κάνει είναι να ανταλάσσει τις τιμές 2 μεταβλητων

 

void enalagi(int *proti,int *defteri)

{

int prosorini;

prosorini=*proti;

*proti=*defteri;

*defteri=prosorini;

}

 

για να καλέσεις την συνάρτηση γράφεις enalagi(&a,&B)

//se periptosi pou den fainetai &= πατάς shift+7

δηλαδή αν έχεις πριν την εκτέλεση της συνάρτησης a=10, b=20

μετά θα έχεις a=20, b=10. Με τον ίδιο τρόπο επιστρέφεις όσες μεταβλητές θέλεις.

Ελπίζω να σε κάλυψα

Δημοσ.
Ο πιο απλός και πιο δημοφιλής τρόπος δεν είναι ούτε με struct ούτε με typedef. Απλά πρέπει να χρησιμοποιήσεις δείκτες. Αν δεν ξέρεις τι είναι οι δείκτες καλό θα ήταν να το διαβάσεις αφού χρησιμοποιούνται συνέχεια στην C.

Ακολουθεί ένα απλό παράδειγμα μιας συνάρτησης που επιστρέφει 2 μεταβλητές. Αυτό που κάνει είναι να ανταλάσσει τις τιμές 2 μεταβλητων

 

void enalagi(int *proti,int *defteri)

{

int prosorini;

prosorini=*proti;

*proti=*defteri;

*defteri=prosorini;

}

 

για να καλέσεις την συνάρτηση γράφεις enalagi(&a,&B)

//se periptosi pou den fainetai &= πατάς shift+7

δηλαδή αν έχεις πριν την εκτέλεση της συνάρτησης a=10, b=20

μετά θα έχεις a=20, b=10. Με τον ίδιο τρόπο επιστρέφεις όσες μεταβλητές θέλεις.

Ελπίζω να σε κάλυψα

 

Ποίο εύκολος μπορεί να είναι (σε λίγα ορισμάτα), πιο εύχρηστος και κομψός τρόπος όταν έχεις να περάσεις αλλά και να επιστρέψεις πολλαπλές μεταβλητές (όπως ήδη εξήγησα και στο προηγούμενο μήνυμα μου) δεν είναι, ειδικά όταν πρόκειται για μεγάλα και πολύπλοκα projects, εκεί δεν συμφέρει να δημιουργήσεις μια ρουτίνα «τέρας» που επιστρέφει άκομψα και ατσούμπλα, για παράδειγμα 10 pointers, στον καλούντα κώδικα, οπότε εκεί συμφέρει να τους πακετάρεις όλους σε μια κομψή typedef struct καθώς μπορείς να την διαχειρισθείς πολύ ευκολότερα (προσθέτοντας ή αφαιρώντας members για παράδειγμα) από ότι το υποτιθέμενο declaration μιας τέτοιες function -ειδικά όταν αυτή καλείται από πολλαπλά σημεία του υπό κατασκευή κώδικα.

 

Φυσικά όταν πρόκειται για λίγα ορίσματα σαφώς η δήλωση τους ως ανεξάρτητων pointers συμφέρει :-)

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

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

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