Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 25 Ιαν 2012, 12:42

Καλημέρα,

η 2η εντολή είναι η στάνταρτ του gcc για να κάνει compile & link πολλά αρχεία, είτε είναι .c είτε .o ...

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

gcc src1.c src2.c src3.c obj1.o obj2.o

Το -o filename στο τέλος είναι προαιρετικό για να ορίσεις δικό σου όνομα στο εκτελέσιμο που θα παραχθεί, αλλιώς θα το ονομάσει a.out.

Όσο για το b=0, αυτό πρέπει να το προβλέψεις στον κώδικά σου, δεν έχει καμία σχέση με τη γραμμή εντολών του gcc.

Τα .h δεν μπαίνουν στη γραμμή εντολών του gcc (δεν είμαι 100% σίγουρος) ... αυτά τα κάνεις #include μέσα στα πηγαία αρχεία σου (.c)... στη γραμμή εντολών του gcc μπορείς να χρησιμοποιήσεις το flag -I (κεφαλαίο i) και να του κολλήσεις μια διαδρομή φακέλων στους οποίους μπορείς να έχεις μαζεμένα .h αρχεία, για να τα βρίσκει όταν αναφέρονται σε αυτά τα πηγαία αρχεία σου.

Και τέλος, όχι δεν έχεις βιβλιοθήκη με την ευρύτερη έννοια. Έχεις ένα object αρχείο. Οι βιβλιοθήκες συνήθως είναι συλλογές από object αρχεία, πακεταρισμένα μέσα σε ένα αρχείο με κατάληξη .a αν πρόκειται για στατική βιβλιοθήκη ή με κατάληξη .so αν πρόκειται για shared βιβλιοθήκη.

Αλλά και τα σκέτα .o αρχεία την ίδια δουλειά κάνουν (απλώς είναι πιο δύσκολο να τα γράφεις όλα κάθε φορά, ένα-ένα στη γραμμή εντολών του gcc)
Τελευταία επεξεργασία από migf1 και 25 Ιαν 2012, 13:03, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 25 Ιαν 2012, 12:48

Καλημερααα !

Για αυτο μου ειπες χθες να τρέξω το ./a.out

η βιβλιοθηκη δηλαδη τι παραπανω παρεχει απο αυτο που παμε τωρα να φτιαξουμε?

οτι δηλαδη εχει πανω απο ενα .ο αρχεια? δηλαδη αντι για 1 συναρτηση που εχω τωρα εγω σαν δηλωση και ορισμο
θα εχει παραπανω αυτο?
Γνώσεις ⇛ 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/C++

Δημοσίευσηαπό migf1 » 25 Ιαν 2012, 12:52

Θυμήθηκα και κάτι σχετικο-άσχετο τώρα. Παλιότερα που η μνήμη ήταν μεγάλο πρόβλημα, πολλοί έφτιαχναν την κάθε συνάρτηση σε ένα μόνο πηγαίο αρχείο, οπότε π.χ. για 10 συναρτήσεις, έφτιαχναν 10 ξεχωριστά .c αρχεία. Κατόπιν τα έκαναν...

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

gcc -c *.c

για να δημιουργηθούν 10 αντίστοιχα .o αρχεία, τα οποία με τη σειρά τους τα πακετάριζαν σε ένα .a αρχείο βιβλιοθήκης...

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

ar -rvs libmine.a *.o


Με αυτό τον τρόπο όταν έκαναν link την βιβλιοθήκη σε άλλα προγράμματά τους, γινόταν ουσιαστικά link μονάχα τα object αρχεία των συναρτήσεων που χρησιμοποιούσε το πρόγραμμά τους, και όχι ένα ενιαίο με όλες τις συναρτήσεις.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 25 Ιαν 2012, 12:57

Star_Light έγραψε:
...

η βιβλιοθηκη δηλαδη τι παραπανω παρεχει απο αυτο που παμε τωρα να φτιαξουμε?

οτι δηλαδη εχει πανω απο ενα .ο αρχεια? δηλαδη αντι για 1 συναρτηση που εχω τωρα εγω σαν δηλωση και ορισμο
θα εχει παραπανω αυτο?

Ναι, συλλογή από .o αρχεία είναι η κάθε βιβλιοθήκη (ή από .so αρχεία αν είναι shared βιβλιοθήκη). Το κάθε .o αρχείο περιέχει όλες τις συναρτήσεις που έχεις ορίσει στο αντίστοιχο .c αρχείο.

Είναι πολύ πιο εύκολο να τη διαχειρίζεσαι ως ένα ενιαίο αρχείο, αντί για πολλά, όταν την κάνεις link σε άλλα προγράμματα.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 25 Ιαν 2012, 15:15

Μαλιστα! Ωραια. Οποτε για μια πρωτη γνωριμια με τις βιβλιοθηκες πιστευω ειναι ενταξει! Αν ακολουθησω τα βηματα που μου ειπες σε αυτο που εχω φτιαξει ηδη
τι παραπανω θα καταφερω ας πουμε???
Γνώσεις ⇛ 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/C++

Δημοσίευσηαπό migf1 » 25 Ιαν 2012, 15:21

Θα καταφέρεις γενικές συναρτήσεις που τις χρησιμοποιείς πολύ συχνά αλλά δεν ανήκουν στις στάνταρ βιβλιοθήκες της γλώσσας, να μη τις ξαναγράφεις από την αρχή. Θα τις έχεις σε μια βιβλιοθήκη (π.χ. libmine.a) κι από εκεί και πέρα σε όποιο άλλο πρόγραμμα θες να τις χρησιμοποιήσεις θα προσθέτεις απλά ένα...

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

#include "libmine.h"

και στο compilation των καινούριων προγραμμάτων θα προσθέτεις -lmine στο τέλος της γραμμής εντολών του gcc.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 25 Ιαν 2012, 20:19

ετοιμο το αρχειακι με τον ορισμο της συνάρτησης μαζι με τους ελεγχους (αν και δεν μου εκτυπωνει την printf που ειναι μεσα στα if ακομη δεν ξερω γιατι) δηλαδη το σφάλμα διαιρεσης :S

calculator.c

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

#include<stdio.h>

int calculator(int a , int b , int ch )
{
if(ch==1)
return a+b;

if(ch==2)
return a-b;

if(ch==3)
return a*b;

if(ch==4)
{
if(b==0)
{
printf("Sfalma diairesis \n");
return -1;

}
else if(b!=0)
{
return a/b;

}
}
}


Kαλα δειχνει να πηγαινει ως τωρα.....

EDIT: Ακυρότητες! Το εκτυπωνει κανονικα! ΣΤραβομαρα... απλα ειμαι με 4 ωρες υπνο και ετρεχα σημερα απο το πρωι !

Παντως ειναι πολυ πιο βελτιστο πιστευω να περνάς σαν παράμετρο μεσα σε μια συνάρτηση την επιλογη του χρηστη απο το να οριζεις μια switch και αναλογα την ετικέτα της να καλεις την καθε συναρτηση ξεχωριστα που υλοποιει ας πουμε καθε πραξη ξεχωριστα... θυμαμαι σε κατι υλοποιησεις παλαιοτερα στην σχολη αυτο ειχα κανει! Ο χείριστος!!!!!
Γνώσεις ⇛ 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/C++

Δημοσίευσηαπό giannosfor » 25 Ιαν 2012, 23:50

Να ρωτήσω κάτι (εκτός θέματος) ,πώς μπορείς να χρησιμοποιήσεις μία βάση δεδομένων με c ;
1 Γνώσεις Linux: Καθόλου ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 12.04 precise 3.2.0-58-generic 32bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.2.0-57-generic, Microsoft Windows XP Professional
3 Intel Core2 Duo CPU E4600 2.40GHz ‖ RAM 2012 MiB ‖ ASUS INC. P5Q - � P5Q
4 nVidia G94 [GeForce 9600 GT] [10de:0622] {nvidia}
5 eth0: Qualcomm Atheros AR8121/AR8113/AR8114 Gigabit or Fast Ethernet [1969:1026] (rev b0) ⋮ wlan0: 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Άβαταρ μέλους
giannosfor
punkTUX
punkTUX
 
Δημοσιεύσεις: 297
Εγγραφή: 24 Απρ 2011, 20:24
Τοποθεσία: Ηράκλειο
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 26 Ιαν 2012, 00:26

giannosfor έγραψε:Να ρωτήσω κάτι (εκτός θέματος) ,πώς μπορείς να χρησιμοποιήσεις μία βάση δεδομένων με c ;

Εντός θέματος είναι :)

Αν εννοείς από τις έτοιμες, συνήθως υπάρχει έτοιμη υποστήριξη.

Για παράδειγμα:
MySQL: C connector - Τεκμηρίωση
SQLite: C Interface
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 26 Ιαν 2012, 00:29

Να κι ένα πολύ απλό παράδειγμα για σύνδεση σε μια mysql βάση και τύπωμα των πινάκων που περιέχει...

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

#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server = "localhost";
char *user = "root";
char *password = "";
char *database = "mysql";

conn = mysql_init(NULL);

/* Connect to database */
if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

/* send SQL query */
if (mysql_query(conn, "show tables")) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

res = mysql_use_result(conn);
/* output table name */
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
printf("%s \n", row[0]);

/* close connection */
mysql_free_result(res);
mysql_close(conn);
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι