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

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

Δημοσ. (επεξεργασμένο)

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

Ο κώδικας αφορά τα δυαδικά δένδρα αναζήτησης, συγκεκριμένα τις 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 που δείχνει στο πουθενά;

Ευχαριστώ.

 

 

post-335185-0-88460900-1465303746_thumb.png

Επεξ/σία από Dinos_12345
  • Moderators
Δημοσ.

Στη λίστα σου έχεις σώσει τον pointer που δείχνει στο αντικείμενό σου. Το αντικείμενο δεν έχει λόγο να φύγει άμα δεν το κάνεις free εσύ.

Δημοσ.

Στη λίστα σου έχεις σώσει τον 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);
}

Δημοσ.

Το αντικείμενο δεν είναι static. Έχει δεσμευθεί με new, δεν βρίσκεται στη stack αλλά στο free store.

  • Like 1

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

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

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

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

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

Σύνδεση

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

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