Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

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

Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

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

Σε αυτον τον μίνι οδηγο που έγινε συζητηση προ λιγου , ειπα να τον βαλω εδω καθαρογραμμενο και ολοκληρωμενο για να διευκολυνει οσους τον διαβασουν. Καταρχην να ευχαριστησω τον φιλο simosx που βοηθησε αρκετα στο να βγει μια άκρη με το git .Το Git δημιουργήθηκε απο τον Linus Torvalds τον Απρίλιο του 2005. Είναι ο βασικός ιδιοκτήτης του το git αποτελεί ένα distributed revision control system παρακολουθεί (είναι ενήμερο για αναθεωρήσεις - αναβαθμίσεις απο το software και επιτρέπει σε πολλούς προγραμματιστές να εργάζονται με ενα συγκεκριμένο project χωρις να χρειάζεται κατα ανάγκη να συνδεθούν σε ένα κοινό δίκτυο.

1. viewtopic.php?f=6&t=5424&start=0 -> Ο βασικός οδηγός του git
2. viewtopic.php?f=61&t=12494&start=50 -> extra συμβουλές απο τον σίμο για απλοποίηση της διαδικασίας.
3. http://en.wikipedia.org/wiki/Git_%28software%29 -> Η τεκμηριωση της Wiki.

Ο κωδικας που θα δοθει παρακατω
έχει ορισμένα λογικά σφάλματα αλλα καταφέραμε να τρέξει κανονικα. Οποιος θελει μπορεί να τον συμπληρώσει και να τον διορθώσει οσο θα τον κοιταω και εγω οταν θα εχω χρονο... προς το παρον θα τον βάλουμε ετσι μιας και αυτα που θέλουμε να πούμε γυρω απο αυτον τα καλύπτει και έτσι οπως ειναι.

Καταρχην οπως το λέει και ο τίτλος θέλουμε να δουλέψουμε με λειτουργικές μονάδες. ΟΙ λειτουργικες μονάδες / modules ειναι πηγαία αρχεία. Πηγαίο αρχείο ειναι ένα αρχείο το οποίο ειναι γραμμένο σε κάποια γλώσσα προγραμματισμού :!: :!: ΣΤην συγκεκριμένη περίπτωση σε C . Δεν ειναι καλή προγραμματιστική τεχνική να προσπαθείς να λύσεις ενα περιπλοκο πρόβλημα με μια μονο συνάρτηση. Ο σωστός τροπος ειναι να προσεγγιστεί το πρόβλημα και να χωριστεί σε μικρότερα και απλούστερα προβλήματα. Οι συναρτήσεις που θα χρησιμοποιηθούν στα παρακάτω αρχεία ειναι τεχνικες προς την κατεύθυνση αυτη.

paragontiko : Συναρτηση που υλοποιεί την συνάρτηση του παραγοντικού n!
gcd : ΠΟυ υπολογιζει τον μεγιστο κοινό διαιρέτη 2 αριθμών (αυτη ισως θελει καποιο αρχειο επικεφαλιδας να συμπεριληφθει αλλιως θα παιζει λογικό σφάλμα στην κλήση της
pow: η συναρτηση η οποια υπολογιζει την δύναμη ενος αριθμού

:idea: ΔΙΕΥΚΡΙΝΗΣΗ-> Οι συγκεκριμένες συναρτήσεις δεν φαίνονται να σχετίζονται και τοσο μεταξύ τους ... δηλαδη οι ενέργειες οι οποιες θα έπαιζαν σε μια διαχειριση μιας λιστας (προσθηκη στοιχειου , διαγραφη στοιχειου , δημιουργια στοιχειου) θα μπορουσαν καλλιστα να υλοποιηθουν ως συναρτησεις που η καθεμια κανει την δικη της δουλεια... καπως παρομοια και παραπανω αν υποθεσουμε πως εχουμε το προβλημα με τις 3 πραξεις (υπολογισμος παραγοντικου - δυναμης και Μεγιστου κοινου διαιρετη) μπορουμε να σκεφτουμε με αυτον τον τροπο και να λειτουργήσουμε.

Οι 3 αυτες συναρτήσεις αρχικά ξεκινάνε απο το αρχείο module.c

Κώδικας: Επιλογή όλων
#include "module.h"

char main_interface(char ch)
{
int n, a, b;
double k, m;

switch (ch) {
case 'A':
printf("To apotelesma einai: %d", paragontiko(n));
break;
case 'B':
printf("To apotelesma einai: %d", gcd(a, b));
case 'C':
printf("To apotelesma einai: %f", pow(k, m));
break;
default:
break;
}
}

int paragontiko(int n)
{
printf("Dwste to n");
scanf("%d", &n);
if (n == 0)
return 1;
else
return n * paragontiko(n - 1);
}

int gcd(int a, int b)
{
printf("Dwste to a");
scanf("%d", &a);
printf("Dwste to b");
scanf("%d", &b);
if (b == 0)
return a;
else
return gcd(b, a % b);
}

double pow(double k, double m)
{
printf("Dwste ton k");
scanf("%lf", &k);
printf("Dwste ton m");
scanf("%lf", &m);
if (k == 0)
return 1;
else
return m * pow(m, k - 1);
}


Ο simosx τονισε πως το να κάνεις include άλλα αρχεία δεν είναι σωστή προγραμματιστική τεχνική. Πιστεύω διαθέτει περισσότερη εμπειρία απο μενα στον προγραμματισμό αλλα ειναι και θέμα προσωπικής προτίμησης. Τελος παντων μπορει να συζητηθεί παρακάτω και αυτο.

η 2η λειτουργική μονάδα που θα χρειαστούμε ειναι το αρχείο επικεφαλίδας header module.h μεσα στο οποιο ειναι δηλωμένα τα πρωτότυπα των συναρτήσεων που χρησιμοποιούμε στην 1η λειτουργική μονάδα module.c

Κώδικας: Επιλογή όλων
#include<stdio.h>
int paragontiko(int n);
int gcd(int a, int b);
double pow(double k, double m);
char main_interface(char ch);


η 3η λειτουργική μονάδα εχει να κάνει με το interface του χρήστη. Με λιγα λογια ... ως εδω έχουμε φτιάξει το 1ο αρχείο μεσα στο οποίο θα ορίσουμε τις συναρτήσεις ως προς την λειτουργία τους. (ΤΙ θελουμε να κάνουν και τι θα πρέπει να επιστρέφουν , με πιο απλα λόγια αλλωστε μια συνάρτηση ειναι μια εντολή η οποια εκτελεί μια ενέργεια συνήθως τροποποιούμενη βάση των ορισμάτων που της δίνεις . Η ενέργεια που εκτελεί έχει να κάνει με τον ορισμό της) -οχι την δηλωσή της στην αρχή.

η 3η λειτουργική μονάδα έχει τον παρακάτω κώδικα
Κώδικας: Επιλογή όλων

#include "module.h"
#include<stdio.h>

int main(void)
{
int ch;

printf
("Dwste A gia to paragontiko , B gia ton MKD kai C gia tin dunami \n");
printf("Dwste q an thelete na bgeite apo to programma\n");
while ((ch = getchar()) != 'q') {
main_interface(ch);
}
printf("Bye World");

return 0;
}


Σε γενικές γραμμές ο χρήστης ανάλογα με το τί θα επιλέξει (και οσο δεν επιλέγει το q ) μεταφέρεται στην 1η λειτουργική μονάδα στην αντίστοιχη ετικέτα οπου εκεί καλείται η αντιτοιχη συνάρτηση... υλοποιεί τους υπολογισμούς της και επιστρέφει ενα αποτέλεσμα. Φυσικα αυτη η συνάρτηση για να καταφέρει να δουλέψει και να αναγνωριστεί θα πρέπει πρωτα να έχει δηλωθεί και ακριβως αυτος ειναι και ο λογος υπαρξης του 2ου πηγαίου αρχείου - λειτουργικής μονάδας. ΟΙ κώδικες υπάρχουν και στην τοποθεσία

https://github.com/simos/starlight

επίσης απο εδω μπορουμε να δούμε με ποιο τρόπο παράγεται το εκτελέσιμο prog
δίνοντας απο το τερματικό την εντολή Makefile και αφου εχουμε εγκαταστήσει το git
η διαδικασία βγαινει μονη της.

2 λογια για τις οντότητες που εμπλέκονται στην διαδικασία

1. Μεταγλωττιστής => Παίρνει σαν είσοδο το αρχικό αρχείο πηγαίου κώδικα σε C με κατάληξη .c και παράγει το αντικειμενικό αρχείο (.o για λινουξ - .obj για windows) . H δουλεια του μεταγλωττιστή ειναι να εξετάσει το αρχειο απο συντακτικά λάθη - τα λογικά δεν τον αφορούν.

2. Το αντικειμενικό αρχείο δεν μπορει να εκτελεστεί με την μορφή που έχει μιας και υπάρχει κώδικα που του λείπει θα πρέπει να γίνει λοιπον η σύνδεση. Η σύνδεση σε γενικές γραμμές χρησιμοποιείται για να το αντικειμενικό αρχείο η ANSI C βιβλιοθήκη και άλλες βιβλιοθήκες για να δημιουργηθεί ο δυαδικός κωδικας - εκτελέσιμο αρχείο.

TIP 1->

Καθώς ειμαστε στον μεταγλωττιστη και εργαζόμαστε όταν πληκτρολογήσουμε την συνθήκη ελέγχου if αμέσως μετα το (f) αν πατήσουμε tab μας βγάζει τον συντακτικό της ορισμό.. δηλαδή τις αγκύλες και τις παρενθέσεις που θα πρέπει να έχει χωρις να χρειάζεται να θυμόμαστε κατι απέξω για αυτήν.

TIP 2 ->

Μιας και μιλήσαμε για include αλλων αρχείων - λειτουργικών μονάδων μεσα στο αρχείο που εργαζόμαστε ή και κάποιο άλλο απο την "ομάδα μας!" καλό θα είναι να θυμόμαστε οτι οι γωνιώδεις αγκύλες στην οδηγία *προεπεξεργαστή #include <stdio.h> λένε στον C προεπεξεργαστή να ψάξει για το αρχείο επικεφαλίδας σε έναν κατάλογο εκτός απο τον τρέχοντα. ΑΝτίθετα αν βάζαμε #include "stdio.h" θα ωθούσαμε τον προεπεξεργαστή να ψάξει πρωτα στον τρέχοντα κατάλογο και μετα αλλού.

*προεπεξεργαστής : ενα πρόγραμμα που κάνει κάποια προετοιμασία στον C μεταγλωττιστή πριν μεταγλωττιστεί ο κωδικάς μας.

Π.Σ Ελπίζω να βοηθήσει αν και θέλει ορισμένες βελτιώσεις... δεν ειναι ακομη 100% έτοιμος :) :) ωστοσο θα χαρω να μου πειτε αν κανω λαθος σε κατι.
Γνώσεις ⇛ 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: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

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

