imitheos Δημοσ. 22 Μαΐου 2013 Δημοσ. 22 Μαΐου 2013 Ο King στο βιβλιο του στην Σελ. 382 λεει πως άν δηλώσεις 2 δομές σε διαφορετικά σημεια του προγραμματος struct { int number; char name[NAME_LEN+1]; int on_hand; } part1 ; struct { int number; char name[NAME_LEN+1]; int on_hand; } part2 ; Οτι θα προκυψει θέμα και οτι "bloat" το προγραμμα , το να αλλαξεις το προγραμμα αργοτερα μπορει να ειναι ριψοκινδυνο (θα βγει ένα χέρι απο την οθονη και θα σε αρπαξει και θα σε χωσει στα αδυτα του λειτουργικου συστηματος εκει που κανει κουμαντο η fork και η exec !!! ) και οτι δεν ειναι σιγουρο πως οι δηλωσεις στις δομες θα μεινουν σταθερες.... τεσπα ποιο ειναι το προβλημα? Δεν εχω καταλαβει καλα. Καλά το εξηγεί πιστεύω. "Changing the program later will be risky, since we can't easily guarantee the declarations will remain consistent". Αν έχεις αυτές τις δηλώσεις σε δύο αρχεία θαμμένες μέσα σε 1000 άλλες γραμμές και σύνολο 30 αρχεία, μπορεί στο μέλλον να αλλάξεις την μία δήλωση και να προσθέσεις ένα μέλος στη δομή αλλά να ξεχάσεις να το προσθέσεις και στην άλλη. Αυτό φυσικά εκτός του ότι δεν κερδίζεις τίποτα με το να το ορίσεις δύο φορές. Αυτό που είναι επίσης σημαντικό είναι αυτό που λέει στην επόμενη πρότασή του. Όταν έχεις μια δήλωση "struct τάδε { }", το tag τάδε μπορούμε μπακάλικα να πούμε ότι είναι νέος τύπος. Έτσι όταν ορίζεις κάποιες μεταβλητές όπως οι part1 και part2, αυτές έχουν συμβατό τύπο. Όταν όμως τις ορίζεις έτσι χωρίς tag, τότε ενώ τα μέλη των δύο δομών είναι ακριβώς τα ίδια, οι δομές θεωρούνται διαφορετικές οπότε οι μεταβλητές δεν έχουν συμβατό τύπο. Αυτό το κομμάτι το είχαμε θίξει και στο παλιό νήμα των ερωτήσεων 1
Star_Light Δημοσ. 22 Μαΐου 2013 Δημοσ. 22 Μαΐου 2013 (επεξεργασμένο) Mπορεις να πεις οτι την ονοματίζεις και αρα αποκτά "υποσταση" και μετα μπορεις να χρησιμοποιήσεις αυτο το ονομα μαζι με το struct για να δηλώσεις νέες μεταβλητες δομης που θα ειναι συμβατες τουλαχιστον εγω ετσι το εχω καταλαβει. Αν την αφήσεις γενικά χωρις tag και δεν έχουν δηλωθει ταυτοχρονα οι δυο μεταβλητές τοτε δεν ειναι συμβατες και αρα δεν μπορεις να κάνεις αντιγραφη της μιας στην άλλη. Επεξ/σία 23 Μαΐου 2013 από Star_Light
Star_Light Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 struct part { int number; char name[NAME_LEN+1]; int on_hand; } ; Αυτο δεν δεσμεύει κάποιο χώρο στην μνήμη έτσι δεν ειναι? Εκτος και αν χρησιμοποιήσω το tag name μαζι με το struct για να δηλώσω κάποια μεταβλητή. Eπισης #include <stdio.h> #include <string.h> #define NAME_LEN 10 struct part { char name[NAME_LEN+1]; int number; int on_hand; } part1 = { 528 , 10}; int main(void) { struct part part1; printf(" : %s \n : %d \n : %d " , part1.name , part1.number , part1.on_hand); return 0; } Εγω παραλείπω το πρώτο μέλος αλλα δεν έχει τεθεί αυτοματα στο 0 οπως λέει η θεωρια.... μολις βαζω να εκτυπωθει μου πετάει UB αποτελέσματα. Με αλλα λογια δεν φαινεται να έχει γινει κενό το string name.
παπι Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 struct part { int number; char name[NAME_LEN+1]; int on_hand; } ; Αυτο δεν δεσμεύει κάποιο χώρο στην μνήμη έτσι δεν ειναι? Εκτος και αν χρησιμοποιήσω το tag name μαζι με το struct για να δηλώσω κάποια μεταβλητή. Eπισης #include <stdio.h> #include <string.h> #define NAME_LEN 10 struct part { char name[NAME_LEN+1]; int number; int on_hand; } part1 = { 528 , 10}; int main(void) { struct part part1; printf(" : %s \n : %d \n : %d " , part1.name , part1.number , part1.on_hand); return 0; } Εγω παραλείπω το πρώτο μέλος αλλα δεν έχει τεθεί αυτοματα στο 0 οπως λέει η θεωρια.... μολις βαζω να εκτυπωθει μου πετάει UB αποτελέσματα. Με αλλα λογια δεν φαινεται να έχει γινει κενό το string name. Το struct ως δηλωση; Οχι, δεν δεσμευει τπτ. Στο δευτερο δεν μπορω να καταλαβω τι θες να γινει... Εχεις ενα struct part μια global var part1 και μια local var part1....
Star_Light Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 Το struct ως δηλωση; Οχι, δεν δεσμευει τπτ. Στο δευτερο δεν μπορω να καταλαβω τι θες να γινει... Εχεις ενα struct part μια global var part1 και μια local var part1.... Ναι μια δηλωση δομης που δεν ακολουθείται απο λιστα μεταβλητών δεν δεσμεύει χωρο στην μνήμη το βρηκα στο βιβλιο των K&R τωρα.Δεν θελω να γινει κατι. Απλα ο King λέει : An initializer can have fewer members than the structure it's initializing; as with arrays , any "leftover" members are given 0 as their initial value. In particular , the bytes in a leftover character array will be zero ,making it represent the empty string Προσπαθησα εκουσια να φτιάξω έναν λειψο αρχικοποιητή ωστε να δω το κενο string που λεει αλλα μου βγάζει περιεργες τιμές.Μηπως έχεις ενα καλυτερο παράδειγμα για να μην χάνω χρονο με αυτο? απλα απο περιεργεια.
bird Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 struct part { int number; char name[NAME_LEN+1]; int on_hand; } ; Αυτο δεν δεσμεύει κάποιο χώρο στην μνήμη έτσι δεν ειναι? Εκτος και αν χρησιμοποιήσω το tag name μαζι με το struct για να δηλώσω κάποια μεταβλητή. Eπισης #include <stdio.h> #include <string.h> #define NAME_LEN 10 struct part { char name[NAME_LEN+1]; int number; int on_hand; } part1 = { 528 , 10}; int main(void) { struct part part1; printf(" : %s \n : %d \n : %d " , part1.name , part1.number , part1.on_hand); return 0; } Εγω παραλείπω το πρώτο μέλος αλλα δεν έχει τεθεί αυτοματα στο 0 οπως λέει η θεωρια.... μολις βαζω να εκτυπωθει μου πετάει UB αποτελέσματα. Με αλλα λογια δεν φαινεται να έχει γινει κενό το string name. Σου βγάζει ό,τι να'ναι η printf γιατί τυπώνει τα πεδια της part1 που έχεις ορίσει μέσα στην main κι όχι την global part1 που ορισες από έξω. Όπως λέει και το παπί, αν βάλεις σε σχόλιο τον μέσα στη main ορισμό, τυπώνει μια χαρά τιμες (της global part1)... edit: Γενικότερα αν έχεις μια global και μια τοπική μεταβλητή με το ίδιο όνομα, δε νομίζω οτι μπορείς να κάνεις access την global... Στη C++ υπάρχει αν θυμάμαι το :: αν θέλεις να προσπελάσεις την global μεταβλητή αλλά στη C δε υπάρχει. 1
Star_Light Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 Nαι. Σωστά. #include <stdio.h> #include <string.h> #define NAME_LEN 10 struct part { char name[NAME_LEN+1]; int number; int on_hand; } part1 = { 528 , 10}; int main(void) { printf(" : %s \n : %d \n : %d " , part1.name , part1.number , part1.on_hand); return 0; } Τωρα ειναι εντάξει : kostas@kostas-SSL:~/PROGRAMS$ ./TEST : : 0 : 0 kostas@kostas-SSL:~/PROGRAMS$ ./TEST : : 0 : 0 kostas@kostas-SSL:~/PROGRAMS$ Η part1 ειναι global. Δεν χρειάζεται να δηλωθεί κάποια άλλη μεταβλητή. Eπισης νομιζα λαθος οτι με το struct part part1; η local part1 στην main αρχικοποιείται κιολας με τις τιμές της global part1.
Star_Light Δημοσ. 28 Μαΐου 2013 Δημοσ. 28 Μαΐου 2013 struct person_name { char first[FIRST_NAME_LEN + 1 ]; char middle_initial; char last[LAST_NAME_LEN + 1 ]; }; struct student { struct person_name name; int id , age; } student1 , student2; Σε κάποιο σημειο διάβασα οτι αν ηταν να γράψουμε μια συνάρτηση που εμφανιζει το ονομα θα μπορουσαμε να την περάσουμε σαν ενα ορισμα μεσα σε μια συνάρτηση αντι για 3 ορισματα (λογικα εννοει τα 3 μελη της δομής οπως εχει δειξει και σε προηγουμενα παραδειγματα) display_name(student1.name); Δεν θα μπορούσαμε να καλέσουμε την συνάρτηση και έτσι display_name(name) ? Και εδω ενα ορισμα περνάω. Προς το παρον δηλαδη σαν χρησιμοτητα για ένθεση δομών μπορω να καταλαβω μονο το οτι μπορεις να αντιγράψεις μια δομή τύπου person_name πχ την new_name στο μέλος student1.name που ειναι απο μονο του μια δομη και που υπο αλλες συνθηκες δεν θα μπορουσε να γινει εφοσον δεν θα ειχαν οι 2 δομές συμβατο τύπο. struct person_name new_name = { .first="Kwstas" , .last="T" }; student1.name = name.first;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα