leonidascy Δημοσ. 11 Ιανουαρίου 2018 Δημοσ. 11 Ιανουαρίου 2018 (επεξεργασμένο) Καλησπέρα, Εχω φτιάξει ενα προργαμμα στην C και θελω να το σπασω σε μικροτερα πηγαια αρχεία(.c) και να εχω και ενα αρχείο κεφαλίδας (.h), Τι θα περιλαμβάνει το καθε αρχειο; Στην συνέχεια, πως θα το κάνω compile σε Linux με τον gcc? Και μια ακομα ερωτηση στο προγραμμα εχω ορισει συνθήκες #ifdef #endif, Αυτες θα τις περιλάβω στο αρχειο header(.h) η σε ενα απο τα αρχεία κωδικα (.c) ? Ευχαριστώ εκ των προτέρων Επεξ/σία 11 Ιανουαρίου 2018 από leonidascy
Επισκέπτης Δημοσ. 11 Ιανουαρίου 2018 Δημοσ. 11 Ιανουαρίου 2018 Καλησπέρα. Καταρχάς γιατί ένα .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
leonidascy Δημοσ. 11 Ιανουαρίου 2018 Μέλος Δημοσ. 11 Ιανουαρίου 2018 Γιατί ενα ζητάει η άσκηση μου Δεν είμαι και πολυ καλος στα αγγλικα μπορεις να απαντασεις τουλαχιστο αυτο αν γνωριζεις; Quote Και μια ακομα ερωτηση στο προγραμμα εχω ορισει συνθήκες #ifdef #endif, Αυτες θα τις περιλάβω στο αρχειο header(.h) η σε ενα απο τα αρχεία κωδικα (.c) ?
kaliakman Δημοσ. 11 Ιανουαρίου 2018 Δημοσ. 11 Ιανουαρίου 2018 1 ώρα πριν, leonidascy είπε Καλησπέρα, Εχω φτιάξει ενα προργαμμα στην C και θελω να το σπασω σε μικροτερα πηγαια αρχεία(.c) και να εχω και ενα αρχείο κεφαλίδας (.h), Τι θα περιλαμβάνει το καθε αρχειο; Στην συνέχεια, πως θα το κάνω compile σε Linux με τον gcc? Και μια ακομα ερωτηση στο προγραμμα εχω ορισει συνθήκες #ifdef #endif, Αυτες θα τις περιλάβω στο αρχειο header(.h) η σε ενα απο τα αρχεία κωδικα (.c) ? Ευχαριστώ εκ των προτέρων Ένα από τα c είναι η main? Αν ναι αυτή δεν θέλει header. Γενικότερα κάθε αρχείο c έχει και header εκτός της εξαίρεσης που ανέφερα.
leonidascy Δημοσ. 11 Ιανουαρίου 2018 Μέλος Δημοσ. 11 Ιανουαρίου 2018 6 minutes ago, kaliakman said: Ένα από τα c είναι η main? Αν ναι αυτή δεν θέλει header. Γενικότερα κάθε αρχείο c έχει και header εκτός της εξαίρεσης που ανέφερα. Ναι ενα απο τα c ειναι η main. Ναι το ξερω απλα η ασκηση μου ζηταει να φτιαξω header και το προβλημα ειναι προγραματιστικα σωστο να βαλω το #ifdef #endif στο header αρχειο η στην αρχειο της main γιατι μεσα στις εντολες #ifdef #endif υπαρχει κωδικας και δεν συνιστατε να μπαινει κωδικας στο header
kaliakman Δημοσ. 11 Ιανουαρίου 2018 Δημοσ. 11 Ιανουαρίου 2018 Εξαρτάται τι θες να κάνεις. Το ifdef ουσιαστικά αν δεν ισχύει η συνθήκη που του έχεις βάλει είναι σαν να σβήνει τον κώδικα μέχρι το endif. Δηλαδή σκέψου ότι είναι σαν να μην υπάρχει καν ό,τι βρίσκεται ανάμεσα στο ifdef,endif. Από εκεί και πέρα χωρίς τον κώδικα δεν μπορούμε να σου πούμε πως και που πρέπει να το βάλεις. Υ.Γ. Αν είσαι από την σχολή που νομίζω(και γενικότερα αλλα anyway) διάβασε αγγλικά γιατί θα έχεις πρόβλημα στην συνέχεια της ακαδημαικής/επαγγελματικής καρίερας.
παπι Δημοσ. 11 Ιανουαρίου 2018 Δημοσ. 11 Ιανουαρίου 2018 Κάπου το έχω γράψει αναλυτικά, αλλά δεν το βρίσκω. Λοιπόν, εμπλέκονται 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 το οποίο μπορεί να διαβαστεί μόνο μια φορά.
leonidascy Δημοσ. 12 Ιανουαρίου 2018 Μέλος Δημοσ. 12 Ιανουαρίου 2018 (επεξεργασμένο) 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 ; Επεξ/σία 12 Ιανουαρίου 2018 από leonidascy
παπι Δημοσ. 12 Ιανουαρίου 2018 Δημοσ. 12 Ιανουαρίου 2018 Α ξεχασα να σου πω. Τα αρχεια c γίνονται compile σε object, λέγονται και translate unit τα αρχεια c,asm κλπ. Δηλαδή είναι αυτόνομα αρα;
leonidascy Δημοσ. 12 Ιανουαρίου 2018 Μέλος Δημοσ. 12 Ιανουαρίου 2018 10 minutes ago, παπι said: Α ξεχασα να σου πω. Τα αρχεια c γίνονται compile σε object, λέγονται και translate unit τα αρχεια c,asm κλπ. Δηλαδή είναι αυτόνομα αρα; Ναι μιλώ για 3 ξεχωριστά αρχεία main.c foo.c foo.h Τα οποια θα κανω compile με τον gcc σε linux
παπι Δημοσ. 12 Ιανουαρίου 2018 Δημοσ. 12 Ιανουαρίου 2018 Ναι τα αρχεια c ειναι trqnslate unit. Φαντασου σα να κανεις πολλα executqble και ο linker τα ενονει σε ενα. Σίγουρα θα βαλεις και στο main.c και στο foo.c εφοαον χρησιμοποιούν κάποια συνάρτηση απο stdlib. Φυσικά μπορείς να βαλεις και στο h, δεν θα εχεις πρόβλημα επειδή η stdlib.h εχει headr guard.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα