defacer Δημοσ. 27 Ιουνίου 2016 Δημοσ. 27 Ιουνίου 2016 @alithinos 3) Κάντο όπως σε βολεύει για να είναι ευχάριστο, απλά έχε υπόψη να εξυπηρετείς και τους δυο τομείς. Μη κάνεις δυο βδομάδες μόνο το ένα ή το άλλο. 4) https://en.wikipedia.org/wiki/Rubber_duck_debugging 6) Υπάρχει στάνταρ προτεινόμενος τρόπος όπως λέει ο elorant, με τον οποίο το μεγαλύτερο μέρος της δουλειάς γίνεται behind the scenes χωρίς να ασχοληθείς. Βεβαίως υπάρχουν και καστομιές, το έτοιμο δε βολεύει σε κάποιες περιπτώσεις. Αλλά μάθε πρώτα να χρησιμοποιείς το στάνταρ και αν και όταν βρεθείς σε κατάσταση που δε σε εξυπηρετεί θα έχεις μια καλύτερη αντίληψη της κατάστασης για να την αντιμετωπίσεις. 1
Alithinos Δημοσ. 4 Ιουλίου 2016 Μέλος Δημοσ. 4 Ιουλίου 2016 @defacer: 3) Ενδιαφέρον. Ξεκίνησα να τα κάνω και τα δύο λοιπόν μαζί. 4) Κοίτα να δεις... ------------------------------------------------------------------------------------------------------------- Θα μοιραστώ κάτι παράξενο που συνάντησα μαζί σας βρε παιδιά. Λοιπόν έχω μια μέθοδο η οποία δέχεται κάποια δεδομένα, μεταξύ άλλων και ένα argument τύπου DateTime, και τυπώνει τα δεδομένα σε labels. Ενώ λειτουργούσε το πρόγραμμα κανονικά, έκλεισα το Visual Studio, και όταν το ξανά άνοιξα έβγαζε error που πριν δεν υπήρχε (!) Τελικά το πρόβλημα εντοπίστηκε στο DateTime.Now. Κανονικά η μέθοδος τυπώνει τη τρέχουσα ημερομηνία σε ένα label. Ενώ όμως περνώντας σαν argument το DateTime.Now λειτουργούσε μια χαρά, κάποια στιγμή έτσι ξαφνικά σταμάτησε. Πλέον περνόντας DateTime.Now σαν argument, εμφανίζονται στο label δύο μηδενικά. Έριξα μια ματιά με το Make Watch κατά το debugging, και τι να δω ; null. Το τοπικό αντικείμενο που αρχικοποιείται με το argument DateTime.Now είναι null. Εν το μεταξύ, αν αρχικοποιήσω ένα αντικείμενο DateTime με manual τρόπο, πχ DateTime currentDate = new DateTime(2016,7,4); λειτουργεί μια χαρά, και τυπώνεται η εκάστοτε ημερομηνία στο label. Τελικά, για να πάρω το επιθυμητό αποτέλεσμα κατέληξα σε αυτή την αλχημεία: DateTime currentDate = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day); όσο παράξενο και αν φαίνεται, αυτό λειτουργεί, ενώ το DateTime currentDate = DateTime.Now; όχι! Ενώ πριν λειτουργούσε μια χαρά!!! Και έχω και τα αρχεία στο git που το αποδεικνίουν, δεν είμαι τρελός! Τι στο καλό συνέβει ;
defacer Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Το τοπικό αντικείμενο που αρχικοποιείται με το argument DateTime.Now είναι null. Δεν υπάρχει περίπτωση να είναι null επειδή η Now επιστρέφει DateTime και το DateTime είναι value type. Ίσως εννοείς είναι "μηδενικό"; Αυτό που πρέπει να κάνεις είναι απλά να μπεις στο debugger και να δεις ακριβώς ποια τιμή έχει η local, και ανάλογα την απάντηση αποφασίζεις για το επόμενο βήμα. Πάντως επειδή select isn't broken είναι πρακτικά σίγουρο ότι εσύ έχεις κάνει κάπου κάπως κάποια αλλαγή που οδηγεί στο περίεργο αποτέλεσμα.
Επισκέπτης Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 @Alithinos Αυτό το πράγμα που έχεις μια ροπή να θεωρείς πως κάτι φταίει στο σύστημα κι όχι στον κώδικα σου δεν θα σε πάει πολύ μακριά.
Alithinos Δημοσ. 4 Ιουλίου 2016 Μέλος Δημοσ. 4 Ιουλίου 2016 @defacer: Με DateTime.Now καταλήγει στην έξοδο η μέρα να είναι 0, ο μήνας null, και το έτος 0. Αν και κατά την είσοδο, φαίνεται η ημερομηνία. Ωστόσο με DateTime αρχικοποιημένο με τον άλλο τρόπο όπως έδειξα, ότι εισάγεται, εξάγεται ακριβώς. Το ζήτημα είναι ότι δεν πείραξα τίποτα στη μέθοδο αυτή που είναι υπεύθυνη για αυτό. Και η συμπεριφορά μου φαίνεται παράλογη. Αυτό που φοβάμαι είναι πως φταίει το coupling, και συνέβει το φαινόμενο της πεταλούδας. @elorant: Δεν κατηγόρησα κανέναν, περιέγραψα το συμβάν.
Papakaliati Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Αυτό που φοβάμαι είναι πως φταίει το coupling, και συνέβει το φαινόμενο της πεταλούδας. Τι εννοεις με το coupling;
defacer Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Εξακολουθεί να είναι παράλογο. Σε τι σύστημα τα τρέχεις αυτά; Επίσης, αφού τα έχεις στο git γιατί δεν πας λίγο πίσω στο χρόνο να δεις αν τότε δούλευε; Και αν πριν δούλευε θα είναι εύκολο να βρεις πότε χάλασε και κατ' επέκταση γιατί.
Alithinos Δημοσ. 4 Ιουλίου 2016 Μέλος Δημοσ. 4 Ιουλίου 2016 Τι εννοεις με το coupling; Εννοώ όταν έχεις sub-modules που εξαρτούνται από άλλα, ή κλάσεις που εξαρτούνται από άλλες... Υπάρχει η περίπτωση να αλλάξεις κάτι σε ένα σημείο ενός Α στοιχείου, και αυτό να επιδράσει με απρόσμενες συνέπειες κάπου αλλού, γιατί τα στοιχεία Α,Β,Γ... είναι 'δεμένα' μεταξύ τους, επικοινωνούν το ένα με το άλλο. Έστω ότι έχεις μια μέθοδο Kati(), μέσα στην οποία καλούνται μέθοδοι από άλλες κλάσεις, ακόμα και από άλλα assemblies. Και χωρίς να ανοίξεις τη μέθοδο Kati() και να πειράξεις κάτι μέσα της, επειδή άλλαξες κάτι κάπου αλλού, η μέθοδος να αλλάξει συμπεριφορά εκεί που δε το περίμενες.
Papakaliati Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Εννοώ όταν έχεις sub-modules που εξαρτούνται από άλλα, ή κλάσεις που εξαρτούνται από άλλες... Υπάρχει η περίπτωση να αλλάξεις κάτι σε ένα σημείο ενός Α στοιχείου, και αυτό να επιδράσει με απρόσμενες συνέπειες κάπου αλλού, γιατί τα στοιχεία Α,Β,Γ... είναι 'δεμένα' μεταξύ τους, επικοινωνούν το ένα με το άλλο. Έστω ότι έχεις μια μέθοδο Kati(), μέσα στην οποία καλούνται μέθοδοι από άλλες κλάσεις, ακόμα και από άλλα assemblies. Και χωρίς να ανοίξεις τη μέθοδο Kati() και να πειράξεις κάτι μέσα της, επειδή άλλαξες κάτι κάπου αλλού, η μέθοδος να αλλάξει συμπεριφορά εκεί που δε το περίμενες. Το DateTime currentDate = DateTime.Now; ομως δεν εξαρταται απο κανενα submodule η αλλη κλαση η whatever. O μονος τροπος που μπορω να σκεφτω να γινεται null στην πορεια ( εκτως αμα το εχεις θεσει σαν DateTime?, και το περνας σε καμια αλλη κλαση που το nullarei), ειναι να κανεις corrupt την μνημη καλωντας κανενα c++ dll και γεμιζοντας buffer δηλωνοντας λαθος μεγεθος, αλλα και παλι θα σε πετουσε memory corruption error.
Alithinos Δημοσ. 4 Ιουλίου 2016 Μέλος Δημοσ. 4 Ιουλίου 2016 Εξακολουθεί να είναι παράλογο. Σε τι σύστημα τα τρέχεις αυτά; Επίσης, αφού τα έχεις στο git γιατί δεν πας λίγο πίσω στο χρόνο να δεις αν τότε δούλευε; Και αν πριν δούλευε θα είναι εύκολο να βρεις πότε χάλασε και κατ' επέκταση γιατί. Σύστημα ; Το hardware είναι της υπογραφής μου. Το VS είναι Community 2015 (14.0.25123.00 update 2) Το project σε .NET 4.5 / anyCPU. Όσων αφορά το git, το πρόβλημα είναι ότι ύστερα της πρώτης φοράς που το ενεργοποίησα (29 / 5) νόμιζα ότι θα το έκανε αυτόματα, (χρησιμοποιώ το VS plugin) και δεν το ξανακοίταξα μέχρι χθες που εμφανίστηκε αυτό το πρόβλημα, άρα υπάρχει τεράστια διαφορά γενικά στο project, με νέα code files, και και. Στα σχετικά, άλλαξα τη δήλωση του αντικειμένου το οποίο έχει τη μέθοδο που τυπώνει στο label, από local variable σε public field, και το επιστρεφόμενο αντικείμενο της μεθόδου σε public static field. ( Η μέθοδος επιστρέφει ένα custom αντικείμενο το οποίο περιέχει δύο strings, ένα με την τρέχουσα ημερομηνία φορμαρισμένη ανάλογα τη χώρα του χρήστη, και ένα με greeting message το οποίο λέει ποιος γιορτάζει σήμερα. Η φορμαρισμένη ημερομηνία εμφανίζεται σε ένα label της Form, και το μήνυμα σε άλλο label.) Το DateTime currentDate = DateTime.Now; ομως δεν εξαρταται απο κανενα submodule η αλλη κλαση η whatever. O μονος τροπος που μπορω να σκεφτω να γινεται null στην πορεια ( εκτως αμα το εχεις θεσει σαν DateTime?, και το περνας σε καμια αλλη κλαση που το nullarei), ειναι να κανεις corrupt την μνημη καλωντας κανενα c++ dll και γεμιζοντας buffer δηλωνοντας λαθος μεγεθος, αλλα και παλι θα σε πετουσε memory corruption error. Ίσως να ήταν βλακεία μου που δεν το ανέφερα νωρίτερα. Όπως είπα, έκλεισα το VS με όλα να λειτουργούν καλά, και όταν το άνοιξα ξανά υπήρχε-ανε πρόβλημα-τα. Το πρώτο πράγμα που συνάντησα ήταν το fatalExecutionEngineError. The fatalExecutionEngineError managed debugging assistant (MDA) is activated when a fatal error in the common language runtime (CLR) has been detected. The process will be terminated. Για να το λύσω, αφαίρεσα τελείως ένα από τα controls, και προσπαθούσα 1 τη νύχτα ως τις 3 να κάνω το πρόγραμμα να μπορεί να τρέξει ξανά, δοκιμάζοντας πράγματα στη τύχη, μιας και η σελίδα του MSDN δεν βοηθά και πολύ για αυτό το error: https://msdn.microsoft.com/en-us/library/ms228990(v=vs.110).aspx The CLR has been fatally corrupted. This is most often caused by data corruption, which can be caused by a number of problems, such as calls to malformed platform invoke functions and passing invalid data to the CLR. Τελικά δοκιμάζοντας διάφορα κατάφερα να κάνω ξανά το πρόγραμμα να τρέξει, αλλά πλέον αντί να βγάλει στο label την ημερομηνία, έβγαζε τα μηδενικά, και ύστερα κατέληξα στο DateTime.Now.
Papakaliati Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Σύστημα ; Το hardware είναι της υπογραφής μου. Το VS είναι Community 2015 (14.0.25123.00 update 2) Το project σε .NET 4.5 / anyCPU. Όσων αφορά το git, το πρόβλημα είναι ότι ύστερα της πρώτης φοράς που το ενεργοποίησα (29 / 5) νόμιζα ότι θα το έκανε αυτόματα, (χρησιμοποιώ το VS plugin) και δεν το ξανακοίταξα μέχρι χθες που εμφανίστηκε αυτό το πρόβλημα, άρα υπάρχει τεράστια διαφορά γενικά στο project, με νέα code files, και και. Στα σχετικά, άλλαξα τη δήλωση του αντικειμένου το οποίο έχει τη μέθοδο που τυπώνει στο label, από local variable σε public field, και το επιστρεφόμενο αντικείμενο της μεθόδου σε public static field. ( Η μέθοδος επιστρέφει ένα custom αντικείμενο το οποίο περιέχει δύο strings, ένα με την τρέχουσα ημερομηνία φορμαρισμένη ανάλογα τη χώρα του χρήστη, και ένα με greeting message το οποίο λέει ποιος γιορτάζει σήμερα. Η φορμαρισμένη ημερομηνία εμφανίζεται σε ένα label της Form, και το μήνυμα σε άλλο label.) Ίσως να ήταν βλακεία μου που δεν το ανέφερα νωρίτερα. Όπως είπα, έκλεισα το VS με όλα να λειτουργούν καλά, και όταν το άνοιξα ξανά υπήρχε-ανε πρόβλημα-τα. Το πρώτο πράγμα που συνάντησα ήταν το fatalExecutionEngineError. The fatalExecutionEngineError managed debugging assistant (MDA) is activated when a fatal error in the common language runtime (CLR) has been detected. The process will be terminated. Για να το λύσω, αφαίρεσα τελείως ένα από τα controls, και προσπαθούσα 1 τη νύχτα ως τις 3 να κάνω το πρόγραμμα να μπορεί να τρέξει ξανά, δοκιμάζοντας πράγματα στη τύχη, μιας και η σελίδα του MSDN δεν βοηθά και πολύ για αυτό το error: https://msdn.microsoft.com/en-us/library/ms228990(v=vs.110).aspx The CLR has been fatally corrupted. This is most often caused by data corruption, which can be caused by a number of problems, such as calls to malformed platform invoke functions and passing invalid data to the CLR. Τελικά δοκιμάζοντας διάφορα κατάφερα να κάνω ξανά το πρόγραμμα να τρέξει, αλλά πλέον αντί να βγάλει στο label την ημερομηνία, έβγαζε τα μηδενικά, και ύστερα κατέληξα στο DateTime.Now. Δημιουργησε καινουργιο project απο την αρχη και τσεκαρε αμα αυτο λυσει το προβλημα. Και την επομενη φορα οταν περιγραφεις ενα παρομοιο προβλημα μαλλον θα θελεις να ξεκινησεις απο το πιο σημαντικο στοιχειο 1
Επισκέπτης Δημοσ. 5 Ιουλίου 2016 Δημοσ. 5 Ιουλίου 2016 Πριν κάνεις αυτό που λέει ο Papakaliati πήγαινε στο μενού Build και επέλεξε Clean Solution και μετά Rebuild. Δες αν αυτό διορθώνει το πρόβλημα.
Alithinos Δημοσ. 5 Ιουλίου 2016 Μέλος Δημοσ. 5 Ιουλίου 2016 Πριν κάνεις αυτό που λέει ο Papakaliati πήγαινε στο μενού Build και επέλεξε Clean Solution και μετά Rebuild. Δες αν αυτό διορθώνει το πρόβλημα. Αυτό ήταν! Με το Clean Solution έφτιαξε!
Alithinos Δημοσ. 3 Αυγούστου 2016 Μέλος Δημοσ. 3 Αυγούστου 2016 Το έκανε ξανά. Έκλεισα το VS με όλα να δουλεύουν μια χαρά, και την επόμενη φορά που το άνοιξα ξανά πέταγε errors από το πουθενά. Και αυτή τη φορά το Clean Solution δεν κάνει τίποτα. Εμφανίστηκε και το παλιό πρόβλημα με το DateTime.Now, και επίσης μου πετά NullReferenceException εκεί που δεν πρέπει. Αφού το αντικείμενο δηλώνεται, ορίζεται, και αρχικοποιείται με constructor, δεν θα έπρεπε να υφίσταται NullReference, και δεν υπήρχε πριν τη μαγική στιγμή που εμφανίστηκε από το πουθενά χωρίς να πειράξω τίποτα στο σχετικό κομμάτι κώδικα. Να κάνω update στο Update 3 και να βάλω στο σημερινό patch: το δοκίμασα. Να κάνω Clean Solution τα πάντα και ξανά build: το δοκίμασα. Ακόμα και η αρχική οθόνη του VS χάλασε! Από κει που πάντα κάτω από το "Recent" που δείχνει τα πρόσφατα projects στην αριστερά πλευρά της, είχε ταξινομημένα τα πιο πρόσφατα projects ξεκινώντας από πάνω προς τα κάτω με το πιο πρόσφατο, τώρα που το άνοιξα ξανά δε μου δείχνει αυτό που έκλεισα τελευταίο, αλλά κάποιο άλλο! Υ.Γ. Δεν ξέρω αν σχετίζεται αλλά αυτό έγινε αφού πρώτα εγκατέστησα το παιχνίδι LA Noire, το οποίο τελικά δεν έπαιξε γιατί δεν παίζει γενικά σε Windows 8.1, και ύστερα το απεγκατέστησα απ' το pc. Τίποτα άλλο δεν άλλαξα στον υπολογιστή μου. Υ.Γ.2 Σε αντίθεση με τη προηγούμενη φορά, αυτή δεν είχα FatalExecutionError. Υ.Γ.3 Απ' ότι θυμάμαι το VS 2013 δε μου είχε κάνει τίποτα τέτοιο. Υ.Γ.4 Δουλεύω 3+ μήνες σε αυτό το project.. Υ.Γ.5 Ενώ έτρεξα το installer του Update 3 που μου ζήτησε 11gb, στο Control Panel/Programs and Features συνεχίζει να μου δείχνει το Update 2 εγκατεστημένο.
Επισκέπτης Δημοσ. 3 Αυγούστου 2016 Δημοσ. 3 Αυγούστου 2016 Καταρχήν, το project σου δεν παθαίνει τίποτα αν έχει προβλήματα το Visual Studio. Στην τελική κάνεις compile με το χέρι. Παρόλα αυτά θεωρώ δεδομένο ότι παίρνεις backup, έτσι; Από ότι φαίνεται έχεις κάνει το σύστημα μουνί καπέλο. Το πώς ακριβώς το κατάφερες αυτό είναι ένα θέμα αλλά δεδομένου ότι είσαι αρχάριος δεν φαίνεται κι απίθανο. Τέλος πάντων, δεν ήρθε και το τέλος του κόσμου. Ξήλωσε το visual studio και στήστο από την αρχή. Και μην ξεχάσεις να κάνεις export τα settings. Τέλος, καλό θα ήταν να μην παίζεις παιχνίδια σε production μηχάνημα. Τουλάχιστον τρέξε ένα virtual machine.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα