Jump to content



# returned variables-C++


theoamd

Recommended Posts

Καλησπέρα.Είναι δυνατόν μέσω μιας συνάρτησης να επιστρέψω δύο τιμές στη main κι αν ναι πως?(δεν δουλεύουν τα 2 συνεχόμενα return μου) :hmm:

Link to comment
Share on other sites

Mε μπερδεύουν λίγο οι αναφορές.

Σε περίπτωση που θέλω μέσω πίνακα, στη συνάρτηση τι θα επιστρέψω?επιστρέφοντας το μεγαλύτερο στοιχείο του πίνακα,δεν παίζει

Link to comment
Share on other sites


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

*σλαπ* Με έκανες να ξαναπιάσω C++ μετά από καιρό :S

Compile 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

  • 2 weeks later...

Οι μεταβλητές που έχουν οριστεί, α) 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

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

Εγώ μίλησα για το variable scope κι εσύ για το coding style.

Με το που θα βάλεις threads, οι static μεταβλητές σου ήδη έγιναν ένα ακόμα σημείο για bugs (data races κλπ κλπ).

Αφού πλέον ο κόσμος είναι multicore (και άρα το multithreading είναι κανόνας) γιατί να διδάσκουμε το πώς να δημιουργούμε πιθανά bugs και απλά να μην πάμε σε αυτό που είναι σωστό σε κάθε περίπτωση;

Link to comment
Share on other sites

Σε γενικές γραμμές, συμφωνώ με το 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

Όταν θα αποκτήσει μεγαλύτερη πείρα μπορεί να μάθει τι είναι static μεταβλητές, global κλπ. Τώρα που μαθαίνει, ας μάθει αυτά που προάγουν καλό, bug-free κώδικα.

Και η goto είναι μέρος της γλώσσας, αλλά κανένας δε τη διδάσκει - καιρός είναι και οι static και global variables να βρεθούν σε αυτή την κατηγορία.

Link to comment
Share on other sites

Θα διαφωνήσω ότι οι global και οι static μεταβλητές είναι κακός προγραμματισμός, απεναντίας είναι καλός όταν χρησιμοποιούνται σωστά... ακόμα και το extern που πολλοί εξορκίζουν είναι σωτήριο σε πάρα πολλές περιπτώσεις, κυρίως σε embedded...

Όλα τα εργαλεία που παρέχει η γλώσσα είναι χρήσιμα, όπως και η goto αρκεί να χρησιμοποιούνται έξυπνα...

Για αρχή όμως θα συμφωνήσω πως δεν πρέπει να τα χρησιμοποιεί κάποιος αν δεν ξέρει καλά τι κάνει...

Link to comment
Share on other sites

Προσωπικά χρειάστηκε να χρησιμοποιήσω global / static μεταβλητές σε εξαιρετικά περίπλοκες περιπτώσεις (πχ για memory management schemes, error reporting κλπ) και ποτέ σε απλούς κώδικες όταν μόλις είχα αρχίσει με τη γλώσσα. Το 99% των περιπτώσεων που χρησιμοποιούν global μεταβλητές ή static είναι κατάχρηση, όχι χρήση.

Και για την ιστορία, κάθε φορά που χρησιμοποιείς static ή global μεταβλητές, αναγκάζεις τον compiler να εγκαταλείψει αρκετά τρικ για optimization.

Link to comment
Share on other sites

Αυτό που θέλω να πω είναι ότι δεν υπάρχει κανένα (μα κανένα) πλεονέκτημα για global/static μεταβλητές στους σύγχρονους compilers όταν υπάρχουν εναλλακτικές, ακόμα και αν ο προγραμματιστής αναγκαστεί να σκεφτεί πιο έξυπνα - κάτι που δεν είναι καθόλου κακό.

Σε όλα τα μεγάλα projects που έχω δουλέψει, μεγάλο μέρος των bugs είναι επειδή 1) κάποιος είχε μια global μεταβλητή και την έκανε άθελά του shadow με local και 2) static μεταβλητές που κρατούσαν state. Εξ ου και η αγανάκτησή μου προς αυτά τα δύο.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.