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

Συνάρτηση που επιστρέφει τη θέση του στοιχείου ενός πίνακα


lektikos

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

...(LOL όμως ε: το "recovery" έγινε τώρα "ειδοποίηση για recovery" -- λίγο ακόμα και θα καταφέρουμε να το προσγειώσουμε στην άσχημη πραγματικότητα του "τυπώνω error message")...

 

Θα μπορούσες να σκέφτεσαι λιγάκι πριν ποστάρεις; Πως ακριβώς θα μπορούσε μια συνάρτηση να κάνει recovery σε κώδικα που δεν γνωρίζει; Και πως ακριβώς η χρήση μεταβλητής (ή ακόμα και μηχανισμού) ειδικά για έλεγχο εξισώνεται με ένα print statement;

 

Η άσχημη πραγματικότητα είναι πως κατά τα φαινόμενα ακούς για 1η φορά στη ζωή σου τον όρο "verbose/debugging mode", πόσο μάλλον για τη χρήση και τη χρησιμότητά του.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Εντάξει, το προσγειώσαμε.

 

Το πρόβλημα είναι πως εγώ δε σκέφτομαι ή πως εσύ πήγες για τσιγάρα στο περίπτερο και αφήνεις να εννοηθεί πως έτρεξες μαραθώνιο; Ή ίσως πως χωρίς δόλο χρησιμοποιείς λέξεις με λάθος τρόπο; Υπάρχουν και λεξικά. Έχει και δωρεάν online.

 

Τώρα, αν πραγματικά σε ενδιαφέρει (lol), πραγματικό "recovery" θα μπορούσε να γίνει είτε κάνοντας shut down και μεταφέροντας την ευθύνη για τη συνέχιση λειτουργίας σε κάποιο redundant σύστημα (όπως όντως κάνουν στις διαστημικές αποστολές), είτε προσπαθώντας να κάνεις reinitialize κάποιο υποσύστημα (όπως π.χ. κάνει o Chrome όταν κρασάρει ένα tab, ή π.χ. σε .NET κάνοντας unload/reload ένα AppDomain).

 

Άλλη απορία;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επειδή τα πολλά λόγια είναι φτώχεια (ειδικά όταν έχω απέναντί μου εσένα) το δικό σου API φτιάξτο όπως είναι η standard string library της C (η πλέον infamous πηγή bugs σε software στην ιστορία της πληροφορικής) και άσε με εμένα τα δικά μου APIs να τα φτιάχνω με προαιρετικό verbose/debugging mode και με ειδοποίηση για recovery σε όποιον άγριο τα χρησιμοποιήσει.

 

Μη λεμε οτι να'ναι. Η std στοχευει στη ταχυτητα. Επισης, εαν εχεις debug version, τοτε σιγουρα το errno ειναι οτι χειροτερο ως πρακτικη. Αν εισαι σε debug ειναι καλυτερα να στελνεις απευθειας το error σε καποιο stream και αν χρειαστει ας στειλεις στο cpu instruction για trap/break whateva

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μη λεμε οτι να'ναι. Η std στοχευει στη ταχυτητα. Επισης, εαν εχεις debug version, τοτε σιγουρα το errno ειναι οτι χειροτερο ως πρακτικη. Αν εισαι σε debug ειναι καλυτερα να στελνεις απευθειας το error σε καποιο stream και αν χρειαστει ας στειλεις στο cpu instruction για trap/break whateva

 

Δεν σε καταλαβαίνω!

 

Το errno το χρησιμοποιούν όλες οι στάνταρ βιβλιοθήκες της C από μαμά, οπότε πως είναι δυνατόν να το χαρακτηρίζεις ότι χειρότερο ως πρακτική; Επίσης το errno αυτό καθέ αυτό δεν ασχολείται με εκτύπωση (αλλά σου δίνει προαιρετικά τη δυνατότητα να τυπώσεις το error στην stderr p.x. με την perror() ) οπότε και πάλι δεν καταλαβαίνω τι ακριβώς λες.

 

Η ουσία ενός τέτοιου μηχανισμού ελέγχου δεν είναι να κάνει sudden death στο πρόγραμμα που παέι να σηκώσει exception αλλά να σου δώσει έναν τρόπο να μπορείς να ελέγξεις εσύ που χρησιμοποιείς το API για το τι ακριβώς θέλεις να κάνεις σε τέτοια περίπτωση: θες να κάνεις cleanup & exit? κάνε; Θες να επιχειρήσεις recovery? Επιχείρησε! It's up to you (και αυτή ακριβώς είναι η ουσία, να σου δίνει δηλαδή το API τη δυνατότητα να αποφασίσεις τι θα κάνεις).

 

