Dinos_12345 Δημοσ. 6 Ιουνίου 2016 Δημοσ. 6 Ιουνίου 2016 (επεξεργασμένο) Καλησπέρα σε όλους και πάλι. Ο καθηγητής στις δομές δεδομένων έδωσε κώδικα, που δεν έχει τεσταριστεί. Δεν δουλεύει με τίποτα. Ο κώδικας αφορά τα δυαδικά δένδρα αναζήτησης, συγκεκριμένα τις Insert και Search συναρτήσεις αυτών. Το παρακάτω το κάνω include σε άλλο αρχείο με μία κενή main. Παραθέτω και screenshot με τα σφάλματα struct node{ int ID; float Datum; struct node *left; struct node *right; }; int insert(struct node NN, struct node **R){ struct node *cur,*F=0; cur=search(*R,NN.ID,&F); if (cur) return 0; cur=(struct node *)malloc(sizeof NN); cur->right=cur->left=NULL; *cur=NN; if(F==NULL) *R=cur; else if (F->ID > cur->ID) F->left=cur; else F->right=cur; return 1; } struct node *search(struct node *R, int elem, struct node **father){ if (R==NULL) return NULL; *father=R; if(R->ID==elem) return R; if(R->ID > elem) return search(R->left, elem, &father); else return search(R->right, elem, &father); } //old topic Καλησπέρα σε όλους. Έχω κολλήσει σε ένα σημείο σε ένα "μεγάλο" πρότζεκτ. Έχω μία συνάρτηση Menu, που περιέχει μία λίστα τύπου example*. Έχω ακόμα μία SubMenu που δέχεται pointer στην ίδια λίστα και δύο choices της Submenu που δέχονται διπλό pointer στην λίστα αυτή. Θέλω να δίνω στο χρήστη την επιλογή να φτιάχνει, όσα αντικείμενα τύπου παιδιών της example αλλά και example, θέλει. Ο τρόπος που το σκέφτομαι να το κάνω είναι να κάνω αυτό στο τελευταίο submenu(κάποια choice). example* ptr = new example(x,y,z,w); και μετά να κάνω αυτό. list_example.push_back (ptr); Μέχρι εδώ καλά. Το πρόβλημα μου είναι πως όταν η συνάρτηση Choice τελειώσει, θα διαγράψει όλες τις local μεταβλητές. Δηλαδή θα διαγράψει τον pointer που έχω μέσα το instance της κλάσης example. Αυτός ο pointer, έχει σωθεί μέσα στη λίστα ή μέσα στη λίστα θα υπάρχει πλέον ένας pointer που δείχνει στο πουθενά; Ευχαριστώ. Επεξ/σία 7 Ιουνίου 2016 από Dinos_12345
Moderators Kercyn Δημοσ. 6 Ιουνίου 2016 Moderators Δημοσ. 6 Ιουνίου 2016 Στη λίστα σου έχεις σώσει τον pointer που δείχνει στο αντικείμενό σου. Το αντικείμενο δεν έχει λόγο να φύγει άμα δεν το κάνεις free εσύ.
Dinos_12345 Δημοσ. 6 Ιουνίου 2016 Μέλος Δημοσ. 6 Ιουνίου 2016 Στη λίστα σου έχεις σώσει τον pointer που δείχνει στο αντικείμενό σου. Το αντικείμενο δεν έχει λόγο να φύγει άμα δεν το κάνεις free εσύ. Άρα ο ptr περνάει σαν αντίγραφο στη λίστα μου, διαγράφεται ο original και μένει το αντίγραφο στη λίστα; Όταν τελειώσει η συνάρτηση το αντικείμενο γιατί δεν φεύγει αφού είναι local; Αυτός είναι και ο κώδικας μου, αν θες ρίξε μια ματιά void Sub1_Choice1(list<TaxDeclaration*>** li){ curs_set(1); echo(); char name[51], address[51], afm[9], supervisor[51], year[5], income[17], costs[17]; int year_; double income_,costs_; //... year_ = atoi(year); income_ = atof(income); costs_ = atof(costs); CorporateTaxDeclaration* ptr = new CorporateTaxDeclaration(name, address, afm, year_, income_, costs_, supervisor); (**li).push_back(ptr); }
socket Δημοσ. 6 Ιουνίου 2016 Δημοσ. 6 Ιουνίου 2016 Το αντικείμενο δεν είναι static. Έχει δεσμευθεί με new, δεν βρίσκεται στη stack αλλά στο free store. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα