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

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

Δημοσ.

Κοιτα καλο ειναι να κοιταξεις λιγα πραματα για το debugging. Το ειπα και στην αρχη, αλλα με εγραψες.

Ας πουμε εχουμε το χ project που πεταει αυτο

post-216584-0-07105000-1382620150_thumb.png

Τι κανουμε; Παταμε το break, και αν δε μας πεταξει στο κωδικα μας (στο project μας) παμε στο call stack

post-216584-0-93786500-1382620158_thumb.png

Εφοσον δεν μας πεταξε στο κωδικα μας τοτε θα μας πεταξε σε καποια lib/dll whateva. Πχ εκει που εχω βαλει Α ειναι c++ runtime. Δεν μας νοιαζει, παμε στο Β που ειναι το προγραμα μας (αρχιζει με program name.exe!function name )

Παμε απο πανω προς τα κατω μεχρι να μας πεταξει στο κωδικα μας

post-216584-0-58215700-1382620175_thumb.png

 

και.... καρφι πανω στο "bug"

Δημοσ.

Εχω δει που χτυπάει.

 

Αρχικά χωρις το 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.)

Δημοσ.

Το 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 ειναι σκουπιδι

Δημοσ.

Σωστά δεν το χα σκεφτεί καθόλου, σ'ευχαριστώ πολυ.

 

Οπότε, θα πρέπει στο map να κρατάω τα Labels μιας και θέλω να τα βλέπω ακομα και αν δεν ειναι στο queue, και λογικα θέλω και 2ο map για τα handles, για να μπορω να κανω decrease key. Λιγο υπερβολή μου φαινεται, αλλα δεν μπορω να σκεφτώ άλλο τρόπο.

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...