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

διαγραφη μελων απο struct


vasiliis

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

Δημοσ.

Μπορεί να μου πει κάποιος πως διαγράφεις μέλη απο μία 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 στη μνημη

Δημοσ.

δεν κατάλαβα.έχω π.χ. αυτό:

 

struct customer

{char name[10];

char address[20];

}cust[2];

 

int main()

{

strcpy(cust[0].name,"vasilis");

strcpy(cust[0].address,"perikleous");

}

 

πως το κάνω delete?

Δημοσ.

Να κάνεις delete ποιο ακριβώς; Ολόκληρο το struct που δήλωσες; Δε μπορείς, εφόσον δεν το έχεις δημιουργήσει με δυναμική δέσμευση μνήμης, δηλαδή μέσω malloc (ή new σε C++).

Δημοσ.

αυτό εννοείς?

 

>
#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;
}


Δημοσ.

Xρόνια πολλά σε όλους !

 

Mια μεταβλητή διαγράφεται από την μνήμη αν είναι αυτόματη (automatic) χωρίς καμιά παρέμβαση.

Στο παράδειγμα με την cust την ορίζεις ως καθολική σε compile time.

 

Δεν μπορεί να διαγραφεί με τον τρόπο που έχεις κατά νου (δηλ. να την "ξε-ορίσεις") παρά μόνον αν την έχεις ορίσει δυναμικά (new, malloc,...)

 

-

Δημοσ.

Σε τέτοιου είδους περιπτώσεις μπορείς να δοκιμάσεις ένα κόλπο με το οποίο μετακινείς (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 ή άλλες αβλεψίες.

 

Καλή συνέχεια!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...