Έκανα μερικές βελτιώσεις στο πρόγραμμα, οπότε έχουμε περισσότερα!

1. Στο αποθετήριο κώδικα starlight, μπαίνεις και γράφεις
Κώδικας: Επιλογή όλων

git pull --rebase


Αν έχεις κάνει αλλαγές στα αρχεία, θα χρειαστεί σβήσεις & να τρέξεις ξανά το git clone...

2. Εγκτατέστησε το gitg,
Κώδικας: Επιλογή όλων

sudo apt-get install gitg


και μέσα από τον κατάλογο starlight εκτελείς

Κώδικας: Επιλογή όλων
gitg


Θα μπορέσεις να δεις εύκολα και όμορφα κάθε αλλαγή που έκανα για να βελτιώσω τον κώδικα.

3. Πας στο www.github.com και φτιάχνεις λογαριασμό. Μου λες το όνομα του λογαριασμού και δίνω πρόσβαση στο αποθετήριο για να βάζεις και εσύ τις αλλαγές σου.
προσωπικό ιστολόγιο ϗ πλανήτης 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: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

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

Πρώτα από όλα, μπράβο που τα κατέγραψες όλα παραπάνω! ;-).

Είναι εφικτό να χρησιμοποιήσεις την ld ξεχωριστά, ωστόσο πρέπει να βάλεις μια σειρά από παραμέτρους που για αρχή μπορεί να είναι δύσκολο.
Δες για παράδειγμα τη σελίδα http://www.lisha.ufsc.br/teaching/os/ex ... hello.html
προσωπικό ιστολόγιο ϗ πλανήτης 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: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

Δημοσίευσηαπό linuxs » 31 Μάιος 2011, 19:06

Star_Light έγραψε:Σε αυτον τον μίνι οδηγο που έγινε συζητηση προ λιγου , ειπα να τον βαλω εδω καθαρογραμμενο και ολοκληρωμενο για να διευκολυνει οσους τον διαβασουν. Καταρχην να ευχαριστησω τον φιλο simosx που βοηθησε αρκετα στο να βγει μια άκρη με το git .Το Git δημιουργήθηκε απο τον Linus Torvalds τον Απρίλιο του 2005. Είναι ο βασικός ιδιοκτήτης του το git αποτελεί ένα distributed revision control system παρακολουθεί (είναι ενήμερο για αναθεωρήσεις - αναβαθμίσεις απο το software και επιτρέπει σε πολλούς προγραμματιστές να εργάζονται με ενα συγκεκριμένο project χωρις να χρειάζεται κατα ανάγκη να συνδεθούν σε ένα κοινό δίκτυο.

1. viewtopic.php?f=6&t=5424&start=0 -> Ο βασικός οδηγός του git
2. viewtopic.php?f=61&t=12494&start=50 -> extra συμβουλές απο τον σίμο για απλοποίηση της διαδικασίας.
3. http://en.wikipedia.org/wiki/Git_%28software%29 -> Η τεκμηριωση της Wiki.

Ο κωδικας που θα δοθει παρακατω
έχει ορισμένα λογικά σφάλματα αλλα καταφέραμε να τρέξει κανονικα. Οποιος θελει μπορεί να τον συμπληρώσει και να τον διορθώσει οσο θα τον κοιταω και εγω οταν θα εχω χρονο... προς το παρον θα τον βάλουμε ετσι μιας και αυτα που θέλουμε να πούμε γυρω απο αυτον τα καλύπτει και έτσι οπως ειναι.

Καταρχην οπως το λέει και ο τίτλος θέλουμε να δουλέψουμε με λειτουργικές μονάδες. ΟΙ λειτουργικες μονάδες / modules ειναι πηγαία αρχεία. Πηγαίο αρχείο ειναι ένα αρχείο το οποίο ειναι γραμμένο σε κάποια γλώσσα προγραμματισμού :!: :!: ΣΤην συγκεκριμένη περίπτωση σε C . Δεν ειναι καλή προγραμματιστική τεχνική να προσπαθείς να λύσεις ενα περιπλοκο πρόβλημα με μια μονο συνάρτηση. Ο σωστός τροπος ειναι να προσεγγιστεί το πρόβλημα και να χωριστεί σε μικρότερα και απλούστερα προβλήματα. Οι συναρτήσεις που θα χρησιμοποιηθούν στα παρακάτω αρχεία ειναι τεχνικες προς την κατεύθυνση αυτη.

paragontiko : Συναρτηση που υλοποιεί την συνάρτηση του παραγοντικού n!
gcd : ΠΟυ υπολογιζει τον μεγιστο κοινό διαιρέτη 2 αριθμών (αυτη ισως θελει καποιο αρχειο επικεφαλιδας να συμπεριληφθει αλλιως θα παιζει λογικό σφάλμα στην κλήση της
pow: η συναρτηση η οποια υπολογιζει την δύναμη ενος αριθμού

:idea: ΔΙΕΥΚΡΙΝΗΣΗ-> Οι συγκεκριμένες συναρτήσεις δεν φαίνονται να σχετίζονται και τοσο μεταξύ τους ... δηλαδη οι ενέργειες οι οποιες θα έπαιζαν σε μια διαχειριση μιας λιστας (προσθηκη στοιχειου , διαγραφη στοιχειου , δημιουργια στοιχειου) θα μπορουσαν καλλιστα να υλοποιηθουν ως συναρτησεις που η καθεμια κανει την δικη της δουλεια... καπως παρομοια και παραπανω αν υποθεσουμε πως εχουμε το προβλημα με τις 3 πραξεις (υπολογισμος παραγοντικου - δυναμης και Μεγιστου κοινου διαιρετη) μπορουμε να σκεφτουμε με αυτον τον τροπο και να λειτουργήσουμε.

Οι 3 αυτες συναρτήσεις αρχικά ξεκινάνε απο το αρχείο module.c

Κώδικας: Επιλογή όλων
#include "module.h"

char main_interface(char ch)
{
int n, a, b;
double k, m;

switch (ch) {
case 'A':
printf("To apotelesma einai: %d", paragontiko(n));
break;
case 'B':
printf("To apotelesma einai: %d", gcd(a, b));
case 'C':
printf("To apotelesma einai: %f", pow(k, m));
break;
default:
break;
}
}

int paragontiko(int n)
{
printf("Dwste to n");
scanf("%d", &n);
if (n == 0)
return 1;
else
return n * paragontiko(n - 1);
}

int gcd(int a, int b)
{
printf("Dwste to a");
scanf("%d", &a);
printf("Dwste to b");
scanf("%d", &b);
if (b == 0)
return a;
else
return gcd(b, a % b);
}

double pow(double k, double m)
{
printf("Dwste ton k");
scanf("%lf", &k);
printf("Dwste ton m");
scanf("%lf", &m);
if (k == 0)
return 1;
else
return m * pow(m, k - 1);
}


Ο simosx τονισε πως το να κάνεις include άλλα αρχεία δεν είναι σωστή προγραμματιστική τεχνική. Πιστεύω διαθέτει περισσότερη εμπειρία απο μενα στον προγραμματισμό αλλα ειναι και θέμα προσωπικής προτίμησης. Τελος παντων μπορει να συζητηθεί παρακάτω και αυτο.

η 2η λειτουργική μονάδα που θα χρειαστούμε ειναι το αρχείο επικεφαλίδας header module.h μεσα στο οποιο ειναι δηλωμένα τα πρωτότυπα των συναρτήσεων που χρησιμοποιούμε στην 1η λειτουργική μονάδα module.c

Κώδικας: Επιλογή όλων
#include<stdio.h>
int paragontiko(int n);
int gcd(int a, int b);
double pow(double k, double m);
char main_interface(char ch);


η 3η λειτουργική μονάδα εχει να κάνει με το interface του χρήστη. Με λιγα λογια ... ως εδω έχουμε φτιάξει το 1ο αρχείο μεσα στο οποίο θα ορίσουμε τις συναρτήσεις ως προς την λειτουργία τους. (ΤΙ θελουμε να κάνουν και τι θα πρέπει να επιστρέφουν , με πιο απλα λόγια αλλωστε μια συνάρτηση ειναι μια εντολή η οποια εκτελεί μια ενέργεια συνήθως τροποποιούμενη βάση των ορισμάτων που της δίνεις . Η ενέργεια που εκτελεί έχει να κάνει με τον ορισμό της) -οχι την δηλωσή της στην αρχή.

η 3η λειτουργική μονάδα έχει τον παρακάτω κώδικα
Κώδικας: Επιλογή όλων

#include "module.h"
#include<stdio.h>

int main(void)
{
int ch;

printf
("Dwste A gia to paragontiko , B gia ton MKD kai C gia tin dunami \n");
printf("Dwste q an thelete na bgeite apo to programma\n");
while ((ch = getchar()) != 'q') {
main_interface(ch);
}
printf("Bye World");

return 0;
}


Σε γενικές γραμμές ο χρήστης ανάλογα με το τί θα επιλέξει (και οσο δεν επιλέγει το q ) μεταφέρεται στην 1η λειτουργική μονάδα στην αντίστοιχη ετικέτα οπου εκεί καλείται η αντιτοιχη συνάρτηση... υλοποιεί τους υπολογισμούς της και επιστρέφει ενα αποτέλεσμα. Φυσικα αυτη η συνάρτηση για να καταφέρει να δουλέψει και να αναγνωριστεί θα πρέπει πρωτα να έχει δηλωθεί και ακριβως αυτος ειναι και ο λογος υπαρξης του 2ου πηγαίου αρχείου - λειτουργικής μονάδας. ΟΙ κώδικες υπάρχουν και στην τοποθεσία

https://github.com/simos/starlight

επίσης απο εδω μπορουμε να δούμε με ποιο τρόπο παράγεται το εκτελέσιμο prog
δίνοντας απο το τερματικό την εντολή Makefile και αφου εχουμε εγκαταστήσει το git
η διαδικασία βγαινει μονη της.

2 λογια για τις οντότητες που εμπλέκονται στην διαδικασία

1. Μεταγλωττιστής => Παίρνει σαν είσοδο το αρχικό αρχείο πηγαίου κώδικα σε C με κατάληξη .c και παράγει το αντικειμενικό αρχείο (.o για λινουξ - .obj για windows) . H δουλεια του μεταγλωττιστή ειναι να εξετάσει το αρχειο απο συντακτικά λάθη - τα λογικά δεν τον αφορούν.

2. Το αντικειμενικό αρχείο δεν μπορει να εκτελεστεί με την μορφή που έχει μιας και υπάρχει κώδικα που του λείπει θα πρέπει να γίνει λοιπον η σύνδεση. Η σύνδεση σε γενικές γραμμές χρησιμοποιείται για να το αντικειμενικό αρχείο η ANSI C βιβλιοθήκη και άλλες βιβλιοθήκες για να δημιουργηθεί ο δυαδικός κωδικας - εκτελέσιμο αρχείο.

TIP 1->

Καθώς ειμαστε στον μεταγλωττιστη και εργαζόμαστε όταν πληκτρολογήσουμε την συνθήκη ελέγχου if αμέσως μετα το (f) αν πατήσουμε tab μας βγάζει τον συντακτικό της ορισμό.. δηλαδή τις αγκύλες και τις παρενθέσεις που θα πρέπει να έχει χωρις να χρειάζεται να θυμόμαστε κατι απέξω για αυτήν.

TIP 2 ->

Μιας και μιλήσαμε για include αλλων αρχείων - λειτουργικών μονάδων μεσα στο αρχείο που εργαζόμαστε ή και κάποιο άλλο απο την "ομάδα μας!" καλό θα είναι να θυμόμαστε οτι οι γωνιώδεις αγκύλες στην οδηγία *προεπεξεργαστή #include <stdio.h> λένε στον C προεπεξεργαστή να ψάξει για το αρχείο επικεφαλίδας σε έναν κατάλογο εκτός απο τον τρέχοντα. ΑΝτίθετα αν βάζαμε #include "stdio.h" θα ωθούσαμε τον προεπεξεργαστή να ψάξει πρωτα στον τρέχοντα κατάλογο και μετα αλλού.

*προεπεξεργαστής : ενα πρόγραμμα που κάνει κάποια προετοιμασία στον C μεταγλωττιστή πριν μεταγλωττιστεί ο κωδικάς μας.

Π.Σ Ελπίζω να βοηθήσει αν και θέλει ορισμένες βελτιώσεις... δεν ειναι ακομη 100% έτοιμος :) :) ωστοσο θα χαρω να μου πειτε αν κανω λαθος σε κατι.


Έκατσα και το διάβασα...πολύ καλό και μπράβο σου για την προσπάθεια! Ωρστόσο, μήπως θα μπορούσες να μου εξηγήσεις με δυο λογάκια που μπορώ να το χρησιμοποιήσω? Δηλαδή, πάνω κάτω ήταν κατανοητά αλλα μόλις τελείωσα το διάβασμα αναρωτήθηκα "Ωραία...και τώρα τί?". :( Δυστυχώς! Ίσως είναι επειδή δεν έχω πολύ εμπειρία, ίσως επειδή όπως είπες δεν έχει τελειώσει, απλά νιώθω πως λείπει ο επίλογος(κάτι τέτοιο). Ελπίζω να μην πάρεις στραβά τα "κακά" μου λόγια :P

Φιλικά, Βασίλης!
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

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

linuxs έγραψε:
Έκατσα και το διάβασα...πολύ καλό και μπράβο σου για την προσπάθεια! Ωρστόσο, μήπως θα μπορούσες να μου εξηγήσεις με δυο λογάκια που μπορώ να το χρησιμοποιήσω? Δηλαδή, πάνω κάτω ήταν κατανοητά αλλα μόλις τελείωσα το διάβασμα αναρωτήθηκα "Ωραία...και τώρα τί?". :( Δυστυχώς! Ίσως είναι επειδή δεν έχω πολύ εμπειρία, ίσως επειδή όπως είπες δεν έχει τελειώσει, απλά νιώθω πως λείπει ο επίλογος(κάτι τέτοιο). Ελπίζω να μην πάρεις στραβά τα "κακά" μου λόγια :P

Φιλικά, Βασίλης!


Αν θες να ασχοληθεις σοβαρα με την C θα ερθεις και αντιμετωπος με προβληματα που ειναι δυσκολο να επιλυθουν ενιαια και θα χρειαστει να σπασουν. Αυτος ακριβως ειναι και ο σκοπος του συγκεκριμενου μινι οδηγου να κανει μια εισαγωγη στο πως μπορεις να σπας ενα "μεγαλυτερο" προβλημα σε επιμερους λειτουργικα αρχεια τα οποια το καθενα εχει καποιο λογο υπαρξης και επιτελει μια λειτουργια. Τελος μπορεις να καταλαβεις καλυτερα και την διαδικασια της συνδεσης. Αν δεν κανω λαθος τα 3 αυτα αρχεια κατα την διαδικασια τηνς συνδεσης το ενα θα χρησιμοποιησει κωδικα απο το αλλο ωστε να ενωθουν τελικα σε ενα μοναδικο εκτελεσιμο αρχειο. Ετσι δεν ειναι?

Πρακτικο παραδειγμα αποτελει ο CRC που εχω δωσει και στο αλλο θρεντ... τον βρηκα στο ιντερνετ φυσικα... δεν τον εκανα εγω... αλλα για να τρεξει θελει το header και το user interface δεν εχω προλαβει να κατσω να ασχοληθω αλλα οπως ειπα ειναι ενα πολυ καλο τεστ . Σε πολλα προγραμματα θα χρειαστει να κανεις την παραπανω δουλεια για να μην μακρυγορουμε.. σε οτι μπορεις να φανταστεις ... σε κρυπτογραφησεις... σε κωδικοποιησεις κ.ο.κ
Γνώσεις ⇛ 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: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

Δημοσίευσηαπό linuxs » 01 Ιουν 2011, 01:55

Οπότε μιλάς για να τα σπάς σε πολλά αρχεία και οχι σε συναρτήσεις...? Η και τα δύο...?
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

Δημοσίευσηαπό Star_Light » 01 Ιουν 2011, 02:48

linuxs έγραψε:Οπότε μιλάς για να τα σπάς σε πολλά αρχεία και οχι σε συναρτήσεις...? Η και τα δύο...?


Και τα 2 βασικα. Και σε συναρτησεις αλλα και σε πολλα πηγαια αρχεια. Εσυ ακομη εχεις σκαλωσει στο γιατι χρησιμοποιουμε πηγαια αρχεια? :D
Οι συναρτησεις ετσι και αλλιως θα σπασουν το αρχικο προβλημα σε μικροτερα κομματια ωστε να γινει ευκολοτερη η υλοποιηση του.
Γνώσεις ⇛ 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: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

Δημοσίευσηαπό linuxs » 02 Ιουν 2011, 05:33

χεχε! Έχω ψιλοσκαλώσει στο εξής: Απο την στιγμή που μπορούμε να σπάσουμε έναν αλγόριθμο σε υποπροβλήματα(συνήθως με διαίρει και βασίλευε) θα πρέπει να είναι εξαιρετικά πολύπλοκο το πρόλβημα για να χρειάζεται και διαχωρισμό σε αρχεία όπως λες. Δεν το έχω κάνει ποτέ γιατί δεν χρειάστηκε. Συνήθως, δημιουργώ πολλές συναρτήσεις μόνο. Τέλος πάντων...ίσως έχεις περισσότερη πείρα απο μένα και έχεις δεί περισσότερα.. :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

Δημοσίευσηαπό Star_Light » 03 Ιουν 2011, 02:21

linuxs έγραψε:χεχε! Έχω ψιλοσκαλώσει στο εξής: Απο την στιγμή που μπορούμε να σπάσουμε έναν αλγόριθμο σε υποπροβλήματα(συνήθως με διαίρει και βασίλευε) θα πρέπει να είναι εξαιρετικά πολύπλοκο το πρόλβημα για να χρειάζεται και διαχωρισμό σε αρχεία όπως λες. Δεν το έχω κάνει ποτέ γιατί δεν χρειάστηκε. Συνήθως, δημιουργώ πολλές συναρτήσεις μόνο. Τέλος πάντων...ίσως έχεις περισσότερη πείρα απο μένα και έχεις δεί περισσότερα.. :/


Σιγουρα εχεις ενα δικιο αλλα πρεπει να σκεφτεις και επιπλεον παραμετρους. Σκεψου την συντηρηση ενος προγραμματος και την καλυτερη κατανοηση του. Στοχος μας ειναι να διευκολυνουμε την ζωη μας (οπου μας επιτρεπεται) . Το παραπανω αποτελει ενα στυλ προγραμματισμου. Αυτο το στυλ σε βοηθαει να γραφεις καθαρα προγραμματα που μπορουν ευκολοτερα να διαβαστουν να κατανοηθουν και να συντηρηθουν. Οσο μεγαλωνει το προβλημα θα πρεπει να το χωριζεις σε επιμερους πηγαια αρχεια.

Τωρα αν εχεις σκαλωσει για το συγκεκριμενο προβλημα ΠΟΥ ΕΧΩ βαλει εδω... ναι δεν ειναι απαραιτητο να μπει σε επιμερους αρχεια γιατι δεν ειναι ουτε αρκετα περιπλοκο ουτε αρκετα μεγαλο... ειπα πιο πανω πως θα μπορουσα να το κανω με μια switch και μονο σε καθε ετικετα να γινεται κληση της αντιστοιχης συναρτησης. Αλλα ειπα να το φτιαξω ετσι για να κανω μια εισαγωγη στο θεμα μιας και εχω δωσει τον CRC ΣΕ ΑΛΛΟ νημα... αυτο λοιπον εδω το νημα ειναι το 1ο λεβελ... αν εχεις κατανοησει αυτο τοτε μπορεις να ξεκινησεις και την εφαρμογη CRC .
Γνώσεις ⇛ 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: Προγραμματισμός με Λειτουργικές Μονάδες(modules) σε C

Δημοσίευσηαπό sv1jsb » 03 Ιουν 2011, 09:40

Θα ήθελα να προσθέσω ότι ο χωρισμός ενός προγράμματος σε επιμέρους αρχεία γίνεται και για δύο ακόμα λόγους.
Ο πρώτος και κυριότερος είναι η επαναχρησιμοποίηση, ή αλλιώς δημιουργία βιβλιοθηκών. Στο παραπάνω παράδειγμα το αρχείο module.c μπορεί να χρησιμοποιηθεί και σε άλλο πρόγραμμα που ίσως να χρειάζεται πχ το παραγοντικό. (Με αυτό το σκεπτικό η συνάρτηση main_interface δεν "κολλάει" στο module.c αν θέλουμε να το έχουμε σαν βιβλιοθήκη μας. Μπορεί σε άλλο πρόγραμμα που θα φτιάξουμε να μην έχουμε επαφή με τον χρήστη αλλά να θέλουμε τον παραγοντικό υπολογισμό.). Φανταστείτε τι θα μπορούσες να κάνεις σε C αν δεν υπήρχαν οι βιβλιοθήκες. Τίποτα. Η γλώσσα αυτή καθ' αυτή είναι πολύ λιτή. Όλες οι δυνατότητες της έρχονται από τις βιβλιοθήκες της.
Ένας δεύτερος λόγος είναι η δημιουργία του προγράμματος από διάφορους ανθρώπους. Στο παραπάνω παράδειγμα μπορεί ο ένας να φτιάξει το user interface και ο άλλος τους υπολογισμούς.
Τώρα, κατά πόσο είναι χρήσιμα όλα αυτά όταν φτιάχνεις ένα πρόγραμμα για προσωπική χρήση, εύκολο και μιας χρήσης - δεν ξέρω. Είναι μάλλον προσωπική επιλογή.
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση

Επόμενο

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

cron