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

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

Δημοσ. (επεξεργασμένο)

Καλησπέρα,

Εχω φτιάξει ενα προργαμμα στην C και θελω να το σπασω σε μικροτερα πηγαια αρχεία(.c) και να εχω και ενα αρχείο κεφαλίδας (.h), Τι θα περιλαμβάνει το καθε αρχειο;

Στην συνέχεια, πως θα το κάνω compile σε Linux  με τον gcc?

Και μια ακομα ερωτηση στο προγραμμα εχω ορισει συνθήκες #ifdef #endif, Αυτες θα τις περιλάβω στο αρχειο header(.h) η σε ενα απο τα αρχεία κωδικα (.c) ?

Ευχαριστώ εκ των προτέρων

Επεξ/σία από leonidascy
Δημοσ.

Καλησπέρα.

Καταρχάς γιατί ένα .h αρχείο και όχι περισσότερα;

Από κει και πέρα σου παραθέτω design patterns για C

http://adampetersen.se/Patterns in C 1.pdf

http://adampetersen.se/Patterns in C 2, STATE.pdf

http://www.adampetersen.se/Patterns in C 3, STRATEGY.pdf

http://www.adampetersen.se/Patterns in C 4, OBSERVER.pdf

http://www.adampetersen.se/Patterns in C 5, REACTOR.pdf

Δημοσ.

Γιατί ενα ζητάει η άσκηση μου

Δεν είμαι και πολυ καλος στα αγγλικα

μπορεις να απαντασεις τουλαχιστο αυτο αν γνωριζεις;

Quote

Και μια ακομα ερωτηση στο προγραμμα εχω ορισει συνθήκες #ifdef #endif, Αυτες θα τις περιλάβω στο αρχειο header(.h) η σε ενα απο τα αρχεία κωδικα (.c) ?

 

Δημοσ.
1 ώρα πριν, leonidascy είπε

Καλησπέρα,

Εχω φτιάξει ενα προργαμμα στην C και θελω να το σπασω σε μικροτερα πηγαια αρχεία(.c) και να εχω και ενα αρχείο κεφαλίδας (.h), Τι θα περιλαμβάνει το καθε αρχειο;

Στην συνέχεια, πως θα το κάνω compile σε Linux  με τον gcc?

Και μια ακομα ερωτηση στο προγραμμα εχω ορισει συνθήκες #ifdef #endif, Αυτες θα τις περιλάβω στο αρχειο header(.h) η σε ενα απο τα αρχεία κωδικα (.c) ?

Ευχαριστώ εκ των προτέρων

Ένα από τα c είναι η main? Αν ναι αυτή δεν θέλει header. Γενικότερα κάθε αρχείο c έχει και header εκτός της εξαίρεσης που ανέφερα.

Δημοσ.
6 minutes ago, kaliakman said:

Ένα από τα c είναι η main? Αν ναι αυτή δεν θέλει header. Γενικότερα κάθε αρχείο c έχει και header εκτός της εξαίρεσης που ανέφερα.

Ναι ενα απο τα c ειναι η main. Ναι το ξερω απλα η ασκηση μου ζηταει να φτιαξω header και το προβλημα ειναι προγραματιστικα σωστο να βαλω το #ifdef #endif στο header αρχειο η στην αρχειο της main γιατι μεσα στις εντολες #ifdef #endif υπαρχει κωδικας και δεν συνιστατε να μπαινει κωδικας στο header

Δημοσ.

Εξαρτάται τι θες να κάνεις.

Το ifdef ουσιαστικά αν δεν ισχύει η συνθήκη που του έχεις βάλει είναι σαν να σβήνει τον κώδικα μέχρι το endif. Δηλαδή σκέψου ότι είναι σαν να μην υπάρχει καν ό,τι βρίσκεται ανάμεσα στο ifdef,endif. Από εκεί και πέρα χωρίς τον κώδικα δεν μπορούμε να σου πούμε πως και που πρέπει να το βάλεις.

 

Υ.Γ. Αν είσαι από την σχολή που νομίζω(και γενικότερα αλλα anyway) διάβασε αγγλικά γιατί θα έχεις πρόβλημα στην συνέχεια της ακαδημαικής/επαγγελματικής καρίερας.

Δημοσ.

Κάπου το έχω γράψει αναλυτικά, αλλά δεν το βρίσκω.

 

Λοιπόν, εμπλέκονται 2 μπιρμπιτσολια. Ο compiler και ο linker. 

 

Είσαι στο αρχείο, μοναδικό αρχείο main.c στο οποίο έχεις την συνάρτηση main.

 

Στην main λοιπόν καλεις την foo(1)

Το τρέχεις, θα σου βγάλει undefined foo. Που είναι compiler error, δεν ξέρει τι είναι η foo. 

 

Βάζεις πάνω από την main το declaration της foo που είναι

void foo(int) ;

Το ξανατρεχεις, και θα σου βγάλει unresolved exteranl symbol foo, το οποίο είναι linker error, και μας λέει ότι δεν υπάρχει η υλοποίηση της foo.

 

Πάμε βάζουμε νέο αρχείο c. Σε αυτό θα βάλεις την υλοποίηση της foo. 

Τρέχεις και τώρα δεν θα έχεις error.

 

Μέχρι τώρα είμαστε χωρίς h αρχείο. Και δουλεύει.

Αν θέλουμε να βάλουμε h, το μόνο που θα κάνουμε είναι να βγάλουμε το declaration void foo(int) ; Που είναι πάνω από την main και να το βάλουμε στο... foo.h και πάνω από την main να κάνουμε #include foo.h 

Τρέχεις και δουλεύει χωρίς error 

Βάζεις κάτω από το include foo.h πάλι το include foo.h

Τρέχεις και σου πετάει compiler error, multiple declaration of foo ή κάτι τέτοιο, δεν το θυμάμαι.

Αυτό επειδή η εμπλοκή έγινε τριπλή. Compilwr, linker, preproccesor (πως γράφεται αυτό τεσπά)

Ο τελευταίος αναλαμβάνει όλες τις εντολές που αρχίζουν από #. Το include foo.h λέει ότι ότι έχει μέσα στο foo.h θα το αντιγράψεις εκεί που είναι το include. Και επειδή κάνουμε include foo.h δύο φορές, αυτό αντιγράφει το περιεχόμενο της foo.h δύο φορές δηλαδή έχουμε

void foo(int) ;

void foo(int) ; 

Το οποίο είναι compiler error.

Πάμε στο foo.h

Πάνω πάνω γράφουμε ifndef foo_h

define foo_h

Μετά γράφουμε το declaration της foo και τέλος γράφουμε

endif

 

Τρέχεις και κανένα error. 

Αυτό ονομάζεται header guard το οποίο δεν είναι κάτι περίπλοκο όπως δείχνει το όνομα του. Είναι ένα snip το οποίο μπορεί να διαβαστεί μόνο μια φορά. 

Δημοσ. (επεξεργασμένο)
42 minutes ago, παπι said:

Κάπου το έχω γράψει αναλυτικά, αλλά δεν το βρίσκω.

Λοιπόν, εμπλέκονται 2 μπιρμπιτσολια. Ο compiler και ο linker. 

Είσαι στο αρχείο, μοναδικό αρχείο main.c στο οποίο έχεις την συνάρτηση main.

Στην main λοιπόν καλεις την foo(1)

Το τρέχεις, θα σου βγάλει undefined foo. Που είναι compiler error, δεν ξέρει τι είναι η foo. 

Βάζεις πάνω από την main το declaration της foo που είναι

void foo(int) ;

Το ξανατρεχεις, και θα σου βγάλει unresolved exteranl symbol foo, το οποίο είναι linker error, και μας λέει ότι δεν υπάρχει η υλοποίηση της foo.

Πάμε βάζουμε νέο αρχείο c. Σε αυτό θα βάλεις την υλοποίηση της foo. 

Τρέχεις και τώρα δεν θα έχεις error.

Μέχρι τώρα είμαστε χωρίς h αρχείο. Και δουλεύει.

Αν θέλουμε να βάλουμε h, το μόνο που θα κάνουμε είναι να βγάλουμε το declaration void foo(int) ; Που είναι πάνω από την main και να το βάλουμε στο... foo.h και πάνω από την main να κάνουμε #include foo.h 

Τρέχεις και δουλεύει χωρίς error 

Βάζεις κάτω από το include foo.h πάλι το include foo.h

Τρέχεις και σου πετάει compiler error, multiple declaration of foo ή κάτι τέτοιο, δεν το θυμάμαι.

Αυτό επειδή η εμπλοκή έγινε τριπλή. Compilwr, linker, preproccesor (πως γράφεται αυτό τεσπά)

Ο τελευταίος αναλαμβάνει όλες τις εντολές που αρχίζουν από #. Το include foo.h λέει ότι ότι έχει μέσα στο foo.h θα το αντιγράψεις εκεί που είναι το include. Και επειδή κάνουμε include foo.h δύο φορές, αυτό αντιγράφει το περιεχόμενο της foo.h δύο φορές δηλαδή έχουμε

void foo(int) ;

void foo(int) ; 

Το οποίο είναι compiler error.

Πάμε στο foo.h

Πάνω πάνω γράφουμε ifndef foo_h

define foo_h

Μετά γράφουμε το declaration της foo και τέλος γράφουμε

endif

Τρέχεις και κανένα error. 

Αυτό ονομάζεται header guard το οποίο δεν είναι κάτι περίπλοκο όπως δείχνει το όνομα του. Είναι ένα snip το οποίο μπορεί να διαβαστεί μόνο μια φορά. 

Ευχαριστώ το καταλαβα και ακομη μια απορια

Γραφουμε την συναρτηση foo σε ενα αλλο αρχείο foo.c

αν η συναρτηση foo χρειάζετε την βιβλιοθήκη stdlib.h για την υλοποίηση της

και η main χρειαζετε επήσεις την βιβλιοθήκη stdlib.h για την υλοποίηση της 

Που πρεπει να κανουμε include την βιβλιοθήκη

1. και στην main.c και στην foo.c ;

2. μόνο στην main ;

3. στο foo.h ;

 

Επεξ/σία από leonidascy
Δημοσ.

Α ξεχασα να σου πω. Τα αρχεια c γίνονται compile σε object, λέγονται και translate unit τα αρχεια c,asm κλπ. Δηλαδή είναι αυτόνομα αρα;

Δημοσ.
10 minutes ago, παπι said:

Α ξεχασα να σου πω. Τα αρχεια c γίνονται compile σε object, λέγονται και translate unit τα αρχεια c,asm κλπ. Δηλαδή είναι αυτόνομα αρα;

Ναι μιλώ για 3 ξεχωριστά αρχεία

main.c

foo.c

foo.h

Τα οποια θα κανω compile με τον gcc σε linux

 

Δημοσ.

Ναι τα αρχεια c ειναι trqnslate unit. Φαντασου σα να κανεις πολλα executqble και ο linker τα ενονει σε ενα. Σίγουρα θα βαλεις και στο main.c και στο foo.c εφοαον χρησιμοποιούν κάποια συνάρτηση απο stdlib. Φυσικά μπορείς να βαλεις και στο h, δεν θα εχεις πρόβλημα επειδή η stdlib.h εχει headr guard.

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

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

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

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

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

Σύνδεση

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

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