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

Γενικό thread αποριών για τη C#.


Alithinos

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

@alithinos

 

3) Κάντο όπως σε βολεύει για να είναι ευχάριστο, απλά έχε υπόψη να εξυπηρετείς και τους δυο τομείς. Μη κάνεις δυο βδομάδες μόνο το ένα ή το άλλο.

 

4) https://en.wikipedia.org/wiki/Rubber_duck_debugging

 

6) Υπάρχει στάνταρ προτεινόμενος τρόπος όπως λέει ο elorant, με τον οποίο το μεγαλύτερο μέρος της δουλειάς γίνεται behind the scenes χωρίς να ασχοληθείς. Βεβαίως υπάρχουν και καστομιές, το έτοιμο δε βολεύει σε κάποιες περιπτώσεις. Αλλά μάθε πρώτα να χρησιμοποιείς το στάνταρ και αν και όταν βρεθείς σε κατάσταση που δε σε εξυπηρετεί θα έχεις μια καλύτερη αντίληψη της κατάστασης για να την αντιμετωπίσεις.

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

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

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

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

Δημοσιευμένες Εικόνες

@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.

:blink:

 

Εν το μεταξύ, αν αρχικοποιήσω ένα αντικείμενο 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 που το αποδεικνίουν, δεν είμαι τρελός! 

 

 

Τι στο καλό συνέβει ;  :huh:

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

Το τοπικό αντικείμενο που αρχικοποιείται με το argument DateTime.Now είναι null.

 

Δεν υπάρχει περίπτωση να είναι null επειδή η Now επιστρέφει DateTime και το DateTime είναι value type. Ίσως εννοείς είναι "μηδενικό";

 

Αυτό που πρέπει να κάνεις είναι απλά να μπεις στο debugger και να δεις ακριβώς ποια τιμή έχει η local, και ανάλογα την απάντηση αποφασίζεις για το επόμενο βήμα. Πάντως επειδή select isn't broken είναι πρακτικά σίγουρο ότι εσύ έχεις κάνει κάπου κάπως κάποια αλλαγή που οδηγεί στο περίεργο αποτέλεσμα.

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

Επισκέπτης

@Alithinos

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

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

@defacer:

 

Με DateTime.Now καταλήγει στην έξοδο η μέρα να είναι 0, ο μήνας null, και το έτος 0.

Αν και κατά την είσοδο, φαίνεται η ημερομηνία.

Ωστόσο με DateTime αρχικοποιημένο με τον άλλο τρόπο όπως έδειξα, ότι εισάγεται,

εξάγεται ακριβώς.

Το ζήτημα είναι ότι δεν πείραξα τίποτα στη μέθοδο αυτή που είναι υπεύθυνη για αυτό.

Και η συμπεριφορά μου φαίνεται παράλογη.

Αυτό που φοβάμαι είναι πως φταίει το coupling, και συνέβει το φαινόμενο της πεταλούδας.

 

@elorant: Δεν κατηγόρησα κανέναν, περιέγραψα το συμβάν.

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

Εξακολουθεί να είναι παράλογο. Σε τι σύστημα τα τρέχεις αυτά;

 

Επίσης, αφού τα έχεις στο git γιατί δεν πας λίγο πίσω στο χρόνο να δεις αν τότε δούλευε; Και αν πριν δούλευε θα είναι εύκολο να βρεις πότε χάλασε και κατ' επέκταση γιατί.

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

Τι εννοεις με το coupling; 

Εννοώ όταν έχεις sub-modules που εξαρτούνται από άλλα, ή κλάσεις που εξαρτούνται από άλλες...

Υπάρχει η περίπτωση να αλλάξεις κάτι σε ένα σημείο ενός Α στοιχείου, και αυτό να επιδράσει με

απρόσμενες συνέπειες κάπου αλλού, γιατί τα στοιχεία Α,Β,Γ... είναι 'δεμένα' μεταξύ τους, επικοινωνούν

το ένα με το άλλο.

 

Έστω ότι έχεις μια μέθοδο Kati(), μέσα στην οποία καλούνται μέθοδοι από άλλες κλάσεις, ακόμα και

από άλλα assemblies. Και χωρίς να ανοίξεις τη μέθοδο Kati() και να πειράξεις κάτι μέσα της, επειδή

άλλαξες κάτι κάπου αλλού, η μέθοδος να αλλάξει συμπεριφορά εκεί που δε το περίμενες.

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

Εννοώ όταν έχεις sub-modules που εξαρτούνται από άλλα, ή κλάσεις που εξαρτούνται από άλλες...

Υπάρχει η περίπτωση να αλλάξεις κάτι σε ένα σημείο ενός Α στοιχείου, και αυτό να επιδράσει με

απρόσμενες συνέπειες κάπου αλλού, γιατί τα στοιχεία Α,Β,Γ... είναι 'δεμένα' μεταξύ τους, επικοινωνούν

το ένα με το άλλο.

 

Έστω ότι έχεις μια μέθοδο Kati(), μέσα στην οποία καλούνται μέθοδοι από άλλες κλάσεις, ακόμα και

από άλλα assemblies. Και χωρίς να ανοίξεις τη μέθοδο Kati() και να πειράξεις κάτι μέσα της, επειδή

άλλαξες κάτι κάπου αλλού, η μέθοδος να αλλάξει συμπεριφορά εκεί που δε το περίμενες.

 

 

Το DateTime currentDate = DateTime.Now; 

ομως δεν εξαρταται απο κανενα submodule η αλλη κλαση η whatever.

 

O μονος τροπος που μπορω να σκεφτω να γινεται null στην πορεια ( εκτως αμα το εχεις θεσει σαν DateTime?, και το περνας σε καμια αλλη κλαση που το nullarei), ειναι να κανεις corrupt την μνημη καλωντας κανενα c++ dll και γεμιζοντας buffer δηλωνοντας λαθος μεγεθος, αλλα και παλι θα σε πετουσε memory corruption error. 

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

Εξακολουθεί να είναι παράλογο. Σε τι σύστημα τα τρέχεις αυτά;

 

Επίσης, αφού τα έχεις στο 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.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Σύστημα ; Το 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 απο την αρχη και τσεκαρε αμα αυτο λυσει το προβλημα. 

Και την επομενη φορα οταν περιγραφεις ενα παρομοιο προβλημα μαλλον θα θελεις να ξεκινησεις απο το πιο σημαντικο στοιχειο :P

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

Επισκέπτης

Πριν κάνεις αυτό που λέει ο Papakaliati πήγαινε στο μενού Build και επέλεξε Clean Solution και μετά Rebuild. Δες αν αυτό διορθώνει το πρόβλημα.

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

Πριν κάνεις αυτό που λέει ο Papakaliati πήγαινε στο μενού Build και επέλεξε Clean Solution και μετά Rebuild. Δες αν αυτό διορθώνει το πρόβλημα.

Αυτό ήταν! Με το Clean Solution έφτιαξε!  :-)

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

  • 4 εβδομάδες αργότερα...

Το έκανε ξανά.  :(

 

Έκλεισα το VS με όλα να δουλεύουν μια χαρά, και την επόμενη φορά που το άνοιξα ξανά πέταγε errors από το πουθενά.

Και αυτή τη φορά το Clean Solution δεν κάνει τίποτα.

 

Εμφανίστηκε και το παλιό πρόβλημα με το DateTime.Now, και επίσης μου πετά NullReferenceException εκεί που δεν πρέπει. Αφού το αντικείμενο δηλώνεται, ορίζεται, και αρχικοποιείται με constructor, δεν θα έπρεπε να υφίσταται NullReference, και δεν υπήρχε πριν τη μαγική στιγμή που εμφανίστηκε από το πουθενά χωρίς να πειράξω τίποτα στο σχετικό κομμάτι κώδικα.

 

Να κάνω update στο Update 3 και να βάλω στο σημερινό patch: το δοκίμασα.

Να κάνω Clean Solution τα πάντα και ξανά build: το δοκίμασα.

 

 

Ακόμα και η αρχική οθόνη του VS χάλασε! Από κει που πάντα κάτω από το "Recent" που δείχνει τα πρόσφατα projects στην αριστερά πλευρά της, είχε ταξινομημένα τα πιο πρόσφατα projects ξεκινώντας από πάνω προς τα κάτω με το πιο πρόσφατο, τώρα που το άνοιξα ξανά δε μου δείχνει αυτό που έκλεισα τελευταίο, αλλά κάποιο άλλο!  :o  :(

 

 

Υ.Γ. Δεν ξέρω αν σχετίζεται αλλά αυτό έγινε αφού πρώτα εγκατέστησα το παιχνίδι 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 εγκατεστημένο.

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

Καταρχήν, το project σου δεν παθαίνει τίποτα αν έχει προβλήματα το Visual Studio. Στην τελική κάνεις compile με το χέρι. Παρόλα αυτά θεωρώ δεδομένο ότι παίρνεις backup, έτσι;

 

Από ότι φαίνεται έχεις κάνει το σύστημα μουνί καπέλο. Το πώς ακριβώς το κατάφερες αυτό είναι ένα θέμα αλλά δεδομένου ότι είσαι αρχάριος δεν φαίνεται κι απίθανο. Τέλος πάντων, δεν ήρθε και το τέλος του κόσμου. Ξήλωσε το visual studio και στήστο από την αρχή. Και μην ξεχάσεις να κάνεις export τα settings.

 

Τέλος, καλό θα ήταν να μην παίζεις παιχνίδια σε production μηχάνημα. Τουλάχιστον τρέξε ένα virtual machine.

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

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

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

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

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

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

Σύνδεση

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

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

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