kfoynt Δημοσ. 14 Ιουλίου 2010 Δημοσ. 14 Ιουλίου 2010 Καλησπέρα και πάλι Έχω ένα αρχείο Pb.h στο οποίο έχω ορίσει μία μεταβλητή: static Pb* pb_static_instance; (Pb ειναι μία structure) Έχω και ένα άλλο αρχείο interface.c το οποιο κάνει include το Pb.h και χειρίζεται την μεταβλητή pb_static_instance. Όλα καλά μέχρι εδώ κανένα πρόβλημα... Υπάρχει όμως και ένα άλλο αρχέιο το mtxFreeIPM.c το οποίο επίσης κάνει include to Pb.h, και στο οποίο προσπαθώ να διαβάσω τις αλλαγές που έγιναν στην pb_static_instance μέσω του interface.c. Όταν πάω να διαβάσω την static μεταβλητή απο το mtxFreeIPM.c τότε μου πετάει segmentation fault καμία ιδεα?? προσπαθώ αρκετή ώρα αλλα δεν βγαινει τίποτα! ---------- Προσθήκη στις 22:06 ---------- Προηγούμενο μήνυμα στις 21:58 ---------- PS: έκανα print μέσω του debugger στην μεταβλητή pb_static_instance όταν ήμουν στο mtxFreeIPM.c και μου δείχνει ότι έχει γινει initialized ως NULL!! Γιατί όμως? αφου πιο πριν μέσα στο interface.c μπορώ και την κάνω initialize ως: pb_static_instance = VECT(Pb, 1); και μετά μπορώ να την χειρίζομαι κανονικα, τα print statements που δοκίμασα μου δειχνουν τις σωστές τιμές...
pinball_elf Δημοσ. 14 Ιουλίου 2010 Δημοσ. 14 Ιουλίου 2010 Μία static μεταβλητή στη C περιορίζεται όσον αφορά την χρήση της στο αρχείο που έιναι δηλωμένη. Συνήθως δεν ορίζουμε μια μεταβλητή ως static σε ένα header file, όχι επειδή δεν επιτρέπεται άλλα επειδή δεν χρησιμέυει σε τίποτα. Γιατί δηλώνοντας μια μεταβλητή ως static σε ένα header file, τότε σε κάθε αρχείο (.c) κώδικα που το κάνει include, δημιουργείται και μία νέα μοναδική κόπια της static μεταβλητής για χρήση και μόνο εσωτερικά στο εκάστοτε αρχείο. Οπότε στην δική σου περίπτωση στο δέυτερο αρχείο η μεταβλητή pb_static_instance δεν έχει αρχικοποιηθεί ποτέ!
kfoynt Δημοσ. 14 Ιουλίου 2010 Μέλος Δημοσ. 14 Ιουλίου 2010 Μία static μεταβλητή στη C περιορίζεται όσον αφορά την χρήση της στο αρχείο που έιναι δηλωμένη. Συνήθως δεν ορίζουμε μια μεταβλητή ως static σε ένα header file, όχι επειδή δεν επιτρέπεται άλλα επειδή δεν χρησιμέυει σε τίποτα. Γιατί δηλώνοντας μια μεταβλητή ως static σε ένα header file, τότε σε κάθε αρχείο (.c) κώδικα που το κάνει include, δημιουργείται και μία νέα μοναδική κόπια της static μεταβλητής για χρήση και μόνο εσωτερικά στο εκάστοτε αρχείο. Οπότε στην δική σου περίπτωση στο δέυτερο αρχείο η μεταβλητή pb_static_instanc δεν έχει αρχικοποιηθεί ποτέ! οκ... χαίρομαι για αυτό που διαβάζω... και το συνειδητοποίησα και απο το debug... Αλλά γίνεται τελικά να έχω μία μεταβλητη στο πρόγραμμα που θα χρησιμοποιείται απο διάφορα αρχεία?? Δοκίμασα και global μεταβλητές δηλωμένες εκτός main αλλα πάλι το ίδιο πρόβλημα.. εκτός αν κάτι δεν έκανα καλα...
V.I.Smirnov Δημοσ. 14 Ιουλίου 2010 Δημοσ. 14 Ιουλίου 2010 Καλησπέρα και πάλι ... προσπαθώ να διαβάσω τις αλλαγές που έγιναν στην pb_static_instance μέσω του interface.c Αυτό δεν είναι σαφές. Ούτε είναι σαφές πώς θέλεις να χρησιμοποιήσεις την μεταβλητή : ως global ή ως static global ; Θυμάμαι ότι δηλώνοντας static μια global μεταβλητή η εμβέλειά της περιορίζεται στο αρχείο που την δηλώνεις. Εδώ είναι το σφάλμα. Eκείνο που καταλαβαίνω είναι ότι την δηλώνεις στο include (και δεν είναι μέλος κλάσης). Mετά την αρχικοποιείς και την ορίζεις στο cpp. Kατόπιν επιχειρείς να την χρησιμοποιήσεις και σε άλλο cpp και τότε παρουσιάζεται σφάλμα. Eφόσον την θέλεις global, aν την δηλώσεις extern θα γίνει global και θα αρθεί το πρόβλημα. O φίλος από πάνω με πρόλαβε. Λοιπόν, θέλεις να την έχεις global. Δήλωσέ την extern όπως ήδη έγραψα - αυτό είναι που θέλεις !
kfoynt Δημοσ. 14 Ιουλίου 2010 Μέλος Δημοσ. 14 Ιουλίου 2010 Αυτό δεν είναι σαφές.Ούτε είναι σαφές πώς θέλεις να χρησιμοποιήσεις την μεταβλητή : ως global ή ως static global ; Θυμάμαι ότι δηλώνοντας static μια global μεταβλητή η εμβέλειά της περιορίζεται στο αρχείο που την δηλώνεις. Μάλλον εδώ είναι το σφάλμα. Eκείνο που καταλαβαίνω είναι ότι την δηλώνεις στο include (και δεν είναι μέλος κλάσης). Mετά την αρχικοποιείς και την ορίζεις στο cpp. Kατόπιν επιχειρείς να την χρησιμοποιήσεις και σε άλλο cpp και τότε παρουσιάζεται σφάλμα. Eφόσον την θέλεις global, aν την δηλώσεις extern θα γίνει global και θα αρθεί το πρόβλημα. O φίλος από πάνω με πρόλαβε. Λοιπόν, θέλεις να την έχεις global. Δήλωσέ την extern όπως ήδη έγραψα !! ok... το δοκιμάζω τώρα... ελπίζω να δουλέψει!!! ευχαριστώ!!!
pinball_elf Δημοσ. 14 Ιουλίου 2010 Δημοσ. 14 Ιουλίου 2010 Τότε πρέπει να χρησημοποιήσεις extern μεταβλητές, π.χ: my_header.h (δεν έιναι απαραίτητο, αλλά βοηθάει στην συντήρηση του κώδικά) > .... extern Pb* pb_static_instance; .... my_source1.c > #include "my_header.h" (ούτε αυτό έιναι απαραίτητο για τις extern μεταβλητές) .... extern Pb* pb_static_instance; /* εδώ λέμε ότι η μεταβλητή pb_static_instance έιναι "κάπου" (που?) δηλωμένη */ ... printf("address of pb_static_instance is %p\n", pb_static_instance); .... my_source2.c > #include "my_header.h" (ούτε και αυτό έιναι απαραίτητο για τις extern μεταβλητές) .... Pb* pb_static_instance; /* εδώ δηλώνουμε τη μεταβλητή και πάντα σε global θέση στο αρχείο, όχι σε καμία function */ ... pb_static_instance = VECT(Pb, 1); /* initialization */ .... Υ.Γ Συμπληρωματική απάντηση σε αυτή του V.I.Smirnov, που με πρόλαβε τώρα εκείνος
kfoynt Δημοσ. 14 Ιουλίου 2010 Μέλος Δημοσ. 14 Ιουλίου 2010 Δεν το πιστεύω... δούλεψε! έχω χαζέψει απο την χαρά μου! τόσο εύκολο... :-D Ευχαριστώ και τους 2!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.