Δυναμικό array από structs

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
martkonsta
Honorary Member
Δημοσιεύσεις: 579
Εγγραφή: 23 Σεπ 2006 11:54
Τοποθεσία: Βέροια,Βόλος
Επικοινωνία:

Δυναμικό array από structs

Δημοσίευση από martkonsta » 29 Δεκ 2013 17:59

Έχω μια άσκηση η οποία ζητάει να δημιουργηθει δυναμικά ένας πίνακας από struct με αρχικό μέγεθος 1,να γεμίζουν τα στοιχεία(το ενα στην φάση που είμαι,το οποίο είναι char*) και όταν γεμίσει ο πίνακας να δεσμεύουμε διπλάσιο χώρο γι αυτόν.
Αντιμετωπίζω πρόβλημα όμως με το πως θα γίνεται η πρόσβαση στα επιμέρους στοιχεία του array.Αν μπορείτε να με βοηθήσετε θα ήμουν υπόχρεος.

Κώδικας: Επιλογή όλων

nameInfoT *readNames()
{
	//orismos metavlitwn
	nameInfoT *file_array_ptr;
	char buffer[MAX_NAME_LEN],formatstr[15];
	int loopCounter = 0,i,sizeOfStruct;
        //dimiourgia tou format string
	sprintf(formatstr, "%%%ds",MAX_NAME_LEN);
        //euresi tou arxikou megethous tou struct
	sizeOfStruct = (int) sizeof(nameInfoT);
        //dinoume xwro oso to megethos tou struct
	file_array_ptr = (nameInfoT *) malloc(sizeOfStruct);
	if(file_array_ptr == NULL)
	{
		printf("Memory allocation problem\n");
		return NULL;
	}
	while(1)
	{
		scanf(formatstr, buffer);
		if(!strcmp(buffer, "END"))
		{
			break;
		}else
		{
			file_array_ptr[loopCounter-1].name=strdup(buffer);
			loopCounter++;
			if((file_array_ptr+loopCounter*sizeof(nameInfoT))->name == NULL)
			{
				printf("Memory allocation problem for names\n");
				return NULL; 
			}
		}
		if(sizeOfStruct/loopCounter == sizeof(nameInfoT))
		{
			sizeOfStruct = sizeOfStruct * 2;
			realloc(file_array_ptr, sizeOfStruct);
		}
	}
return file_array_ptr;
}
Επίσης ποιο ανάμεσα σε αυτά τα 2 πρέπει να χρησιμοποιώ;

Κώδικας: Επιλογή όλων

(file_array_ptr+loopCounter*sizeof(nameInfoT))->name
file_array_ptr[loopCounter-1].name
Εικόνα

Άβαταρ μέλους
martkonsta
Honorary Member
Δημοσιεύσεις: 579
Εγγραφή: 23 Σεπ 2006 11:54
Τοποθεσία: Βέροια,Βόλος
Επικοινωνία:

Δυναμικό array από structs

Δημοσίευση από martkonsta » 30 Δεκ 2013 03:40

Παρα τα πολλά λάθη που έχει ο παραπάνω κώδικας,κατάφερα να λύσω το πρόβλημά μου.Συγγνωμη για την όποια ταλαιπωρία
Εικόνα

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27647
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Δυναμικό array από structs

Δημοσίευση από cordis » 30 Δεκ 2013 11:04

Βαλε μας και το σωστό εδώ :)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
martkonsta
Honorary Member
Δημοσιεύσεις: 579
Εγγραφή: 23 Σεπ 2006 11:54
Τοποθεσία: Βέροια,Βόλος
Επικοινωνία:

Δυναμικό array από structs

Δημοσίευση από martkonsta » 31 Δεκ 2013 01:41

Κώδικας: Επιλογή όλων

	//orismos metavlitwn
	nameInfoT *file_array_ptr;
	char buffer[MAX_NAME_LEN],formatstr[15];
	int loopCounter = 0,sizeOfStruct;
	sprintf(formatstr, "%%%ds",MAX_NAME_LEN);
	sizeOfStruct = (int) sizeof(nameInfoT);
	file_array_ptr = (nameInfoT *) calloc(1, sizeOfStruct);
	if(file_array_ptr == NULL) //an yparxei provlima me to allocation enimerwnoume to xristi kai epistrefoume stin main
	{
		printf("Memory allocation problem\n");
		return NULL;
	}
	while(1) 
	{
		scanf(formatstr, buffer);
		if(!strcmp(buffer, "END")) //an o xristis exei eisagei END vgainoume apo to loop
		{
			break;
		}else
		{
			if(loopCounter) //fix gia na min prospathisei na diairesei me to miden sto prwto loop
			{
				if(sizeOfStruct/loopCounter == sizeof(nameInfoT)) //an to siggekrimeno megethos dia to plithos twn epanalipsewn einai 16 simainei pws vriskomaste sto teleutaio keli tou pinaka
				{
					sizeOfStruct = sizeOfStruct * 2; //diplasiazoume to megethos
					file_array_ptr = (nameInfoT *)realloc(file_array_ptr, sizeOfStruct); //kai kanoume reallocate
				}
			}
			file_array_ptr[loopCounter].name = strdup(buffer); //antigrafoume to periexomeno tou buffer sto keli pou vriskomaste stin parametro name
			if(file_array_ptr[loopCounter].name == NULL) //elegxos an den exei ginei swsti apodosi mnimis
			{
				printf("Memory allocation problem for names\n");
				return NULL; 
			}
			loopCounter++; //auxisi tou metriti
		}
	}
	//prosarmogi tou megethous tou pinaka wste na tairiazei me to plithos twn stoixeiwn se auton
	file_array_ptr = (nameInfoT *) realloc(file_array_ptr,loopCounter*sizeof(nameInfoT));
	return file_array_ptr;
Εικόνα

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης