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

Erevis

Members
  • ΜΗΝΥΜΑΤΑ FORUM

    117
  • ΜΕΛΟΣ

  • ΤΕΛ. ΕΠΙΣΚΕΨΗ

Σχετικά με Erevis

  • Ημερομηνία γέννησης 25/09/1990

Πληροφορίες προφίλ

  • Φύλο
    Άνδρας

Erevis's Achievements

Proficient

Proficient (10/15)

  • Πρώτο Μήνυμα
  • Collaborator
  • 1 Εβδομάδα Μετά
  • Ένα Μήνα Μετά
  • 1 χρόνο Insomniac

Πρόσφατες Διακρίσεις

31

Φήμη

  1. 1) Με κανένα σκεπτικό. Τεράστια κουβέντα. 2) Γιατί? Τόσο ευάλωτο είναι το εγώ σου? Ο καθένας μπορεί να πει ό,τι θέλει και θα τον κρίνει η κοινωνία. Εσύ που έχεις χαρτί νομίζεις ότι είσαι οτιδήποτε από αυτά? Κανένα χαρτί δε σε κάνει προγραμματιστή κοκ. Η ελεύθερη αγορά που θα σου δώσει χρήματα για να κάνεις αυτή τη δουλειά σε κάνει.
  2. Όντως, τυχεροί όσοι δουλεύουν IT στην Ελλάδα που δεν έχουν ένα μάτσο άσχετους γραφειοκράτες να ορίζουν τι μπορούν και δε μπορούν να κάνουν. Ειδικά όταν βασίζουν τις νομοθεσίες σε παρωχυμένες ιδεοληψίες τύπου "Δεν έχεις το κατάλληλο κωλόχαρτο από το Χ πανεπιστήμιο". Αν εσύ περιμένεις να υπάρξει ένας "Δερβέναγας" ορισμένος από το κράτος για να κόψει τον ανταγωνισμό επειδή δε μπορείς να ανταπεξέλθεις, καλύτερα να το κόψεις το άθλημα από τώρα. Αν πιστεύεις ότι επειδή πήρες πτυχίο, μαθαίνοντας τον ελάχιστο κοινό παρονομαστή αναλογικά με το τι χρειάζεσαι, αυτόματα αυτό σε καθιστά καλύτερο , τότε κοιμάσαι τον ύπνο του δικαίου - και μάλιστα όρθιος. Υπάρχουν αυτοδίδακτοι (όχι απαραίτητα χωρίς ανώτατη εκπαίδευση, απλά σπούδασαν κάποια άλλη επιστήμη) που οι γνώσεις τους και οι ικανότητές τους είναι απαράμιλλες.
  3. Γελάνε και τα πατώματα με αυτή τη δήλωση. Φοβερά μαργαριτάρια των 'guru' καθηγητών ΤΕΙ Αθήνας σε εργαστήρια: 1) Εργαστήριο Δομές Δεδομένων, 2ο εξάμηνο (2009) Καθηγητής: Για να βρείτε σε C το μέγεθος του αρχείου καντε fread σε loop αθροίζοντας πόσα bytes διάβασε μέχρι να επιτρέψει 0. erevis: Δάσκαλε, να κάνουμε fseek / ftell καλύτερα? Τζιτζίκια.. 2) Εργαστήριο Αντικειμενοστρεφής προγραμματισμός, 4ο εξάμηνο (2010) Πίνακας //εστω class A //εστω class B : public A Α* pA = new A; B* pB = new B; delete pA; pA = pB; Καθηγητής: Να θυμάστε παιδιά να κάνετε delete ό,τι έχετε κανει new! Φοιτητής: Τι θα γίνει στη συγκεκριμένη περίπτωση αν δεν κανουμε delete τον pA?? Καθηγητής: Μπορεί να crashάρει το πρόγραμμα erevis: Δε θα crashάρει, memory leak θα υπάρξει. Καθηγτής: Ναι, και αυτό μπορεί να γίνει Σημειωτέον, ο καθηγτής Java ήξερε και απλά τον βάλανε να κάνει το εργαστήριο C++ γιατί ήταν βοηθός στο μάθημα "Αντικειμενοστρεφής Προγραμματισμός". Technically ναι, ενα μεγάλο πρόγραμμα με πολλά memory leaks καποια στιγμή μπορεί να κρασάρει, αν o operator new/new[] πετάξει exception το οποίο αφήσαμε unhandled και κληθεί η std::terminate. Η απάντηση του με σκότωσε, δε πρέπει να ήξερε καν τι ειναι το memory leak. 3) Λειτουργικά Συστήματα 2, 5ο(?) εξάμηνο, 2010 Context: 1ο μάθημα και κάνει revision σε C, ξεκινάει με pointers. Πίνακας int main(int argc, char** argv) { int *p = 3; printf("%d\n", *p); *p = 10; printf("%d\n", *p); return 0; } Καθηγητής: Παιδιά εδώ θα γράψει στο terminal 3 και μετά 10. erevis: Όχι, θα πετάξει το πρόγραμμα segfault στο πρώτο printf Καθηγητής: Όχι, τι λες? erevis: Ναι, προσπαθείτε να κάνετε dereference την θέση μνημης 3(!!) που είναι ξεκάθαρα εκτός του address space του process. Καθηγητής: Όχι, το πρώτο statement έκανε δεσμευση μνημης, έγραψε το 3 και επέστρεψε τη θεση μνήμης που δεσμεύτηκε στον pointer p. Αφού επέμεινα λίγο το τρέξαμε σε όλα τα pcs του εργαστηρίου και σοκαριστήκαμε όλοι οταν σε όλα πεταξε segfault. Μετά απο μερικές μέρες ήρθε και μου είπε: ".. ναι αλλά στον Borland compiler που χρησιμοποιώ εγώ blah blah". Μαλλον μπερδεύτηκε με το αντίστοιχο παράδειγμα χρησιμοποιώντας char*. Έλεος. Κι αυτός ο άνθρωπος ήθελε να μας διδάξει pthreads και BSD sockets με C. Κι αυτά είναι μερικά παραδείγματα, υπάρχουν ακόμα μερικά που τα διέγραψα πλήρως για να μην ξεχάσω κι αυτά που ξέρω.
  4. H συλλογιστική του VI Smirnov: Το x αρέσει πιο πολύ σ'ΕΜΕΝΑ -> Το x είναι πιο σοβαρό από το y και το z -> Όσοι ασχολούνται με το y και το z είναι μικρά παιδιά -> Ασχοληθείτε όλοι με το x Καλό θα ήταν να βουτάς λίγο τη γλώσσα στο μυαλό πριν ανοίξεις το στόμα σου, αλλά η έλλειψη μόρφωσης εκεί οδηγεί τον άνθρωπο..στο κλειστό μυαλό.
  5. Σοβαρά τώρα, πλάκα έχει εδώ και κανα 2μηνο που ξεκίνησες αλλά μπορείς κάποια στιγμή να σταματήσεις να τρολλάρεις?
  6. Erevis

    HOW can i Start?

    Σε άλλη ίδιου paradigm και ίδιου/παρόμοιου level ναι. Δε μπορείς όμως να πας από C σε Haskell και να περιμένεις ομαλή μετάβαση.
  7. Μπα δε νομίζω ότι κάνουν αυτά τα links. O op χρειάζεται να περάσει κάποια extra ορίσματα εκτός από το όρισμα που περνάει η for_each το οποίο είναι το τρέχον element, τα οποία κιόλας να μην ορίζονται σε ΚΑΘΕ κλήση αλλά μόνο κατα την αρχικοποίηση. Τα links είναι χρήσιμα αν θες function pointer σε συναρτήσεις με συγκεκριμένο προτότυπο,
  8. Για να έχεις διαφορετικό πλήθος ορισμάτων σε κάθε συνάρτηση μάλλον αυτό που χρειάζεσαι είναι functors, δηλαδή objects των οποίων οι κλάσεις τους κάνουν overload τον τελεστή (). Τα διαφορετικά ορίσματα θα τα περνάς στον functor μέσω του constructor του. π.χ #include <algorithm> #include <iostream> class Sum { int& total; int power; public: Sum(int& total, int power) : total(total), power(power) { } void operator()(int& current) { total += pow(current, power); } int getTotal() const { return total; } private: int pow(int base, unsigned exponent) { if(exponent == 0) { return 1; } int ret = base; for(unsigned i = 1; i < exponent; i++) { ret *= base; } return ret; } }; int main(int argc, char** argv) { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int total = 0; Sum sum = std::for_each(array, array + 9, Sum(total, 2)); std::cout << sum.getTotal() << '\n'; return 0; } Προφανώς στο συγκεκριμένο παράδειγμα μπορεί να χρησιμοποιηθεί η std::accumulate απλά ήταν ότι πιο απλό μπορούσα να σκεφτώ. Παρατήρησε πως το field total στην κλάση είναι reference σε μια εξωτερική μεταβλητή καθώς το standard της C++ δε μας εγγυάται ότι η for_each για κάθε στοιχείο θα χρησιμοποιήσει το ίδιο object στο πέρασμα που θα κάνει, οπότε αν χρειάζεσαι ο functor σου να κρατά state πρέπει να γίνεται μέσω reference ή pointer σε κοινή μνήμη. Υ.Γ Δε ξέρω αν παίζει κάποια μόντα σε C++11 που να απλοποιεί τα πράγματα, αν γνωρίζει κάποιος ας μας διαφωτίσει.
  9. Δεν είναι απαραίτητο ότι μια κλάσση πρέπει να υποστηρίζει πολυμορφισμό, ένα παράδειγμα είναι o std::vector, μπορείς να κάνεις inherit από αυτόν μεν, δε μπορείς να τον χρησιμοποιήσεις σαν base class για πολυμορφισμό δε. Οπότε εφόσον δεν υποστηρίζει πολυμορφισμό θα ήταν ανόητο να έχει virtual destructor μιας και θα πλήρωνε το performance pernalty του late binding χωρίς λόγο.
  10. Δεν είναι ίδια η λογική αν παρατηρήσεις καλά, κάποιες μπάλες έχουν διαφορετικό rate με το οποίο κάνουν regen και decay ενώ η Basketball δε κάνει regen καθόλου στη rest. Επίσης όπως το έθεσες του δίνεις να καταλάβει ότι ο "τύπος" της μπάλας ορίζεται από το string, οπότε με if στον κώδικα της κλάσσης Ball θα προσδιορίζει τι πρέπει να κάνει στην εκάστοτε περίπτωση. Προσωπικά θα έκανα κάτι τέτοιο: #include <iostream> #include <algorithm> #include <cstdlib> #include <ctime> class Ball { int currDurability; int maxDurability; bool hidden; public: virtual ~Ball() { } void set(int maxDurability) { this->currDurability = maxDurability; this->maxDurability = maxDurability; this->hidden = false; } void hit() { std::cout << getName() << " ball is going to be hit!\n"; if(hidden){ std::cout << "You cannot hit a hidden ball\n"; return; } std::srand(std::time(0)); int i = 1 + std::rand()%5; if( i == 5 ) { hidden = true; std::cout << "Ball disappeared!\n"; } else { currDurability -= getDurabilityDecay(); std::cout << "Tsaf!\n"; if(currDurability == 0) { std::cout << "The ball is about to break!\n"; } else if(currDurability < 0) { std::cout << "Plof!\n"; } } } void rest() { if(regenerates()) { currDurability += getDurabilityRegen(); currDurability = std::min(currDurability, maxDurability); } std::cout << getName() << " is " << currDurability << '\n'; } protected: Ball(int maxDurability) : currDurability(maxDurability), maxDurability(maxDurability), hidden(false) { } virtual const char* getName() = 0; virtual bool regenerates() { return false; } virtual int getDurabilityRegen() { return 0; } virtual int getDurabilityDecay() { return 0; } }; class TennisBall : public Ball { public: TennisBall(int maxDurability) : Ball(maxDurability) { } virtual ~TennisBall() { } protected: virtual const char* getName() { return "Tennis"; } virtual bool regenerates() { return true; } virtual int getDurabilityRegen() { return 3; //καλύτερα να είναι constant της κλάσσης αλλά βαριέμαι //αντίστοιχα και στ'άλλα. } virtual int getDurabilityDecay() { return 5; } }; class PingPongBall : public Ball { public: PingPongBall(int maxDurability) : Ball(maxDurability) { } virtual ~PingPongBall () { } protected: virtual const char* getName() { return "PingPong"; } virtual bool regenerates() { return true; } virtual int getDurabilityRegen() { return 1; } virtual int getDurabilityDecay() { return 1; } }; class BasketBall : public Ball { public: BasketBall(int maxDurability) : Ball(maxDurability) { } virtual ~BasketBall () { } protected: virtual const char* getName() { return "Basket"; } virtual int getDurabilityDecay() { return 1; } }; Κάτι που μπορεί να άλλαζα θα ήταν να μην υπάρχουν μέθοδοι για τα regen rates αλλά private μεταβλητές στην base class οι οποίες θα ορίζονται από την subclass καρφωτά μέσω του constructor της. Αλλά αυτό είναι tradeoff μεταξύ χρήσης μνήμης και CPU time για το lookup των virtual μεθόδων. Tρίχες στη συγκεκριμένη περίπτωση, ο κώδικας πιστεύω πως είναι πιο καθαρός έτσι.
  11. Απλά μου φάνηκε εντυπωσιακό το πώς μια stringly typed λύση προτάθηκε ως καλή εναλλακτική, πόσο μάλλον για μια γλώσσα προγραμματισμού όπως η C++.
  12. Δηλαδή είτε θα είσαι κατσαπλιάς που απλά προσπαθεί να μάθει λίγο καλύτερα το πώς δουλεύουν οι γλώσσες προγραμματισμού είτε ο Guido Von Rossum που γράφεις την υλοποίηση της Python μόνος σου, δεν υπάρχουν ενδιάμεσα στάδια.. Φαντάζομαι τα πιτσιρίκια (προγραμματιστικά) που γράφουν στο GSoC κώδικα για τον gcc ή την boost κτλ είναι μπαρουτοκαπνισμένοι επαγγελματίες με PhDs. Your argument is invalid.
  13. No shit Sherlock... Δε καταλαβαίνεις πως για να ξεκινήσει κάποιος να μαθαίνει κάτι πρέπει συνήθως να ξεκινήσει από χαμηλά? Προφανώς και αυτό που θα φτίαξει δε θα το πουλήσει 100.000.000.000$ στο DoD. Το να λες σε κάποιον που θέλει να ασχοληθεί με compilers να το αφήσει καλύτερα γιατί δε θα φτιάξει τον gcc ή τον clang ξερω γω, είναι σαν να λες στον υποψήφιο web developer να μην φτιάξει εκπαιδευτικά μια sample σελίδα επείδη δε θα είναι το Facebook.
  • Δημιουργία νέου...