Οπότε όντως "μη λέμε ότι να 'ναι".

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παιδιά ήρεμα μια ερώτησε έκανε το παιδί για το πως τρέχει ο κώδικας και όχι ματς WWE. Καλό είναι να σπαστεί το θέμα γιατί βλέπω το άτομο με πολλά ερωτηματικά αντί μιας σαφούς απάντησης.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε debug mode?  :-D

 

Προφανώς σε debug mode προέχει το reporting. Για αυτό και διαχώρισα εξαρχής το verbose/debugging mode από την πρόβλεψη του API να δίνει τη δυνατότητα στον end-programmer να εντοπίζει το πρόβλημα (για να αποφασίσει μετά πως θέλει να το διαχειριστεί). Είναι 2 ξεχωριστά πράγματα δηλαδή (κανένα εκ των οποίων είναι σημαντικό σε ένα API κατά τον defacer).

 

Δηλαδή, για παράδειγμα, και με κλειστό το debug mode μπορείς κάλλιστα να έχεις κώδικα του στυλ...

errno = 0;
foo(bla bla);
if ( EFAULT == errno ) {
   // διαχειρίσου εδώ όπως αγαπάς το πρόβλημα
}

Unpublished...

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όσα εποικοδομητικά είχα να πω τα είπα.

Ο καθένας μπορεί αν θέλει να βάζει "debugging mode" μέσα σε υποτιθέμενα production κώδικα, προσωπικά το θεωρώ beyond stupid (γι' αυτό το σκοπό υπάρχουν τα debug builds FFS!) αλλά περι ορέξεως κολοκυθόπιτα. Δεν είναι η πρώτη και δε θα είναι και η τελευταία φορά που ο migf1 έχει βρει την καλύτερη μέθοδο στο σύμπαν και δε δέχεται κουβέντα.

 

 

 

Βέβαια ας μη ξεχνάμε πως όλη αυτή η συζήτηση είναι παραπλανητική και ανούσια -- όπως είπα από την αρχή, το ζουμί εδώ είναι στο πώς βρίσκεις τα στοιχεία μέσα στον πίνακα και όχι στο αν έχεις null check. Φαντάζομαι πως εκεί είχαμε μια περίπτωση "σιωπηλής αποδοχής" μιας και δεν υπήρξε κριτική επι της ουσίας, αλλά φαίνεται πως για κάποιους είναι ανάγκη να βγουν από πάνω ακόμα κι αν χρειάζεται γι' αυτό να καταφύγουν στο ότι βρωμάνε τα πόδια σου φίλε.

 

 

 

Speaking of κουβέντα, παρακαλώ όποιος θέλει να μου βάλει κουβέντες στο στόμα ας κάνει και μια παράθεση του σημείου όπου τις ξεστόμισα ο ίδιος αλλιώς ας δείξει μια στοιχειώδη σοβαρότητα βουλώνοντάς το. Να, κάπως έτσι:

 


το δικό σου API φτιάξτο όπως είναι η standard string library της C (η πλέον infamous πηγή bugs σε software στην ιστορία της πληροφορικής)

 
2 hours later...

 


Το errno το χρησιμοποιούν όλες οι στάνταρ βιβλιοθήκες της C από μαμά, οπότε πως είναι δυνατόν να το χαρακτηρίζεις ότι χειρότερο ως πρακτική;

 

Τέλος, τα περί "recovery" και αντιμετώπισης του προβλήματος (που βασικά δεν γίνεται στην προκειμένη περίπτωση) τα είπαμε, ας μη τα ξαναπούμε. Όποιος έχει μυαλό μπορεί να σκεφτεί ότι με την κατ' εμέ beyond stupid προσέγγιση στην ουσία ο συγγραφέας μας παρακινεί να μη φτιάξουμε τα bugs στον κώδικά μας αλλά να κάνουμε αυτό:

foo(...)
if (my_code_has_a_bug) { ... }

I rest my case.
 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@defacer:

 

 

Πραγματικά υποκλίνομαι στις γνώσεις και την αξιοπιστία τους, αλλά κυρίως σην απίστευτη εμπειρία σου σε production code (και μη) defacer!

 

Όταν ευκαιρήσεις, κάνε σε παρακαλώ έναν κόπο κι ενημέρωσε π.χ. την Apple ή π.χ. την Digital Research σχετικά με το αδόκιμο ή μάλλον για το stupidity όπως γράφεις της πρόβλεψης για error recovery στα APIs/libraries τους, γιατί είναι κρίμα ρε γαμότο να επενδύουν χρόνο, χρήμα, resources, και μάλιστα στοχεύοντας σε production code, και εν τέλει να παιδεύονται τσάμπα για μια χούφτα άσχετους που δεν ξέρουν να γράφουν bug-free κώδικα.

 

Ιδανικά, επιχειρηματολόγησε και σε αυτούς όπως και σε μας εδώ, με το απαύγασμα δηλαδή της εμπειρίας που αποπνέει ο βαθυστόχαστος pesudo-code σου...

 

 

foo(...)

if (my_code_has_a_bug) { ... }

 

 

Ευτυχώς που σε έχω (έχουμε) βρει για να με επιμορφώνεις, αλλά κυρίως για να με "βελτιώνεις" όπως επίσης ισχυρίστηκες.

 

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

 

 

Για τα υπόλοιπα παιδιά του φόρουμ, θεωρώ πως τα παραπάνω links (δηλαδή: Cocoa και D) είναι good read, για αυτό και τα έβαλα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Άριστοι γνώστες και οι δύο φίλτατοι. Μην μπαίνετε σε τέτοιες αντιπαραθέσεις, μια έρωτηση έκανα για το πως μπορεί να συνταχθεί με απλό κώδικα η επιστροφή της θέσης στοιχείου/ων ενός πίνακα.

Καταλαβαίνω πολλά απ΄αυτά που γράφετε, πληροφορική σπούδασα, απλά προσπαθώ να "ξαναμπώ" στο νόημα, αφενός γιατί δεν διδάχτηκα C σε πολύ μεγάλο βάθος(για pointers, structs, δεν το συζητώ... :confused: ), αφετέρου ο χρόνος για να εντρυφήσει και να αφομοιώσει κάποιος όλα αυτά, ήταν περιορισμένος.

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

Ευχαριστώ για μια ακόμη φορά όλους εσάς που απαντάτε στις απορίες και θα επακολουθήσουν κι άλλες, είμαι βέβαιος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κανονιστε να ξαναφατε κανα μπαν στο τελος :D

Δεν το αποκλείω και δε θα με χαλούσε στην τελική. Έτσι κι αλλιώς όποτε ποστάρω κάτι που έχει να κάνει με C κάθε φορά τα ίδια, κι αν δεν είμαι εγώ, θα είναι ο Retromaniac ή ο οποιοσδήποτε άλλος. Ήδη από το δεύτερο ban έχω στο μυαλό μου πως το permaban όσον αφορά το forum θα είναι μια μάλλον θετική εξέλιξη.

Άριστοι γνώστες και οι δύο φίλτατοι.

 

Κανένας από τους δυο μας δεν είναι άριστος γνώστης (παρόλο που ως γνωστόν, όσο λιγότερα ξέρει κανείς τόσο πιο άριστο θεωρεί τον εαυτό του). Απλά τα θέματα που πραγματεύεται ο κόσμος στο forum είναι πάντα πολύ απλά και "στους τυφλούς βασιλεύει ο μονόφθαλμος". Αυτά που διαβάζεις ακόμα κι ο θεός ο ίδιος να τα λέει πρέπει να τα βλέπεις με κριτικό μάτι και να ψάχνεις το "γιατί".

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όσα εποικοδομητικά είχα να πω τα είπα.

 

Ο καθένας μπορεί αν θέλει να βάζει "debugging mode" μέσα σε υποτιθέμενα production κώδικα, προσωπικά το θεωρώ beyond stupid (γι' αυτό το σκοπό υπάρχουν τα debug builds FFS!) αλλά περι ορέξεως κολοκυθόπιτα. 

 

 

Οπα, το να βαλεις ενα τετοιο

void foo(void* p)
{
#ifdef DEBUG
	if(!p)
		MrDebugerBreakThatWithMessage("mpla mpla");
#endif
}

Μονο κακο δεν θα σου κανει. Βασικα αν δεν βαλεις κατι τετοιο μονο κακο θα σου κανεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το είπα ήδη ρε συ. Debug build και assert. Για την ακρίβεια δε χρειάζεται να το κάνεις manually, μπορείς απλά να γράψεις

assert(p);

Και αν είσαι σε debug build θα βγει dialog box που θα σου δίνει τη δυνατότητα να κάνεις break in στο debugger επιτόπου (τουλάχιστον στο VS). Try it. Αν είσαι σε release build => instacrash.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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