nik324 Δημοσ. 25 Μαΐου 2013 Δημοσ. 25 Μαΐου 2013 Εχω ενα αρχειο main.c ενα lib.c και ενα lib.h. Το lib.c περιεχει υλοποιησεις συναρτησεων που γινονται define στο lib.h... Η main.c και το lib.c κανει include το lib.h .. Θελω να χρησιμοποιω απο το αρχειο maιn.c της συναρτησεις που αριζονται στο .h, στην ουσια... Ολα ειναι μια χαρα εκτος απο την δηλωση node sentinel = { null, null, 0, 0, 0 }; Η οποια θελω να φαινεται στο lib.c αλλά και στο main.c . Πως θα το δηλωσω αυτο; Ευχαριστω edit το μνμ ειναι το εξης main.o:main.c:(.data+0x0): multiple definition of `sentinel' lib.o:lib.c:(.data+0x0): first defined here
imitheos Δημοσ. 25 Μαΐου 2013 Δημοσ. 25 Μαΐου 2013 Αν στο main.c αντί για αυτό που έχεις βάλεις "extern node sentinel;" τι σου βγάζει ?
ChRis6 Δημοσ. 25 Μαΐου 2013 Δημοσ. 25 Μαΐου 2013 'Εχεις βάλει την παραπάνω δήλωση στο header file ; Λογικά αυτό έκανες.Βάλε τη λέξη κλειδί 'extern' για να δώσεις τον ορισμό στο header file και γράψε 'node sentinel = { null, null, 0, 0, 0 }; ' σε ένα από τα δυο .c αρχεία.Στην ουσία αφού κάνεις δυο φορές include το header file,έχεις 2 φορές την παραπάνω δήλωση στον τελικό κώδικα,οπότε ο compiler δεν ξέρει σε ποιό αναφέρεσαι.Είναι σαν να έχεις γράψει int x; δύο φορές μέσα σε μια συνάρτηση 1
ChRis6 Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 /* lib.h */ #ifndef _LIB_H #define _LIB_H ..... extern node sentinel; #endif /*lib.c*/ #include "lib.h" node sentinel = { .... }; /*main.c*/ #include "lib.h" int main( int argc, char* argv[]){ .... use(&sentinel); return 0; } Έτσι σου δουλεύει ;
nilosgr Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 Μήπως θέλει να "κρύψει" τη μεταβλητή, ώστε να είναι μόνο στο scope του lib.c ? -Αν ναι, τότε βάλε τη λέξη static στη δήλωση στο lib.c
bird Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 Στις 25/5/2013 στις 10:36 ΜΜ, nilosgr είπε Μήπως θέλει να "κρύψει" τη μεταβλητή, ώστε να είναι μόνο στο scope του lib.c ? -Αν ναι, τότε βάλε τη λέξη static στη δήλωση στο lib.c Στις 25/5/2013 στις 8:24 ΜΜ, nik324 είπε Η οποια θελω να φαινεται στο lib.c αλλά και στο main.c . Πως θα το δηλωσω αυτο; Μαλλον τη θέλει και στα δύο... Αν δε δουλέψει αυτό που σου είπε ο ChRis6 ανέβασε τον κώδικα κάθε αρχείου (ή έστω της δηλώσεις και τα inlcudes να δούμε που κολλάει...)
nik324 Δημοσ. 26 Μαΐου 2013 Μέλος Δημοσ. 26 Μαΐου 2013 // main.c #include "lib.h" int main(){ //edw xreiazomai kai ta includes pou eginan sto .h kai oles tis leitourgies tou .h } /*********************************************/ //lib.c #include <stdio.h> #include <stdlib.h> #include "lib.h" Node sentinel = { null, null, 0, BLACK, 0 }; /*********************************************/ // lib.h #ifndef LIB_H_ #define LIB_H_ typedef enum { //... } _enum; typedef struct Node_ { //... } Node; #define null &sentinel extern Node sentinel = { null, null, 0, 0, 0 }; // dhloseis sunarthsewn #endif /* LIB_H_ */ Οριστε οι δηλώσεις... Φοβαμαι οτι εχω κανει χοντρη... και δεν το παιρνει με τιποτα οτι και να εχω δοκιμασει
ChRis6 Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 Ναι έχεις κάνει χοντρή...Ψάξε στο google να δεις τι κάνει το extern και δες ποια είναι η διαφορά μεταξύ definition και declaration.Επίσης ίσως να μην έχεις καταλάβει τι κάνει το define.Τι θέλεις να κάνεις στο σημείο: '#define null &sentinel' ?
imitheos Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 Στις 26/5/2013 στις 7:51 ΠΜ, nik324 είπε /*********************************************/ //lib.c #include <stdio.h> #include <stdlib.h> #include "lib.h" Node sentinel = { null, null, 0, BLACK, 0 }; Ως εδώ καλά. Στις 26/5/2013 στις 7:51 ΠΜ, nik324 είπε // lib.h #define null &sentinel extern Node sentinel = { null, null, 0, 0, 0 }; Εδώ τι κάνεις ? Λες ότι είναι extern δηλαδή το ορίζεις κάπου αλλού και ταυτόχρονα το ορίζεις εδώ. Αν γράψεις σκέτο "extern Node sentinel;" θα σου παίξει αλλά το πρόβλημα τώρα είναι τι θέλεις να κάνεις. Μέσα στο sentinel βάζεις σε δύο πεδία τη διεύθυνση του sentinel ? Και εδώ έχεις 0 ενώ στο άλλο BLACK ? Περίγραψε τι θέλεις να κάνεις.
nik324 Δημοσ. 26 Μαΐου 2013 Μέλος Δημοσ. 26 Μαΐου 2013 O sentinel = { null, null, 0, 0, 0 }; ειναι ο κομβος φρουρος ενος κοκκινομαυρου δεντρου To null θελω να φαινεται και στο main.c και στο lib.c για να μπορουν να κανω πχ node == null Το black ειναι τυπογραφικο λαθος οταν το εγραφα εδω..
imitheos Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 Ωραία τότε. Σβήσε το initialization από το lib.h ώστε να γίνει σκέτο "extern node sentinel;" και δεν θα βαράει. Και πάλι όμως δεν καταλαβαίνω το null macro που βάζεις. Γιατί δεν έχεις το κλασικό NULL και μετά να συγκρίνεις με == NULL ?
nik324 Δημοσ. 26 Μαΐου 2013 Μέλος Δημοσ. 26 Μαΐου 2013 τελειωνω κατι αλλο και το δοκιμαζω...ευχαριστω!
παπι Δημοσ. 26 Μαΐου 2013 Δημοσ. 26 Μαΐου 2013 Για να μην μπερδευεσαι. Το extern type name λειτουργει καπως σα function prototype, δηλαδη οπως δεν θα γραψεις την υλοποιηση της συναρτησης μεσα στο h ετσι δεν θα γραψεις το initialization του extern μεσα στο h. 1
nik324 Δημοσ. 26 Μαΐου 2013 Μέλος Δημοσ. 26 Μαΐου 2013 Oλα οκ, το πηρε...τελικα ηταν το initialization που εκανα μεσα στο .h Tραγικο Υπαρχει προβλημα αν κανω 2 φορες include την stdlib..μια στο main.c και μια στο lib.h ? O compiler δεν φωναζει παντως
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα