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

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

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

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

Δημοσίευσηαπό stamatiou » 31 Δεκ 2011, 14:52

medigeek έγραψε:Δεν κατάλαβα την εκφώνηση της άσκησης, ειδικά αυτό το μέρος:
stamatiou έγραψε:
2. Ο χαρακτήρας στη θέση I (δλδ. o 9ος) θα πρέπει να είναι σύμφωνα με το ASCII ίσος με τη θέση Α + 1.

Αυτό θα πει ότι ο 9ος χαρακτήρας θα πρέπει να είναι ο επόμενος από τον πρώτο, πχ αν ο 9ος είναι Β ο πρώτος θα πρέπει να είναι Α :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 01 Ιαν 2012, 20:31

Δηλαδή σύμφωνα με το παράδειγμα σου o πρώτος κανόνας λέει ο χαρακτήρας Β να εμφανίζεται 2 φορές;
Α Β _ _ _ _ _ _ Β _ _ _ _ _ _ _ ;
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 07 Ιαν 2012, 18:06

* Μπορεί κάποιος να φτιάξει ένα απλό c library και να δείξει πως καλείται και πώς γίνεται compile;
* Ποια η διαφορά των βιβλιοθηκών (libraries) static και linked; Μπορείτε να δείξετε ένα παράδειγμα χρήσης static και ένα linked library;
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 07 Ιαν 2012, 19:54

medigeek έγραψε:* Μπορεί κάποιος να φτιάξει ένα απλό c library και να δείξει πως καλείται και πώς γίνεται compile;
* Ποια η διαφορά των βιβλιοθηκών (libraries) static και linked; Μπορείτε να δείξετε ένα παράδειγμα χρήσης static και ένα linked library;

Στην απλή μορφή τους, δεν είναι κάτι το δύσκολο. Απλά δεν βάζεις main() σε κανένα αρχείο, κι αντί να βγάλεις εκτελέσιμο αρχείο στο τέλος, "μαζεύεις" τα *.o αρχεία μέσα σε ένα .a, με τη βοήθεια του: ar utility (man ar).

Αν δηλαδή έχεις φτιάξει μια συλλογή από reusable συναρτήσεις σε ένα αρχείο: libtest.c, τότε κάνεις:

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

gcc -c libtest.c
ar rvs libtest.a libtest.o


Αν έχεις πολλά .c αρχεία, κάνεις:
Κώδικας: Επιλογή όλων

gcc -c *.c
ar rvs libtest.a *.o

Τα παραπάνω είναι για στατική βιβλιοθήκη .a που σημαίνει πως ο ενδιαφερόμενος την ενσωματώνει στο εκτελέσιμο αρχείο του, καλώντας την στο στάδιο του linker.

Μαζί με το .a αρχείο πρέπει να του δώσεις κι ένα .h αρχείο, το οποίο πρέπει κατ' ελάχιστο να περιέχει τα πρότυπα των συναρτήσεων που περιέχονται στα *.c αρχεία της βιβλιοθήκης, με το keyword: extern μπροστά τους.

Οπότε αυτός που θα πάρει το libtest.a και το libtest.h θα βάζει στον κώδικά του...
Κώδικας: Επιλογή όλων

#include "libtest.h"

/* χρήση συναρτήσεων της βιβλιοθήκης libtest.a κατά το δοκούν */

και στο compilation θα γράφει:

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

gcc userprog.c libtest.a -o userprog

Με την προϋπόθεση πως τα αρχεία libtest.h και libtest.a βρίσκονται στον ίδιο φάκελο με το userprog.c

Αν θέλει μπορείς να βάλει το libtest.h στον φάκελο με τα υπόλοιπα include files του gcc, οπότε μέσα στα προγράμματά του, θα γράφει...
Κώδικας: Επιλογή όλων

#include <libtest.h>
...

Κι αν βάλει και το libtest.a στο φάκελο με τις υπόλοιπες βιβλιοθήκες του gcc, τότε μπορεί να γράφει κατά το compilation...
Κώδικας: Επιλογή όλων

gcc userprog.c -o userprog -ltest

Στον gcc για να μπορούν να κληθούν οι βιβλιοθήκες με το -l flag πρέπει να ξεκινάει με "lib" το όνομά τους και το υπόλοιπο του ονόματος (χωρίς το .a) πληκτρολογείται κολλητά μετά το -l.

Υπάρχουν και τα flags -I και -L που δηλώνουν σε ποιους φακέλους να ψάξει ο gcc για έξτρα .h και lib*.a αρχεία, αντίστοιχα (επιπρόσθετα δηλαδή των στάνταρ φακέλων του compiler).

Π.χ. αν έχεις μαζεμένα έξτρα αρχεία .h ας πούμε στον φάκελο: /usr/share/extrainclude/ και έξτρα αρχεία lib*.a ας πούμε στον φάκελο: /usr/share/extralibs/ τότε στη γραμμή εντολών του gcc μπορείς να δώσεις...
Κώδικας: Επιλογή όλων

gcc userprog.c -o userprog -I/user/share/extrainclude -L/usr/share/extralibs -ltest

και μέσα στο userprog.c...
Κώδικας: Επιλογή όλων

#include <libtest.h>
...


Όλα τα παραπάνω αφορούν τον gcc (και τον cc αν θυμάμαι καλά) αλλά ο κάθε compiler έχει δικές τους διαδικασίες και command flags για την δημιουργία και χρήση βιβλιοθηκών, συν ότι οι καταλήξεις και οι ονομασίες των αρχείων διαφέρουν από πλατφόρμα σε πλατφόρμα. Π.χ. στα Windows οι στατικές βιβλιοθήκες έχουν κατάληξη .lib (αντί για .a) ενώ οι δυναμικές έχουν κατάληξη .dll (αντί για .so που έχουν στο Unix/Linux... όπου s = shared).

Οι δυναμικές βιβλιοθήκες (ή αλλιώς shared) δεν γίνονται linked στο εκτελέσιμο αρχείο, αλλά πρέπει να προϋπάρχουν στο σύστημα ώστε να φορτωθούν δυναμικά όταν τις καλεί ένα πρόγραμμα, που χρησιμοποιεί συναρτήσεις τους.

Ορίστε και μερικά κατατοπιστικά links:
http://www.network-theory.co.uk/docs/gc ... ro_79.html
http://tldp.org/HOWTO/Program-Library-H ... aries.html
http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

Μπορείς να δοκιμάσεις να παίξεις με μια απλή και μικρή βιβλιοθήκη που έχω γράψει, που επεκτείνει τη λειτουργικότητα της στάνταρ βιβλιοθήκης για strings: http://x-karagiannis.gr/prog/libs/

Είναι σε pre-Alpha κατάσταση, αλλά μπορείς να τη χρησιμοποιήσεις ως απλό, ζωντανό παράδειγμα για να πειραματιστείς (ένα .h κι ένα .c αρχείο είναι όλα κι όλα).

ΥΓ. Δεν είναι απαραίτητο να φτιάξεις .a αρχείο, μπορείς να χρησιμοποιείς απευθείας τα .o αρχεία μια βιβλιοθήκης. Επίσης στο .h αρχείο μιας βιβλιοθήκης εκτός από πρότυπα συναρτήσεων μπορεί να βρεις και data structures ή/και καθολικές μεταβλητές της βιβλιοθήκης. Ανάλογα με το τι χρειάζεται να είναι public, και που προφανώς το καθορίζει ο δημιουργός της βιβλιοθήκης, βάζοντάς το στο .h που διανείμει.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 07 Ιαν 2012, 21:17

Πολύ ενδιαφέρον!! Ευχαριστώ πολύ για τις επεξηγήσεις και τα παραδείγματα. :)
Δηλαδή αν κάποιος θέλει να χρησιμοποιήσει ένα πρόγραμμα που είναι compiled, θέλει libtest.a (ή .ο) και το libtest.h.
Προσεξα και κάποια .la αρχεία. Αυτά που κολλάνε; Τα δημιουργεί το libtool όπως αναφέρει εδώ, αλλά είναι αναγκαία;
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

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

Ναι, μόνο το .a (ή τα .o) και το .h χρειάζονται για χρήση της βιβλιοθήκης (και η τεκμηρίωση των συναρτήσεών της :) )
ΥΓ. Τα .la δεν ξέρω τι είναι (ούτε το libtool ξέρω τι είναι).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

migf1 έγραψε:ΥΓ. Τα .la δεν ξέρω τι είναι (ούτε το libtool ξέρω τι είναι).

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

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

Δημοσίευσηαπό medigeek » 07 Ιαν 2012, 22:18

OK, θα δω τι κάνει, αν βρω κάτι, το αναφέρω εδώ. Έχω λίγο ελεύθερο χρόνο στα χέρια μου μιας και αρρώστησα. :P
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

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

Με αφορμη τα τελευταια ποστ μου εδω -> viewtopic.php?f=6&t=21638&start=110

εχω αρχισει να μπερδεύομαι επειδη σημερα θυμηθηκα εναν αλλο τυπο που χρησιμοποιούσαμε στο θρεντ της πολυπλοκοτητας

για την αποθηκευση ενος αριθμου.... ο τυπος ελεγε πως δεν θές παραπανω απο

Κώδικας: Επιλογή όλων
log2(N) + 1 bit


δηλαδη για N=8 θέλω 4 => 1000 οποτε ετσι θα αποθηκευτει στο Η/Υ συστημα

αλλα αυτο νομιζω ερχεται σε αντιφαση με το

Κώδικας: Επιλογή όλων
2^n-1 -1
της αναπαράστασης δηλαδη και αυτα bit που αποθηκευονται για εναν αριθμο δεν ειναι? πχ το 2 που πηγα να το αναπαραστησω με 19 ψηφια ... μηπως το έχει ψάξει κανεις ????
Γνώσεις ⇛ 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++

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

Καλησπέρα ! Δοκίμασα να φτιάξω μια δικια μου βιβλιοθήκη σε C
αρχικα εχω το αρχείο calculator.c

Κώδικας: Επιλογή όλων
int calculation(int a , int b , int h)
{
if(h==1)
return a+b;

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

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

if(h==4)
return a/b;

}


μετά εχω το header του

Κώδικας: Επιλογή όλων
int calculator(int a , int b , int h);


έχω δημιουργησει το αντικειμενικο αρχειο calculator.o μεσω του gcc

και επισης εχω δημιουργησει και το libcalculator.a οπου

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

kostas@kostas-SSL:~/PROGRAMS$ file libcalculator.a
libcalculator.a: current ar archive


Aπο αυτην την σελιδα -> http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

την οποια χρησιμοποιησα σαν οδηγο έχω φτασει επιτυχως μεχρι και την εντολη

gcc -c -fPIC calc_mean.c -o calc_mean.o


δεν μου έχει δώσει το σφάλμα ->

cc1: warning: -fPIC ignored for target (all code is position independent)

και απο εκει και κατω δεν ξερω τι γινεται......

δοκιμασα να γράψω κωδικα μεσα στον οποιο θα χρησιμοποιησω την συναρτηση calculator

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


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

int main(void)
{
int a,b,c,h;

printf("Dwse to a \n : ");
scanf("%d",&a);

printf("Dwse to b \n : ");
scanf("%d",&b);

printf(" Dwse to h \n : ");
scanf("%d",&h);

c=calculator(a,b,h);

printf("To apotelesma einai: %d" , c);

return 0;
}


έδωσα και την εντολή

Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~/PROGRAMS$ gcc -c simple_calculations.c -o simple_calculations.o
kostas@kostas-SSL:~/PROGRAMS$ ls | grep simple_calculations
simple_calculations.c
simple_calculations.o
kostas@kostas-SSL:~/PROGRAMS$


και τωρα δεν ξερω τι να κανω :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
Εκτύπωση

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

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