Alithinos Δημοσ. 6 Αυγούστου 2015 Δημοσ. 6 Αυγούστου 2015 Στόχος είναι όταν τρέξει η εφαρμογή, να εμφανιστεί ένα χρονόμετρο 5 δευτερολέπτων το οποίο θα μετρά αντίστροφα και θα τυπώνει το νέο δευτερόλεπτο σε νέα γραμμή, μέχρι που αφού φτάσει το μηδέν, η οθόνη θα τυπώσει 'BOOM'. Τι κάνω λάθος ? Το IDE δε βγάζει κανένα error, αλλά το loop είναι infinite, γιατί ; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ασκηση_DateTime { class Program { static void Main(string[] args) { TimeSpan bomb = new TimeSpan(0 , 0 , 5); TimeSpan endOfTimer = new TimeSpan(0, 0, 0); Console.WriteLine(bomb); while (bomb > endOfTimer) { bomb.Add(new TimeSpan(0, 0, -1)); Console.WriteLine(bomb); if (bomb == endOfTimer) { Console.WriteLine("BOOM"); break; } } Console.ReadKey(); } } }
katrougalos Δημοσ. 6 Αυγούστου 2015 Δημοσ. 6 Αυγούστου 2015 Στις συγκρισεις που κανεις γιατι δεν χρησιμοποεις το built in compare που υπαρχει για αυτά τα objects? (Χωρίς να έχω καμία γνώση από C# απλά από εμπειρία στην Java συνήθως κατι τετοιές συγκρίσεις καλό είναι να γίνονται με τις παρεχόμενες μεθόδους).
CtrlFreak Δημοσ. 6 Αυγούστου 2015 Δημοσ. 6 Αυγούστου 2015 Αντί για bomb.add δοκίμασε bomb.subtrack εν τω μεταξύ αυτό που κάνεις στο bomb.Add(new TimeSpan(0, 0, -1)); είναι να αρχικοποιείς συνέχεια νέο timespan. Η μεταβλητή bomb είναι πάντα μικρότερη από το την endOfTimer 1
defacer Δημοσ. 6 Αυγούστου 2015 Δημοσ. 6 Αυγούστου 2015 Γιατί δεν κάνεις debugging? Αφού κάνεις infinite loop, μπες στο debugger να δεις τι συμβαίνει. Θα δεις ότι ή τιμή του bomb δεν αλλάζει. Μετά θα σκεφτείς μα γιατί αφού κάνω add και θα πας στο MSDN να δεις τι λέει για την add και θα δεις ότι αυτό που κάνει είναι να επιστρέφει νέο TimeSpan αντί να πειράζει αυτό που ήδη έχεις (BTW αυτό είναι αναμενόμενο γιατί το TS είναι struct και είθισται αυτά να είναι immutable). Αυτό που θέλεις είναι πχ (έτσι θα το έγραφα εγώ) bomb -= TimeSpan.FromSeconds(1); 3
MeTaXaS4 Δημοσ. 7 Αυγούστου 2015 Δημοσ. 7 Αυγούστου 2015 το πιο σημαντικό πριν ανοίξεις κάποιον thread είναι να δεις τι κάνει η κάθε μέθοδος που χρησιμοποιείς. ειδικά για c# η microsoft έχει πάρα πολύ υλικό στο msdn... 1
Επισκέπτης Δημοσ. 15 Αυγούστου 2015 Δημοσ. 15 Αυγούστου 2015 Μολονότι είμαι εντελώς άσχετος από C#, βλέπω αρκετά ζητηματάκια στον παραπάνω κώδικα: Γενικά, σε πρώτη φάση, θεωρώ ότι έχεις πάρει λαθος δρόμο και θα πρέπει αυτό που προσπαθείς να υλοποιηθεί με κάποιον άλλον, event - based τρόπο. Κοίτα για παράδειγμα τις κλάσσεις System.Threading.Timer και System.Timers. Παρακάτω κάνω μερικές επιμέρους παρατηρήσεις σε ό,τι έχεις κάνεις μέχρι στιγμή, έτσι, για πληρότητα, συνεχίζοντας όμως να θεωρώ ότι δεν θα δουλέψει (για διαφωνίες, σχόλια κ.λπ, είμαι ανοιχτός σε κουβέντα) α) Ουσιώδεις για τη λειτουργικότητα: 1) Δεν μετράς κάπου δευτερόλεπτα. Το ότι το TimeSpan αναπαριστά χρονικές περιόδους, δεν σημαίνει σε καμμία περίπτωση ότι κάθε μείωση/αύξησή του (μέσω του while) γίνεται ανά δευτερόλεπτο. Αντίθετα, όπως έχεις γράψει τον κώδικα, θεωρώ ότι η μείωσή του γίνεται ασύγχρονα, δηλαδή ακόμα κι αν δούλευε σωστά θα έβλεπες σε μερικά milliseconds να σου έχει γράψει 5 4 3 2 1 boom (αν κάνω κάπου λάθος διαφωτίστε με). 2) Αυτό που λέει ο defacer 2 posts πιο πάνω...κοινώς, το bomb μένει αμετάβλητο μετά το add και δημιουργείται νέο TimeSpan κάθε φορά. 3) Katrougalos στο 2ο post: Οι συγκρίσεις γίνονται με χρήση των built - in μεθόδων, όπου αυτές υπάρχουν. β) Μη ουσιώδεις για τη λειτουργικότητα 4) Το τελευταίο if θεωρώ ότι δεν χρειάζεται. Μόλις "σπάσει" το while, δηλαδή ο χρόνος πάψει να υπερβαίνει το 0, απλά τυπώνεις το boom (εκτός loop).
defacer Δημοσ. 15 Αυγούστου 2015 Δημοσ. 15 Αυγούστου 2015 Γενικά, σε πρώτη φάση, θεωρώ ότι έχεις πάρει λαθος δρόμο και θα πρέπει αυτό που προσπαθείς να υλοποιηθεί με κάποιον άλλον, event - based τρόπο. Κοίτα για παράδειγμα τις κλάσσεις System.Threading.Timer και System.Timers. Γενικά είσαι μέσα (αν και... "άσχετος" από C#?) αλλά εδώ νομίζω ξεφεύγεις. Στο συγκεκριμένο παράδειγμα γιατί να χρησιμοποιήσει κανείς timer (συν ο,τι αυτό συνεπάγεται) αντί έστω για ένα απλό Thread.Sleep? Σαφώς και με Thread.Sleep δε μπορείς να γράψεις πρόγραμμα που να κάνει κάτι περισσότερο, αλλά μπορεί απλά να θέλεις ένα countdown. Όλοι θα έλεγα έχουμε γράψει τέτοια trivial προγράμματα κάποτε. FWIW ανάμεσα σε System.Threading.Timer και System.Timers.Timer η "σωστή" επιλογή είναι System.Threading εκτός και αν χρειάζεσαι τα παραπάνω features του System.Timers.
Επισκέπτης Δημοσ. 16 Αυγούστου 2015 Δημοσ. 16 Αυγούστου 2015 Γενικά είσαι μέσα (αν και... "άσχετος" από C#?) αλλά εδώ νομίζω ξεφεύγεις. Στο συγκεκριμένο παράδειγμα γιατί να χρησιμοποιήσει κανείς timer (συν ο,τι αυτό συνεπάγεται) αντί έστω για ένα απλό Thread.Sleep? Σαφώς και με Thread.Sleep δε μπορείς να γράψεις πρόγραμμα που να κάνει κάτι περισσότερο, αλλά μπορεί απλά να θέλεις ένα countdown. Όλοι θα έλεγα έχουμε γράψει τέτοια trivial προγράμματα κάποτε. FWIW ανάμεσα σε System.Threading.Timer και System.Timers.Timer η "σωστή" επιλογή είναι System.Threading εκτός και αν χρειάζεσαι τα παραπάνω features του System.Timers. Προφανώς έχεις δίκιο Έκανα μόνο ένα γρήγορο ψάξιμο και επειδή απλά μου είχε κολλήσει ότι το TimeSpan είναι ο λάθος τρόπος, βρήκα το System.Threading.Timer. Είναι όντως overkill, αλλά για διδακτικούς λόγους καλό είναι να δει τις διαφορές με το TimeSpan
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα