vasiliis Δημοσ. 26 Δεκεμβρίου 2010 Δημοσ. 26 Δεκεμβρίου 2010 Μπορεί να μου πει κάποιος πως διαγράφεις μέλη απο μία struct;όχι να τα μηδενίσεις,να τα διαγράψεις.
Evgenios1 Δημοσ. 26 Δεκεμβρίου 2010 Δημοσ. 26 Δεκεμβρίου 2010 Μπορεί να μου πει κάποιος πως διαγράφεις μέλη απο μία struct;όχι να τα μηδενίσεις,να τα διαγράψεις. Οταν μηδενιζεις, στην ουσια αλλαζεις την τιμη που ειχε, αρα οτι ειχε διαγραφηκε. Αν απλα θες να μην υπαρχει αυτο καποιο μελος, τοτε απλα κανεις downcast. Πχ >typedef struct { int a,b,c,d; } str1; typedef struct { int a,b,c; } str2; int _tmain(int argc, _TCHAR* argv[]) { str1 s1 = {1,2,3,4}; str2 s2 = *((str2*) &s1); printf("%d %d %d",s2.a,s2.b,s2.c); return 0; } ***Αλλα πρεπει να ξερεις πως κουμπονει ο compiler τους structs στη μνημη
vasiliis Δημοσ. 26 Δεκεμβρίου 2010 Μέλος Δημοσ. 26 Δεκεμβρίου 2010 δεν κατάλαβα.έχω π.χ. αυτό: struct customer {char name[10]; char address[20]; }cust[2]; int main() { strcpy(cust[0].name,"vasilis"); strcpy(cust[0].address,"perikleous"); } πως το κάνω delete?
parsifal Δημοσ. 27 Δεκεμβρίου 2010 Δημοσ. 27 Δεκεμβρίου 2010 Να κάνεις delete ποιο ακριβώς; Ολόκληρο το struct που δήλωσες; Δε μπορείς, εφόσον δεν το έχεις δημιουργήσει με δυναμική δέσμευση μνήμης, δηλαδή μέσω malloc (ή new σε C++).
virxen75 Δημοσ. 27 Δεκεμβρίου 2010 Δημοσ. 27 Δεκεμβρίου 2010 αυτό εννοείς? > #include <stdio.h> #include <string.h> struct customer{ char name[10]; char address[20]; }cust[2]; int main(){ strcpy(cust[0].name,"vasilis"); strcpy(cust[0].address,"perikleous"); printf("\n name=%s ,address=%s",cust[0].name,cust[0].address); strcpy(cust[0].name,""); strcpy(cust[0].address,""); printf("\n name=%s ,address=%s",cust[0].name,cust[0].address); getchar(); return 0; }
vasiliis Δημοσ. 27 Δεκεμβρίου 2010 Μέλος Δημοσ. 27 Δεκεμβρίου 2010 αυτό μηδενίζει τις τιμές εγώ θέλω να διαγράφει τη μεταβλητή
V.I.Smirnov Δημοσ. 27 Δεκεμβρίου 2010 Δημοσ. 27 Δεκεμβρίου 2010 Xρόνια πολλά σε όλους ! Mια μεταβλητή διαγράφεται από την μνήμη αν είναι αυτόματη (automatic) χωρίς καμιά παρέμβαση. Στο παράδειγμα με την cust την ορίζεις ως καθολική σε compile time. Δεν μπορεί να διαγραφεί με τον τρόπο που έχεις κατά νου (δηλ. να την "ξε-ορίσεις") παρά μόνον αν την έχεις ορίσει δυναμικά (new, malloc,...) -
Directx Δημοσ. 27 Δεκεμβρίου 2010 Δημοσ. 27 Δεκεμβρίου 2010 Σε τέτοιου είδους περιπτώσεις μπορείς να δοκιμάσεις ένα κόλπο με το οποίο μετακινείς (memmove) τις εγγραφές (τα δεδομένα) που ακολουθούν στην θέση της εγγραφής που επιθυμείς να «διαγράψεις» κάνοντας την ουσιαστικά overwrite και εξαφανίζοντας τα δεδομένα αυτά από την δομή. Ταυτόχρονα φροντίζεις να μαρκάρεις (memmset) την τελευταία εγγραφή της δομής ως κενή (πχ. empty αν .ID == -1). Σε περίπτωση που έχεις δεσμεύσει δυναμικά την δομή σου αντί αυτού του μαρκαρίσματος θα μπορούσες να απελευθερώσεις το άχρηστο κομμάτι μνήμης όπως ήδη ελέχθη με την realloc κλπ. Το κόλπο αυτό θέλει προσοχή καθώς αν πρόκειται να διαγράψεις την τελευταία εγγραφή της δομής σου απλά χρησιμοποιείς την memmset καθώς δεν υπάρχουν άλλα δεδομένα προς μετακίνηση. Ακολουθεί ένα μικρό παράδειγμα σε C: > /* Move array records by directx. */ #include <stdio.h> #include <string.h> #include <stdlib.h> struct tagRecord { char Name[20]; int ID; }Record[10]; void _DumpRec(char*, struct tagRecord R[], const int Size); int main(void) { int RC; /* Fill struct array with data.. */ for(RC = 0; RC < 10; RC++) sprintf(Record[RC].Name, "Struct Name %d", (Record[RC].ID = RC)); /* Delete first entry. */ memmove(&Record, &Record[1], sizeof(Record) - (sizeof(Record[0]) * 1)); memset(&Record[9], -1, sizeof(Record[0])); _DumpRec("First entry delete", Record, 10); /* Delete middle entry. */ memmove(&Record[4], &Record[5], sizeof(Record) - (sizeof(Record[0]) * 5)); memset(&Record[9], -1, sizeof(Record[0])); _DumpRec("Middle entry delete", Record, 10); /* Delete last entry (plain memset!) */ memset(&Record[7], -1, sizeof(Record[0])); _DumpRec("Last Entry delete", Record, 10); printf("\nPress Enter to exit.."); getchar(); return 0; } void _DumpRec(char *ptrCaption, struct tagRecord ptrR[], const int Size) { /* Print array on STDOUT */ int RC; printf("\t%s\n", ptrCaption); for(RC = 0; RC < Size; RC++) if(ptrR[RC].ID != -1) /* Empty position? */ printf("[%.2d] Name : \"%s\" (ID = %d)\n", RC, ptrR[RC].Name, ptrR[RC].ID); else printf("[%.2d] Empty index\n"); } ΕΞΟΔΟΣ: > Record Array [00] Name : "Struct Name 0" (ID = 0) [01] Name : "Struct Name 1" (ID = 1) [02] Name : "Struct Name 2" (ID = 2) [03] Name : "Struct Name 3" (ID = 3) [04] Name : "Struct Name 4" (ID = 4) [05] Name : "Struct Name 5" (ID = 5) [06] Name : "Struct Name 6" (ID = 6) [07] Name : "Struct Name 7" (ID = 7) [08] Name : "Struct Name 8" (ID = 8) [09] Name : "Struct Name 9" (ID = 9) First entry delete [00] Name : "Struct Name 1" (ID = 1) [01] Name : "Struct Name 2" (ID = 2) [02] Name : "Struct Name 3" (ID = 3) [03] Name : "Struct Name 4" (ID = 4) [04] Name : "Struct Name 5" (ID = 5) [05] Name : "Struct Name 6" (ID = 6) [06] Name : "Struct Name 7" (ID = 7) [07] Name : "Struct Name 8" (ID = 8) [08] Name : "Struct Name 9" (ID = 9) [09] Empty index Middle entry delete [00] Name : "Struct Name 1" (ID = 1) [01] Name : "Struct Name 2" (ID = 2) [02] Name : "Struct Name 3" (ID = 3) [03] Name : "Struct Name 4" (ID = 4) [04] Name : "Struct Name 6" (ID = 6) [05] Name : "Struct Name 7" (ID = 7) [06] Name : "Struct Name 8" (ID = 8) [07] Name : "Struct Name 9" (ID = 9) [08] Empty index [09] Empty index Last Entry delete [00] Name : "Struct Name 1" (ID = 1) [01] Name : "Struct Name 2" (ID = 2) [02] Name : "Struct Name 3" (ID = 3) [03] Name : "Struct Name 4" (ID = 4) [04] Name : "Struct Name 6" (ID = 6) [05] Name : "Struct Name 7" (ID = 7) [06] Name : "Struct Name 8" (ID = 8) [07] Empty index [08] Empty index [09] Empty index Press Enter to exit.. Το πρόγραμμα έχει δοκιμασθεί επιτυχώς σε C++ Builder 2009 και μπορεί να περιέχει bugs ή άλλες αβλεψίες. Καλή συνέχεια!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.