Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω ενα αρχειο 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

Δημοσ.

'Εχεις βάλει την παραπάνω δήλωση στο header file  ; Λογικά αυτό έκανες.
Βάλε τη λέξη κλειδί 'extern'  για να δώσεις τον ορισμό στο header file και γράψε  'node sentinel = { null, null, 0, 0, 0 }; ' σε ένα από τα δυο .c αρχεία.

Στην ουσία αφού κάνεις δυο φορές include το header file,έχεις 2 φορές την παραπάνω δήλωση στον τελικό κώδικα,οπότε ο compiler δεν ξέρει σε ποιό αναφέρεσαι.Είναι σαν να έχεις γράψει int x;  δύο φορές μέσα σε μια συνάρτηση

 

 

  • Like 1
Δημοσ.

 

/* 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;
}

Έτσι σου δουλεύει ;
 
Δημοσ.

Μήπως θέλει να "κρύψει" τη μεταβλητή, ώστε να είναι μόνο στο scope του lib.c ?

-Αν ναι, τότε βάλε τη λέξη static στη δήλωση στο lib.c

Δημοσ.
  Στις 25/5/2013 στις 10:36 ΜΜ, nilosgr είπε

Μήπως θέλει να "κρύψει" τη μεταβλητή, ώστε να είναι μόνο στο scope του lib.c ?

-Αν ναι, τότε βάλε τη λέξη static στη δήλωση στο lib.c

 

  Στις 25/5/2013 στις 8:24 ΜΜ, nik324 είπε

 

Η οποια θελω να φαινεται στο lib.c αλλά και στο main.c . Πως θα το δηλωσω αυτο;

 

Μαλλον τη θέλει και στα δύο...

 

Αν δε δουλέψει αυτό που σου είπε ο ChRis6 ανέβασε τον κώδικα κάθε αρχείου (ή έστω της δηλώσεις και τα inlcudes να δούμε που κολλάει...)

Δημοσ.
// 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_ */

Οριστε οι δηλώσεις...

Φοβαμαι οτι εχω κανει χοντρη... και δεν το παιρνει με τιποτα οτι και να εχω δοκιμασει

Δημοσ.

Ναι έχεις κάνει χοντρή...

Ψάξε στο google να δεις τι κάνει το extern και δες ποια είναι η διαφορά μεταξύ definition και declaration.
Επίσης ίσως να μην έχεις καταλάβει τι κάνει το define.Τι θέλεις να κάνεις στο σημείο: '#define null &sentinel'   ?

Δημοσ.
  Στις 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 ?

 

Περίγραψε τι θέλεις να κάνεις.

Δημοσ.

O sentinel = { null, null, 0, 0, 0 }; ειναι ο κομβος φρουρος ενος κοκκινομαυρου δεντρου

To null θελω να φαινεται και στο main.c και στο lib.c για να μπορουν να κανω πχ node == null

 

 

Το black ειναι τυπογραφικο λαθος οταν το εγραφα εδω..

Δημοσ.

Ωραία τότε. Σβήσε το initialization από το lib.h ώστε να γίνει σκέτο "extern node sentinel;" και δεν θα βαράει.

 

Και πάλι όμως δεν καταλαβαίνω το null macro που βάζεις. Γιατί δεν έχεις το κλασικό NULL και μετά να συγκρίνεις με == NULL ?

Δημοσ.

Για να μην μπερδευεσαι. Το extern type name λειτουργει καπως σα function prototype, δηλαδη οπως δεν θα γραψεις την υλοποιηση της συναρτησης μεσα στο h ετσι δεν θα γραψεις το initialization του extern μεσα στο h.

  • Like 1
Δημοσ.

Oλα οκ, το πηρε...τελικα ηταν το initialization που εκανα μεσα στο .h

Tραγικο :)



Υπαρχει προβλημα αν κανω 2 φορες include την stdlib..μια στο main.c και μια στο lib.h ?

O compiler δεν φωναζει παντως

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...