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

Με ποια γλώσσα προγραμματισμού να συνεχίσω...


rafail1994

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

Δημοσ.

Το καλό που του θέλω να γράψει template<typename T> swap(T **x, T**y) γιατί αλλιώς τον έχω απολύσει ήδη εγώ :P

 

:lol: :lol: :lol: Ωραίος!

 

Καλό & χρήσιμο είναι πάντως να το ξέρει πρώτα σε C (το "πίσω από την κουρτίνα" δηλαδή) και ας μη το χρησιμοποιήσει ποτέ του έτσι.

  • Απαντ. 47
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Τα γοσταρω κατι τετια rolleyes.gif

παρε να εχεις (τουλαχιστον εγω το εγραψα)

>#ifdef _MSC_VER
int main(float axAytaTaISO,float**)
#else
int main(int axAytaTaISO,char**)
#endif
{
#if _HAS_CPP0X
bool s = [&](void* (*(*(*FtiakseKatiDikosou)(static void(*)(const int(*)(...))))))-> bool
{
	return
#endif
			printf("%s\n",((int) (((void**)((&axAytaTaISO) + 1))[0])) + 8);
#if _HAS_CPP0X
}(0);
#endif
return 0;
}

 

Δημοσ.

Εν τω μεταξύ περιττό να σου πω πως σκάλωσα κι εγώ με το δείγμα ε; Στην 1η ανάγνωση το ερμήνευα πίνακα 3 συναρτήσεων, αλλά τελικά βλέπω πως έχει ένα έξτρα αστέρι μπροστά :P

 

@παπι: αν είναι να αρχίσουμε τέτοια, θα μας... διώξουν από το φόρουμ (γιατί από δουλειές θα μας έχουν διώξει σίγουρα :lol:)

 

Άσχετο με pointers, αλλά σχετικό με swap...

>
#define swap(x,y) do \ 
  { unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \
    memcpy(swap_temp,&y,sizeof(x)); \
    memcpy(&y,&x,       sizeof(x)); \
    memcpy(&x,swap_temp,sizeof(x)); \
   } while(0)

Δημοσ.

Εν τω μεταξύ περιττό να σου πω πως σκάλωσα κι εγώ με το δείγμα ε; Στην 1η ανάγνωση το ερμήνευα πίνακα 3 συναρτήσεων, αλλά τελικά βλέπω πως έχει ένα έξτρα αστέρι μπροστά :P

 

@παπι: αν είναι να αρχίσουμε τέτοια, θα μας... διώξουν από το φόρουμ (γιατί από δουλειές θα μας έχουν διώξει σίγουρα :lol:)

 

Άσχετο με pointers, αλλά σχετικό με swap...

>
#define swap(x,y) do \ 
  { unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \
	memcpy(swap_temp,&y,sizeof(x)); \
	memcpy(&y,&x,   	sizeof(x)); \
	memcpy(&x,swap_temp,sizeof(x)); \
   } while(0)

 

Απλα μου τη σπαει αυτη η συμπεριφορα.

ΥΓ: Και γουσταρω καργα να τους τη λεω grin.png

Δημοσ.

Απλα μου τη σπαει αυτη η συμπεριφορα.

ΥΓ: Και γουσταρω καργα να τους τη λεω grin.png

Για ποια συμπεριφορά λες; (δεν το 'πιασα το... υπονοούμενο :lol:)

Δημοσ.

Άσχετο με pointers, αλλά σχετικό με swap...

>
#define swap(x,y) do \ 

 

Φτου φτου φτου macro μακριά από μας.

 

Γιατί να κάνεις κάτι τέτοιο; Όπως κλασικά συμβαίνει πάντα με τις macros, αν το x ή το y δεν είναι lvalue την έκατσες.

Δημοσ.

Φτου φτου φτου macro μακριά από μας.

 

Γιατί να κάνεις κάτι τέτοιο; Όπως κλασικά συμβαίνει πάντα με τις macros, αν το x ή το y δεν είναι lvalue την έκατσες.

Το ίδιο πράγμα λέμε, πως είναι αχρείαστη επίδειξη γνώσεων, με ελάχιστη έως μηδενική πρακτική εφαρμογή επειδή παραβιάζει βάναυσα την αρχή του ευανάγνωστου και ευκολοσυντήρητου κώδικα.

 

Όπως ακριβώς το αρχικό σου παράδειγμα δλδ ή το παράδειγμα που έδωσε ο παπι.

 

ΥΓ. Θεωρητικά μπορείς να το χρησιμοποιήσεις για να κάνεις swap οτιδήποτε, χωρίς να ενδιαφέρεσαι για το data type των x και y (που προφανώς πρέπει να είναι ίδιο και για τα δυο) στην C που δεν υποστηρίζει templates. Πρακτικά όμως, πέραν του δυσνόητου του κώδικα και πέραν των εγγενών μειονεκτημάτων των macros, το συγκεκριμένο έχει και την κακή... συνήθεια (:lol:) πως αν κατά λάθος του περάσεις 2 lvalues μεν διαφορετικών τύπων δε (π.χ. έναν int κι ένα char) τότε θα αποτύχει ΣΙΩΠΗΛΑ σε επίπεδο compiler κι άντε μετά εσύ βρες που υπάρχει το λάθος :lol:

Δημοσ.

Το ίδιο πράγμα λέμε, πως είναι αχρείαστη επίδειξη γνώσεων, με ελάχιστη έως μηδενική πρακτική εφαρμογή επειδή παραβιάζει βάναυσα την αρχή του ευανάγνωστου και ευκολοσυντήρητου κώδικα.

 

Όπως ακριβώς το αρχικό σου παράδειγμα δλδ ή το παράδειγμα που έδωσε ο παπι.

 

ΥΓ. Θεωρητικά μπορείς να το χρησιμοποιήσεις για να κάνεις swap οτιδήποτε, χωρίς να ενδιαφέρεσαι για το data type των x και y (που προφανώς πρέπει να είναι ίδιο και για τα δυο) στην C που δεν υποστηρίζει templates. Πρακτικά όμως, πέραν του δυσνόητου του κώδικα και πέραν των εγγενών μειονεκτημάτων των macros, το συγκεκριμένο έχει και την κακή... συνήθεια (:lol:) πως αν κατά λάθος του περάσεις 2 lvalues μεν διαφορετικών τύπων δε (π.χ. έναν int κι ένα char) τότε θα αποτύχει ΣΙΩΠΗΛΑ σε επίπεδο compiler κι άντε μετά εσύ βρες που υπάρχει το λάθος :lol:

 

Δε νομίζω ότι είναι το ίδιο γιατί αυτό το macro βάζω το χέρι μου στη φωτιά ότι κάποιος κάπου το χρησιμοποιεί. Ακόμα και στη C, θεωρώ έγκλημα να γραφτεί αυτός ο κώδικας σε macro αντί για function.

 

Fail σιωπηλά; Αν το κάνεις αυτό θα παραπονεθεί για τον πίνακα μεγέθους -1, αυτή είναι ακριβώς η ιδέα του ?: στην πρώτη γραμμή... :huh:

 

Και τέλος, το αρχικό μου παράδειγμα νομίζω το παρεξηγήσατε πολύ. :D

 

Πρώτον, το έκανα copy paste από το cdecl.org (αν δεν το ξέρεις αξίζει, δέστο) και δεν έκατσα να βγάλω επίτηδες σατανικά πράγματα για να σας βασανίσω ή για να πουλήσω τρέλα.

 

Δεύτερον, το παράδειγμά μου ορίζει pointer σε μια function(void) που επιστρέφει pointer σε int[3]. Σκεφτείτε το λίγο. Αν μιλάμε για C, τότε δεν υπάρχει τίποτα περίεργο ή ασυνήθιστο στο παράδειγμα πέρα από το ότι ο επιστρεφόμενος pointer δείχνει σε int[3] ενώ θα μπορούσε να δείχνει σε ο,τιδήποτε άλλο (π.χ. κάποιο struct threesome). Το γεγονός ότι δηλώνεις pointer type για το συγκεκριμένο function signature είναι κλασική τεχνική C για δυναμική επιλογή της function που θα εκτελεστεί κατά περίπτωση.

Δημοσ.

Δε νομίζω ότι είναι το ίδιο γιατί αυτό το macro βάζω το χέρι μου στη φωτιά ότι κάποιος κάπου το χρησιμοποιεί. Ακόμα και στη C, θεωρώ έγκλημα να γραφτεί αυτός ο κώδικας σε macro αντί για function.

Δεν μπορεί να γραφτεί σε αυτόνομη function στην C γιατί τα functions είναι εξαρτημένα από τα data types των ορισμάτων τους. Μπορεί να βελτιωθεί ως προς το να πιάνει ο compiler εσφαλμένα ορίσματα, χρησιμοποιώντας ένα συνδυασμό function (inline για ταχύτερη εκτέλεση) και macro, κάπως έτσι:

>
inline void swap_detail(void* p1, void* p2, void* tmp, size_t pSize)
{
  memcpy(tmp, p1, pSize);
  memcpy(p1, p2, pSize);
  memcpy(p2 , tmp, pSize);
}
#define SWAP(a,  swap_detail(&(a), &(, (char[(sizeof(a) == sizeof() ? (ptrdiff_t)sizeof(a) : -1]){0}, sizeof(a))

 

Fail σιωπηλά; Αν το κάνεις αυτό θα παραπονεθεί για τον πίνακα μεγέθους -1, αυτή είναι ακριβώς η ιδέα του ?: στην πρώτη γραμμή... :huh:

Ακριβώς αυτό θα κάνει fail σιωπηλά σε ότι αφορά τον compiler. Αλλά το -1 θα μπει μόνο αν τα x και y καταναλώνουν διαφορετικού μεγέθους χώρο στη μνήμη (που συνήθως σημαίνει πως είναι διαφορετικού τύπου, αλλά όχι πάντα).

 

Και τέλος, το αρχικό μου παράδειγμα νομίζω το παρεξηγήσατε πολύ. :D

 

Πρώτον, το έκανα copy paste από το cdecl.org (αν δεν το ξέρεις αξίζει, δέστο) και δεν έκατσα να βγάλω επίτηδες σατανικά πράγματα για να σας βασανίσω ή για να πουλήσω τρέλα.

 

Δεύτερον, το παράδειγμά μου ορίζει pointer σε μια function(void) που επιστρέφει pointer σε int[3]. Σκεφτείτε το λίγο. Αν μιλάμε για C, τότε δεν υπάρχει τίποτα περίεργο ή ασυνήθιστο στο παράδειγμα πέρα από το ότι ο επιστρεφόμενος pointer δείχνει σε int[3] ενώ θα μπορούσε να δείχνει σε ο,τιδήποτε άλλο (π.χ. κάποιο struct threesome). Το γεγονός ότι δηλώνεις pointer type για το συγκεκριμένο function signature είναι κλασική τεχνική C για δυναμική επιλογή της function που θα εκτελεστεί κατά περίπτωση.

Η τεχνική κλασική είναι στη C, το συγκεκριμένο παράδειγμα δεν είναι κλασικό. Αυτό εννοώ.

Δημοσ.

Ακριβώς αυτό θα κάνει fail σιωπηλά σε ότι αφορά τον compiler. Αλλά το -1 θα μπει μόνο αν τα x και y καταναλώνουν διαφορετικού μεγέθους χώρο στη μνήμη (που συνήθως σημαίνει πως είναι διαφορετικού τύπου, αλλά όχι πάντα).

 

True, απλά πήρα το συγκεκριμένο παράδειγμα που έδωσες (int και char). :)

 

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

Δημοσ.

True, απλά πήρα το συγκεκριμένο παράδειγμα που έδωσες (int και char). :)

 

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

Κατά κανόνα δεν έχουν κάποια σχέση (θεωρητικά τα char καταναλώνουν 1 byte ενώ οι int 2) αλλά στην πράξη είναι implementation dependent. Για αυτό και τα έφερα σαν παραδείγματα αποτυχίας του παραπάνω macro.

Δημοσ.

Κατά κανόνα δεν έχουν κάποια σχέση (θεωρητικά τα char καταναλώνουν 1 byte ενώ οι int 2) αλλά στην πράξη είναι implementation dependent. Για αυτό και τα έφερα σαν παραδείγματα αποτυχίας του παραπάνω macro.

 

Ανάποδα τα είπες ρε συ :P

 

Θεωρητικά sizeof(char) == 1 (το μόνο που εγγυάται το standard) και sizeof(int) == implementation dependent.

 

Πρακτικά είναι 1 και 4.

Δημοσ.

Γιατί το είπα ανάποδα βρε συ, char 1 byte δεν έγραψα; Εκτός αν εννοείς πως δεν έκανα σαφές στην διατύπωσή μου πως implementation dependent είναι οι int (που όντως ισχύει τώρα που.. με ξαναδιαβάζω :lol:).

 

Btw, σε όλους τους compilers οι int είναι guaranteed τουλάχιστον 2 bytes ;)

Δημοσ.

Γιατί το είπα ανάποδα βρε συ, char 1 byte δεν έγραψα; Εκτός αν εννοείς πως δεν έκανα σαφές στην διατύπωσή μου πως implementation dependent είναι οι int (που όντως ισχύει τώρα που.. με ξαναδιαβάζω :lol:).

 

Btw, σε όλους τους compilers οι int είναι guaranteed τουλάχιστον 2 bytes ;)

 

Ανάποδα όσον αφορά το πρακτικά/θεωρητικά εννοώ. :-)

 

Αυτό που λες για τα 2 bytes είναι "λάθος" (βασικά άνευ νοήματος ίσως πιο σωστή έκφραση). Αν μιλάμε για την ANSI C, το μέγεθος του int είναι τελείως ακαθόριστο. Το γεγονός ότι όλοι οι compiler του κόσμου μπορεί να έχουν τον int Χ bytes δε σημαίνει απολύτως τίποτα σε θεωρητικό επίπεδο γιατί δεν είναι δική τους δουλειά να δίνουν guarantees.

 

Ας πούμε, π.χ. στο MSDN υπάρχει πίνακας με τα ακριβή μεγέθη όλων των types για την VC++2010. Ακριβώς στην ίδια σελίδα όμως (πολύ σωστά) λέει (έμφαση δική μου):

 

The int and unsigned int types have the size of the system word: four bytes. However, portable code should not depend on the size of int.

 

Microsoft C/C++ also features support for sized integer types. See __int8, __int16, __int32, __int64 for more information.

 

Τα sized integer types που λέει είναι μεν guaranteed, αλλά είναι extension και όχι standard.

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

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

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