παπι Δημοσ. 24 Οκτωβρίου 2013 Δημοσ. 24 Οκτωβρίου 2013 Κοιτα καλο ειναι να κοιταξεις λιγα πραματα για το debugging. Το ειπα και στην αρχη, αλλα με εγραψες. Ας πουμε εχουμε το χ project που πεταει αυτο Τι κανουμε; Παταμε το break, και αν δε μας πεταξει στο κωδικα μας (στο project μας) παμε στο call stack Εφοσον δεν μας πεταξε στο κωδικα μας τοτε θα μας πεταξε σε καποια lib/dll whateva. Πχ εκει που εχω βαλει Α ειναι c++ runtime. Δεν μας νοιαζει, παμε στο Β που ειναι το προγραμα μας (αρχιζει με program name.exe!function name ) Παμε απο πανω προς τα κατω μεχρι να μας πεταξει στο κωδικα μας και.... καρφι πανω στο "bug"
bnvdarklord Δημοσ. 24 Οκτωβρίου 2013 Μέλος Δημοσ. 24 Οκτωβρίου 2013 Εχω δει που χτυπάει. Αρχικά χωρις το delete[] criteria χτυπάει επειδή γινεται το πρόβλημα με το find που έλεγα. Μπαίνει μέσα στο if ενώ δεν πρέπει, και ετσι χρησιμοποιει τα σκουπίδια. Συγκεκριμένα if(lm.getHandle(arc.id, handle) != -1) // επιστρέφει 0, ενώ δεν υπάρχει. Αυτο συμβαίνει μετά απο αρκετές επαναλήψεις { cout << "Found label with id " << arc.id << " in the lm!" << endl; Label<float> oldLabelW = (*handle); // το handle ειανι σκουπίδια, εδώ χτυπάει Αν βάλω το delete[] criteria χτυπάει πολύ νωρίτερα, στο 1ο push μαλιστα στην queue. Βάζοντας ομως και το criteria = nullptr στον άλλο =operator οπως προτάθηκε παραπάνω, ξαναχτυπάει μεσα στο if.(γιατι χρειάζεται αυτο ομως ; ) (Τέλος τα δεδομένα που ειναι 450ΜΒ σε ενα rar πιάνουν μολις 29ΜΒ. Οπότε θα μπορούσα να στο στειλω με pm.)
παπι Δημοσ. 25 Οκτωβρίου 2013 Δημοσ. 25 Οκτωβρίου 2013 Το bug ειναι στο testAlgorithm Στη γραμμη lm.addHandle(destID, pq.push(destLabel)); υπαρχουν 2 containers pq κα lm, και σε αυτους βαζεις το ιδιο reference (ενα node του pq) μετα καλεις την pop (λιγο πιο κατω) στο pq, ομως δεν διαγραφεις το reference που εχει ο lm ετσι μπαινεις σε αυτη την if if(lm.getHandle(arc.id, handle) != -1) { cout << "Found label with id " << arc.id << " in the lm!" << endl; Label<float> oldLabelW = (*handle); if( LabelW > oldLabelW ) { LabelW = oldLabelW; } hadValue = true; } ομως ο lm σε αυτο το id εχει σκουπιδια (εχει το ref του pq που εκανες pop) και ετσι το προγραμμα σκαει στο copy (LabelW = oldLabelW) επειδη το old ειναι σκουπιδι
bnvdarklord Δημοσ. 25 Οκτωβρίου 2013 Μέλος Δημοσ. 25 Οκτωβρίου 2013 Σωστά δεν το χα σκεφτεί καθόλου, σ'ευχαριστώ πολυ. Οπότε, θα πρέπει στο map να κρατάω τα Labels μιας και θέλω να τα βλέπω ακομα και αν δεν ειναι στο queue, και λογικα θέλω και 2ο map για τα handles, για να μπορω να κανω decrease key. Λιγο υπερβολή μου φαινεται, αλλα δεν μπορω να σκεφτώ άλλο τρόπο.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα