Προγραμματισμός σε C - Λύνουμε ασκήσεις

...ασύγχρονα μαθήματα γλώσσας C

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό Star_Light » 31 Μάιος 2011, 02:53

simosx έγραψε:

Στο παράδειγμα δεν καλώ το συνδέτη (linker) για να μη το κάνω αρκετά δύσκολο.
Ο λόγος που αποδομείς το πρόγραμμα σε μικρές ενότητες είναι για να μειώσεις τη δυσκολία του,
και όταν πας να το μεταγλωττίσεις, να γνωρίζει το σύστημα ποια .o αρχεία είναι ενημερωμένα, και να μην τα μεταγλωττίζει.
Διαφορετικά, και με μικρή αλλαγή στον κώδικα, θέλει μεταγλώττιση όλα ξανά.


A ok. Κατσε ομως τα μεταγλωτισμενα αρχεια δεν θελουν και τον συνδετη για να μπορουν να δημιουργησουν ενα εκτελεσιμο?????
Δηλαδη εκανες το prog εκτελέσιμο χωρις να καλέσεις τον συνδετη ???
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό simosx » 31 Μάιος 2011, 13:50

Star_Light έγραψε:
A ok. Κατσε ομως τα μεταγλωτισμενα αρχεια δεν θελουν και τον συνδετη για να μπορουν να δημιουργησουν ενα εκτελεσιμο?????
Δηλαδη εκανες το prog εκτελέσιμο χωρις να καλέσεις τον συνδετη ???


Ο συνδέτης καλείται έμμεσα στο παράδειγμα.
Είδα τη νέα συζήτηση που ξεκίνησες και είναι πολύ καλή κίνηση.
Μπορείς να χρησιμοποιήσεις τον συνδέτη άμεσα, ωστόσο θέλει μια σειρά από παραμέτρους.
Όταν το πρόγραμμά σου βασίζεται στο autotools, τότε όλα αυτά μπαίνουν αυτόματα.
Για τώρα, είναι καλύτερο να δοκιμάσεις τη σύνδεση με gcc όπως δείχνω στη νέα συζήτηση.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό limas » 31 Μάιος 2011, 14:37

Μπορεις να φτιαξεις ενα Makefile αρχειο απο το οποιο θα εχεις κςδικοποιηση ποια εντολη θες να εκτελεις και θα στην κανει. Για να γινω πιο κατανοητος, χρησιμοποιουμε Makefile οταν θελουμε να κανουμε link πολλα αρχεια και για να μην τα κανουμε ολα gcc εχουμε φτιαξει μια εντολη που τα κανει ολα με μιας compile & link.
Γνώσεις ⇛ Linux:Χαμηλό ┃ Προγραμματισμός:Ναι ┃ Αγγλικά:Μέτρια
Λειτουργικό σε Η/Υ ϰ μοντέλο: Ubuntu 10.04.1 LTS σε Intel(R) Core(TM) 2 Duo CPU @ 2.00GHz
Προδιαγραφές ⇛ T5750│ RAM:3GB │Mesa DRI Intel(R) 965GM GEM │ Atheros AR5001 │Intel 82801H │ TFT 15.6''
limas
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 359
Εγγραφή: 06 Σεπ 2009, 15:47
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό simosx » 31 Μάιος 2011, 15:30

limas έγραψε:Μπορεις να φτιαξεις ενα Makefile αρχειο απο το οποιο θα εχεις κςδικοποιηση ποια εντολη θες να εκτελεις και θα στην κανει. Για να γινω πιο κατανοητος, χρησιμοποιουμε Makefile οταν θελουμε να κανουμε link πολλα αρχεια και για να μην τα κανουμε ολα gcc εχουμε φτιαξει μια εντολη που τα κανει ολα με μιας compile & link.


Το αρχείο Makefile έχει συγκεκριμένη μορφή όπου βάζεις τις εξαρτήσεις που χρειάζονται για να δημιουργηθεί το εκτελέσιμο.
Βασικός στόχος είναι απλά να πατάς make και να μεταγλωττίζονται αυτά που χρειάζονται χωρίς να σκεφτείς δεύτερη φορά.

Για τώρα το αρχείο είναι πάνω κάτω αρκετό. Μπορείς να ψάξεις για περισσότερα. Για παράδειγμα,
Κώδικας: Επιλογή όλων

peace:
@echo "Make peace, not war..."


και ένα σωρό τέτοια κόλπα.

Αυτά που είναι στην πρώτη στήλη είναι ο στόχος.
Οπότε μπορείς και
Κώδικας: Επιλογή όλων
make module.o
για τη μεταγλώττιση μόνο του module.o (λέμε τώρα).
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό Tassos10 » 19 Μάιος 2014, 18:33

Εσείς δηλαδή αυτό που κάνετε είναι να έχετε ένα main program ( π.χ. main.c ) και ένα module ( module.c ) και τα ενώνεται με την αντίστοιχη εντολή του gcc ( το τι κάνετε με τον git , προσωπικά δε με αφορά ). Οκ αυτό που κάνετε με την σύνδεση. Όμως, πως γίνεται στο main.c να γράψουμε ένα:
Κώδικας: Επιλογή όλων
#include "module.c"

και να μπορούμε να χρησιμοποιήσουμε τις συναρτήσεις που υπάρχουν στο module.c ;

Ευχαριστώ. :)
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 12.04 precise 3.2.0-50-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.2.0-49-generic
3 Intel Core2 Quad CPU Q9400 2.66GHz ‖ RAM 3954 MiB ‖ ASRock G31M-S
4 nVidia G92 [GeForce 9800 GT] [10de:0614] {nvidia}
5 eth0: Realtek RTL8101E/RTL8102E PCI Express Fast Ethernet controller [10ec:8136] (rev 02)
Tassos10
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 472
Εγγραφή: 29 Μαρ 2010, 10:43
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό g1wrg0s » 19 Μάιος 2014, 19:30

απο οτι γνωριζω πριν ξεκινησει η ολη φαση της μεταγλωτισης θα παρει τα ηνια ο Cpreprocessor ο οποιος θα σκαναρει το αρχειο σου και θα κανει χαμαλοδουλειες, ποιες ειναι αυτες;

παραδειγματα:

1. αφεραιση ολων των σχολιων
2. αντικατασταση ολων των defines που εχει κανει ο προγραμματιστης
3. προσθηκη του κωδικα που περιεχουν ολα τα .h poy kanei include ο προγραμματιστης

αρα... δεν τον νοιαζει τι εχεις βαλει μεσα στο αρχειο που κανεις include. Παει στο σημειο που βρισκεται η οδηγια #include "modulo.c" και το αντικαθιστα με τα περιεχομενα του αρχειου. Στη συγκεκριμενη περιπτωση με ολεςς τις συναρτησεις, οι οποιες θα βρισκονται πλεον στο ιδιο αρχειο με την main και πανω απο αυτη. Οποτε μπορεις να τις καλεσεις μεσα απο τη main χωρις ποβλημα !!!

Αν παρατηρησεις πανω ανεφερα τον ορο οδηγια. Ενας προγραμματιστης ξεχωριζει τον κωδικα που ειναι για το cc και τις οδηγιες που θελει να δωσει στον Cpreprocessor. Πως ; μα φυσικα με το γραμματικο συμβολο # (βλεπε #include, #define, #if κ.α)
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό Tassos10 » 19 Μάιος 2014, 23:25

Ευχαριστώ πολύ για την πολύ ωραία απάντηση σου φίλε. Πολύ σωστά.
Απλώς εγώ δε καταλαβαίνω, αφού αν βάλεις το modulo.c στο κυρίως πρόγραμμα σου σε
Κώδικας: Επιλογή όλων
#include "modulo.c"

παίζουν μια χαρά οι συναρτήσεις του modulo.c. Τότε για ποιο λόγο να κάνεις .h αρχεία και τα λοιπά.. ή άλλες ιστορίες, ώστε να τα συνδέσεις.. :problem:
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 12.04 precise 3.2.0-50-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.2.0-49-generic
3 Intel Core2 Quad CPU Q9400 2.66GHz ‖ RAM 3954 MiB ‖ ASRock G31M-S
4 nVidia G92 [GeForce 9800 GT] [10de:0614] {nvidia}
5 eth0: Realtek RTL8101E/RTL8102E PCI Express Fast Ethernet controller [10ec:8136] (rev 02)
Tassos10
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 472
Εγγραφή: 29 Μαρ 2010, 10:43
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό g1wrg0s » 19 Μάιος 2014, 23:41

Δοκιμασε να φτιαξεις 2 αρχεια file1.c file2.c που θα κανουν include το module.c (το οποιο θα περιεχει δηλωσεις και ορισμους μεταβλητων ή συναρτησεων). Επειτα προσπαθησε να το κανεις compile

αλλα η ερωτηση σου ειναι αλλη... γιατι υπαρχουν !

προσωπικα δε γνωριζω ποια ηταν η αναγκη για τη δημιουργια της εννοιας του .h (αν και στη πορεια απολαμβανω πολλα πλεονεκτηματα τους εν αγνοια μου) αλλα υποθετω οτι ενας απο τους σημαντικοτερους θα ειναι η μεγαλυτερη ευελιξια. Επισης σκεψου για παραδειγμα οτι το main.c ειναι 100 γραμμες αλλα το modulo εχει της παναγιας τα καλουδια με τοσες συναρτησεις που πιανουν 4000 κωδικα. Παρατηρεις οτι εχεις ενα bug στο main.c και το αλλαζεις, τοτε μαντεψε ποιες συναρτησεις θα γινουν compile.... .... ολες! Και αν το module εκανε include το extracode.c κοκ

υπαρχουν πολλα προβληματα χωρις αυτα, συνηθως εξαρτησεων τα οποια ομως δε μπορω να τα εξηγησω με post
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Προγραμματισμός σε C - Λύνουμε ασκήσεις

Δημοσίευσηαπό Ilias95 » 20 Μάιος 2014, 00:36

@Tassos10
Ένας πολύ βασικός λόγος είναι το abstraction.

Στο header δηλώνεις απλά τις συναρτήσεις, τις υπόλοιπες δομές και το documentation, ενώ στο source file τις υλοποιείς. Αυτό σημαίνει ότι μπορεί ένας τρίτος να δει το API της βιβλιοθήκης σου, τι συναρτήσεις είναι διαθέσιμες και πως θα τις καλέσει χωρίς όμως να ξέρει πως ακριβώς αυτές υλοποιούνται από κάτω πράγμα πολύ σημαντικό. Μπορεί δηλαδή να βλέπει δηλαδή όσα υπάρχουν στο header σαν black boxes.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Προηγούμενη

Επιστροφή στο Μαθήματα C