alexc Δημοσ. 19 Μαρτίου 2013 Δημοσ. 19 Μαρτίου 2013 Καλημέρα. Έχω μια ασκησούλα που θέλω να κάνω και σας περιγράφω τι περίπου σκοπέυω: Θέλω να δημιουργήσω κάτι περίπου σαν κατάλογο με ονόματα στα οποία αντιστοιχώ μια διευθνση και μια ηλικία. Θέλω να χειριστώ δυναμικά όλο το πρόγραμμα και αυτά που έχω κάνει είναι τα εξής: για την ηλικια το πρόβλημα λύνεται έυκολα με έναν int pointer στον οποίο δεσμέυω δυναμικά μνήμη ανά 5 ονόματα. Το πρόβλημα μου είναι στα ονόματα και τις διευθύνσεις. Σας παραθέτω τον κώδικα πρώτα main() { int *age,p=0; char *names,*address,onoma[20],die[20]; age=(int*)malloc(5*sizeof(int)); names=(char*)malloc(20); do { if (p%5==0 && p!=0) { realloc(age,5*sizeof(int)); if (age!=NULL) printf("\nMore memory assigned!\n\n"); } printf("Give me the %d number: \n",p+1); scanf("%d",&age[p]); printf("Give me the %d name:\n",p+1); gets(onoma); names[p]=malloc((strlen(onoma)+1)); strcpy(names[p],onoma); p++; } while (age[p-1]!=0); printf("BYE\n"); free(age); system("pause"); } Το πρόβλημα το έχω στην δήλωση των δυναμικών πινάκων για τα ονόματα και τις διευθύνσεις. Ουσιαστικα αυτές έχουν ως στοιχεία άλλες διευθύνσεις(συμβολοσειρές) και θέλω να τους αυξάνω κάθε φορά ανα πέντε ονόματα. Επίσης δεσμεύω δυναμικά όσο χώρο χρειάζονται ακριβώς το κάθε όνομα. Ευχαριστώ για οποιαδήποτε βοήθεια!
παπι Δημοσ. 19 Μαρτίου 2013 Δημοσ. 19 Μαρτίου 2013 http://en.wikipedia.org/wiki/Struct_(C_programming_language)
alexc Δημοσ. 19 Μαρτίου 2013 Μέλος Δημοσ. 19 Μαρτίου 2013 struct typos { char *a; } struct typos *names; names=malloc(20); Πάλι υπάρχει πρόβλημα... στην malloc τι type-casting θα κάνω???? Ουσιαστικα θέλω εναν δυναμικό πίνακα που περιέχει δείκτες.... Μήπως δεν είναι εφικτό κάτι τέτοιο??
imitheos Δημοσ. 19 Μαρτίου 2013 Δημοσ. 19 Μαρτίου 2013 struct mitsos { char name[50]; char addr[150]; int age; }; struct mitsos *katalogos; katalogos = malloc (200 * sizeof struct mitsos); Κατάλογος με 200 ονόματα. Αλλάζεις τα νούμερα σε τι μεγέθη θέλεις. Η malloc επιστρέφει δείκτη σε void οπότε δεν χρειάζεται casting.
alexc Δημοσ. 19 Μαρτίου 2013 Μέλος Δημοσ. 19 Μαρτίου 2013 Σε ευχαριστώ πολύ Ημιθεε!!!!! Δεν ήξερα οτι έχω αυτήν την δυνατότητα sizeof struct !!!
migf1 Δημοσ. 19 Μαρτίου 2013 Δημοσ. 19 Μαρτίου 2013 Καλησπέρα, άσχετο με την αρχική σου ερώτηση, αλλά καλό είναι να ελέγχεις πιθανή αποτυχία της realloc και να το κάνεις assign στον age μονάχα αν πετύχει η realloc. Αλλιώς δημιουργείς από memory leaks έως crashes. Επίσης, καλό είναι να χρησιμοποιείς την fgets() αντί της καταργημένης gets() η οποία σε αφήνει ανυπεράσπιστο στο bad input. 1
alexc Δημοσ. 19 Μαρτίου 2013 Μέλος Δημοσ. 19 Μαρτίου 2013 Σε ευχαριστώ πολύ για τις συμβουλές σου Το αρχικό μου πρόβλημα όμως παραμένει..
bird Δημοσ. 19 Μαρτίου 2013 Δημοσ. 19 Μαρτίου 2013 Γιατί δεν κάνεις τα names και address pointer σε pointer; ... char **names, **address; ... names = (char**)malloc(20); ... // μέσα στο loop names[p] = (char*)malloc((strlen(onoma)+1)); ... Και αντίστοιχα για το address...
migf1 Δημοσ. 20 Μαρτίου 2013 Δημοσ. 20 Μαρτίου 2013 Σε ευχαριστώ πολύ για τις συμβουλές σου Το αρχικό μου πρόβλημα όμως παραμένει.. Παρακαλώ! Γιατί όμως παραμένει το αρχικό σου πρόβλημα; Η λύση που σου πρότεινε ο imitheos δεν σε βόλεψε; Αν όχι, οι εναλλακτικές είναι περισσότερο πολύπλοκες. Ιδιαίτερα εκείνη που σου πρότεινε ο bird, είναι αυτό που κατάλαβα κι εγώ διαβάζοντας το αρχικό σου μήνυμα, όταν έγραφες πως θέλεις να διαχειρίζεσαι τα πάντα δυναμικά. Μετά όμως στον κώδικα που έδωσες όριζες π.χ. το onoma στατικά ως πίνακα 19+1 χαρακτήρων. Οπότε, αν πρόκειται να τα ορίζεις στατικά τα strings σου, τότε η υλοποίηση με έναν δυναμικό πίνακα από struct είναι η πιο βατή.
alexc Δημοσ. 21 Μαρτίου 2013 Μέλος Δημοσ. 21 Μαρτίου 2013 Ενταξει το έλυσα ΕΠΙΤΕΛΟΥΣ με τον τρόπο του ημίθεου.. Τα έκανα με struct που ουσιαστικά είναι δείκτης σε δείκτη με πιο κομψό τρόπο! Ευχαριστώ πολύ για την βοήθεια!!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα