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

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

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

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

Δημοσίευσηαπό migf1 » 28 Ιούλ 2011, 23:58

Τσου!

Το έκανες... αχταρμά εδώ. Ή σκέτη την get_char πρέπει να χρησιμοποιήσεις ή την s_get (ή την fgets) για να διαβάσεις το buffer και να το περάσεις μετά την sscanf.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 29 Ιούλ 2011, 00:53

Παιδιά, να πω 3 απορρίες, τώρα που βλέπω πως κυλά...
1. Τι είναι αυτό το POSSIX;
2. Γίνεται να φτάσουμε σε ένα επίπεδο που πχ να μπορούμε να παραμετροποιούμε το λειτουργικό; Όχι τίποτα πείπλοκο, απλά πράγματα, πχ κάθε φορά που ανοίγουμε το μηχάνημα να λέει "Καλημέρα" και τέτοια. Γίνονται αυτά με C ή μόνο με Python και bash;
3. Να και μια Γενική ερώτηση :D Όταν λέμε ότι η C μπορεί να κάνει τα πάντα(το έχω διαβάσει πάαρα πολλές φορές!) δεν καταλαβαίνω τι παραπάνω προσφέρει από άλλες γλώσσες εκτός από την ταχύτητα;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 29 Ιούλ 2011, 07:44

migf1 έγραψε:Τσου!

Το έκανες... αχταρμά εδώ. Ή σκέτη την get_char πρέπει να χρησιμοποιήσεις ή την s_get (ή την fgets) για να διαβάσεις το buffer και να το περάσεις μετά την sscanf.


Καλημερα συναδελφοιιιι!!!!!
Το ξερω... γιατι μετα απο αυτο που πηγα να κανω ενα παραδειγμα απλο με sscanf δεν μου εβγαινε.... αρα αυτο σημαινει πως την κατανοησα.... μετα επεσα για υπνο. Θα ητν ξαναδω σημερα. :D


stamatiou έγραψε:Παιδιά, να πω 3 απορρίες, τώρα που βλέπω πως κυλά...
1. Τι είναι αυτό το POSSIX;
2. Γίνεται να φτάσουμε σε ένα επίπεδο που πχ να μπορούμε να παραμετροποιούμε το λειτουργικό; Όχι τίποτα πείπλοκο, απλά πράγματα, πχ κάθε φορά που ανοίγουμε το μηχάνημα να λέει "Καλημέρα" και τέτοια. Γίνονται αυτά με C ή μόνο με Python και bash;
3. Να και μια Γενική ερώτηση :D Όταν λέμε ότι η C μπορεί να κάνει τα πάντα(το έχω διαβάσει πάαρα πολλές φορές!) δεν καταλαβαίνω τι παραπάνω προσφέρει από άλλες γλώσσες εκτός από την ταχύτητα;


1. http://el.wikipedia.org/wiki/POSIX
2. Ε μπορεις να φτιαξεις ενα script σε bash και να κανεις αυτο που λες. ΕΞαρταται και πως οριζεται η έννοια του λειτουργικου γιατι σε πολλα βιβλια ειναι συνωνυμη με την εννοια του πυρηνα και μονο. Χωρις κατι αλλο... οπως συστηματα πακετων , βιβλιοθηκες κτλπ. Το linux απο την κοινοτητα ελευθερου λογισμικου του ΕΜΠ θεωρειται απλα και μονο ενας πυρηνας.... + τις βιβλιοθηκες του GNU (libc κτλπ) κανει ενα λειτουργικο συστημα => GNU/Linux.
3. Με την C κανεις διαχειριση σε επιπεδο που σε αλλες γλωσσες δεν υπαρχει η αναγκη... πχ σε επιπεδο bit ή διαχειρισης μνημης κτλπ.
Γνώσεις ⇛ 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 » 29 Ιούλ 2011, 10:00

migf1 έγραψε:Τσου!

Το έκανες... αχταρμά εδώ. Ή σκέτη την get_char πρέπει να χρησιμοποιήσεις ή την s_get (ή την fgets) για να διαβάσεις το buffer και να το περάσεις μετά την sscanf.


ενα ενδεικτικο παραδειγμα οτι καταλαβα την sscanf

Κώδικας: Επιλογή όλων
#include<stdio.h>
#define N 20

int main()
{
char array[N];

printf("dwse enan xaraktira: ");
fgets( array ,20,stdin);
sscanf(array,"%c%d" ,&array[N]);
printf("%c", array[N]);
printf("\n");
printf("%d",array[N]);

return 0;
}


:D

τωρα σχετικα με αυτα που μου ειπες.... δηλαδη αν βαλω εγω... την fgets μετα θα βαλω μονο την sscanf και καμια απο τις get_char ή s_get?????

EDIT: αΚΥΡο.. την s_get την θελω ουτως η αλλως γιατι χρησιμοποιειται και στις αλλες συναρτησεις.... λοιπον κοιτα εγω το εκανα ετσι......

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

int main( void )
{
/*Και εβγαλα και απο εδω το c */
int y,z;
long int l1,l2;
float f1, f2;
char buffer[BUFFER_SIZE] = "";

printf("Dwste enan xarakthra: "); /*Oι τροποποιήσεις */
-> fgets(buffer,BUFFER_SIZE,stdin);
-> sscanf(buffer,"%c", &buffer[BUFFER_SIZE]);
-> printf("dwsate ton xarakthra: %c\n",buffer[BUFFER_SIZE] );
Γνώσεις ⇛ 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++

Δημοσίευσηαπό stamatiou » 29 Ιούλ 2011, 10:27

Star_Light έγραψε:
migf1 έγραψε:Τσου!

Το έκανες... αχταρμά εδώ. Ή σκέτη την get_char πρέπει να χρησιμοποιήσεις ή την s_get (ή την fgets) για να διαβάσεις το buffer και να το περάσεις μετά την sscanf.


Καλημερα συναδελφοιιιι!!!!!
Το ξερω... γιατι μετα απο αυτο που πηγα να κανω ενα παραδειγμα απλο με sscanf δεν μου εβγαινε.... αρα αυτο σημαινει πως την κατανοησα.... μετα επεσα για υπνο. Θα ητν ξαναδω σημερα. :D


stamatiou έγραψε:Παιδιά, να πω 3 απορρίες, τώρα που βλέπω πως κυλά...
1. Τι είναι αυτό το POSSIX;
2. Γίνεται να φτάσουμε σε ένα επίπεδο που πχ να μπορούμε να παραμετροποιούμε το λειτουργικό; Όχι τίποτα πείπλοκο, απλά πράγματα, πχ κάθε φορά που ανοίγουμε το μηχάνημα να λέει "Καλημέρα" και τέτοια. Γίνονται αυτά με C ή μόνο με Python και bash;
3. Να και μια Γενική ερώτηση :D Όταν λέμε ότι η C μπορεί να κάνει τα πάντα(το έχω διαβάσει πάαρα πολλές φορές!) δεν καταλαβαίνω τι παραπάνω προσφέρει από άλλες γλώσσες εκτός από την ταχύτητα;


1. http://el.wikipedia.org/wiki/POSIX
2. Ε μπορεις να φτιαξεις ενα script σε bash και να κανεις αυτο που λες. ΕΞαρταται και πως οριζεται η έννοια του λειτουργικου γιατι σε πολλα βιβλια ειναι συνωνυμη με την εννοια του πυρηνα και μονο. Χωρις κατι αλλο... οπως συστηματα πακετων , βιβλιοθηκες κτλπ. Το linux απο την κοινοτητα ελευθερου λογισμικου του ΕΜΠ θεωρειται απλα και μονο ενας πυρηνας.... + τις βιβλιοθηκες του GNU (libc κτλπ) κανει ενα λειτουργικο συστημα => GNU/Linux.
3. Με την C κανεις διαχειριση σε επιπεδο που σε αλλες γλωσσες δεν υπαρχει η αναγκη... πχ σε επιπεδο bit ή διαχειρισης μνημης κτλπ.

Και πάλι όμως γιατί να κάθομαι να κάνω διαχείρηση bit και τέτοια ενώ σε μια άλλη scripting γλώσσα δεν θα χρειαστεί και θα γίνει (συνήθως) η δουλειά μας πιο γρήγορα;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 29 Ιούλ 2011, 10:54

stamatiou έγραψε:
Και πάλι όμως γιατί να κάθομαι να κάνω διαχείρηση bit και τέτοια ενώ σε μια άλλη scripting γλώσσα δεν θα χρειαστεί και θα γίνει (συνήθως) η δουλειά μας πιο γρήγορα;


εκει πλεον τιθονται αλλα ερωτηματα που ειναι τελειως ασχετα με την πληροφορικη και εχουν να κανουν καθαρα με το τι θες εσυ ο ιδιος. Σε αλλη scripting γλωσσα απλα θα γινει πιο γρηγορα η δουλεια σου οπως ειπες σωστα και ο ιδιος αλλα δεν θα γνωριζεις σε βαθος τι γινεται. Αλλο να εχεις διαβασει κρυπτογραφια και να προσπαθεις να φτιαξεις μια συναρτηση που υλοποιει εναν αλγοριθμο και αλλο αυτη την συναρτηση να την παιρνεις ετοιμη απο το API Της php πχ η md5 / sha κτλπ που υλοποιουν και τους αντιστοιχους αλγοριθμους. Βεβαια και εδω υπαρχουν (C) βιβλιοθηκες που ισως να μην κατσεις να διαβασεις ποτε.... οπως και στην PHP ισως υπαρχουν πιο βαθεια πραγματα... εν πασει περιπτωση λειτουργιες που γινονται στην C δεν γινονται στην PHP πχ διαχειριση μνημης σε πιο χαμηλο επιπεδο , memory layout κτλπ.

Εγω πιστευω πως στον κλαδο μας (ισχυει σε ολους βεβαια τους κλαδους) υπάρχουν άτομα που ψαχνουν μονιμως τι θελει η αγορα κτλπ και αλλοι που δεν τους ενδιαφερει τοσο η αγορα οσο η γνωση και να γουσταρουν αυτο που κανουν. Δεν θα πηγαινα να μαθω τωρα CMS Και Joomla επειδη παιζει στην αγορα σε καμια περιπτωση. Προτιμω C και μην σου πω και assembly.... απλα ακομη δεν εχω τις αναγκαιες βασεις να παιξω με assembly !
Γνώσεις ⇛ 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++

Δημοσίευσηαπό stamatiou » 29 Ιούλ 2011, 11:00

Star_Light έγραψε:
stamatiou έγραψε:
Και πάλι όμως γιατί να κάθομαι να κάνω διαχείρηση bit και τέτοια ενώ σε μια άλλη scripting γλώσσα δεν θα χρειαστεί και θα γίνει (συνήθως) η δουλειά μας πιο γρήγορα;


εκει πλεον τιθονται αλλα ερωτηματα που ειναι τελειως ασχετα με την πληροφορικη και εχουν να κανουν καθαρα με το τι θες εσυ ο ιδιος. Σε αλλη scripting γλωσσα απλα θα γινει πιο γρηγορα η δουλεια σου οπως ειπες σωστα και ο ιδιος αλλα δεν θα γνωριζεις σε βαθος τι γινεται. Αλλο να εχεις διαβασει κρυπτογραφια και να προσπαθεις να φτιαξεις μια συναρτηση που υλοποιει εναν αλγοριθμο και αλλο αυτη την συναρτηση να την παιρνεις ετοιμη απο το API Της php πχ η md5 / sha κτλπ που υλοποιουν και τους αντιστοιχους αλγοριθμους. Βεβαια και εδω υπαρχουν (C) βιβλιοθηκες που ισως να μην κατσεις να διαβασεις ποτε.... οπως και στην PHP ισως υπαρχουν πιο βαθεια πραγματα... εν πασει περιπτωση λειτουργιες που γινονται στην C δεν γινονται στην PHP πχ διαχειριση μνημης σε πιο χαμηλο επιπεδο , memory layout κτλπ.

Εγω πιστευω πως στον κλαδο μας (ισχυει σε ολους βεβαια τους κλαδους) υπάρχουν άτομα που ψαχνουν μονιμως τι θελει η αγορα κτλπ και αλλοι που δεν τους ενδιαφερει τοσο η αγορα οσο η γνωση και να γουσταρουν αυτο που κανουν. Δεν θα πηγαινα να μαθω τωρα CMS Και Joomla επειδη παιζει στην αγορα σε καμια περιπτωση. Προτιμω C και μην σου πω και assembly.... απλα ακομη δεν εχω τις αναγκαιες βασεις να παιξω με assembly !

Oκ ευχαριστώ! :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 29 Ιούλ 2011, 12:12

stamatiou έγραψε:Παιδιά, να πω 3 απορρίες, τώρα που βλέπω πως κυλά...
[snip]
3. Να και μια Γενική ερώτηση :D Όταν λέμε ότι η C μπορεί να κάνει τα πάντα(το έχω διαβάσει πάαρα πολλές φορές!) δεν καταλαβαίνω τι παραπάνω προσφέρει από άλλες γλώσσες εκτός από την ταχύτητα;

Το βασικό πλεονέκτημα της C έναντι των άλλων γλωσσών είναι πως σου δίνει την ελευθερία να κάνεις στην κυριολεξία ότι γουστάρεις στο hardware σου. Με την προϋπόθεση πως ξέρεις τι κάνεις. Πολλοί την ονομάζουν καθόλου άδικα και "Super Assembly". Επίσης, γνωρίζοντας C σε βάθος όχι μόνο αυξάνεις τις πιθανότητες να βρεις καλοπληρωμένη δουλειά, αλλά ουσιαστικά έχεις πάρεις γερές βάσεις για να κατανοήσεις γρήγορα και αποτελεσματικά οποιαδήποτε άλλη γλώσσα.

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

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

Δημοσίευσηαπό stamatiou » 29 Ιούλ 2011, 12:29

Oκ, πάμε στην επόμενη άσκηση; :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 29 Ιούλ 2011, 12:43

Star_Light έγραψε:

ενα ενδεικτικο παραδειγμα οτι καταλαβα την sscanf
Spoiler: show
Κώδικας: Επιλογή όλων
#include<stdio.h>
#define N 20

int main()
{
char array[N];

printf("dwse enan xaraktira: ");
fgets( array ,20,stdin);
sscanf(array,"%c%d" ,&array[N]);
printf("%c", array[N]);
printf("\n");
printf("%d",array[N]);

return 0;
}


:D

Δυστυχώς παραβιάζεις μια από τις βασικές αρχές της sscanf (παραθέτω το σχετικό απόσπασμα από την τεκμηρίωση της συνάρτησης στον gcc 2.7)
GNU libc 2.7 έγραψε:
...
The behavior of this function is undefined if copying takes place between objects that overlap—for example, if s is also given as an argument to receive a string read under control of the ‘%s’, ‘%S’, or ‘%[’ conversion.

Γιατί χρησιμοποιείς το array και ως 1ο και ως 3ο όρισμα της sscanf (δεν έδωσα πουθενά τέτοιο παράδειγμα :p). Επίσης, τι ρόλο παίζει εκείνο το %d που έχεις κολλήσει μετά από το %c στο 2ο όρισμα;

Γενικώς διακρίνω μια τάση σου να περιπλέκεις αχρείαστα τα παραδείγματα που δίνω. Δεν έχω όμως καταλάβει αν αυτό οφείλεται στην ανήσυχη φύση σου ή στο ότι δεν καταλαβαίνεις τα παραδείγματα που δίνω (τείνω να πιστέψω το 2ο, χωρίς να είμαι φυσικά σίγουρος).

Το array σου (που στα δικά μου παραδείγματα το ονομάζω inbuf, ή buffer) πρέπει να το χρησιμοποιήσεις απλά για να διαβάσεις μέσα του την γραμμή της κύριας εισόδου (είτε με την fgets είτε με την s_get) και να το περάσεις μετά στην sscanf ως 1ο της όρισμα. Όποιες μεταβλητές θέλεις να "τραβήξεις" μέσα από το array θα πρέπει να τις έχεις δηλωμένες ξεχωριστά και να περάσεις τις διευθύνσεις τους ως 3ο (4ο, 5ο, κλπ) όρισμα της sscanf, με τα αντίστοιχα % στο 2ο όρισμα της sscanf.

έγραψε:
τωρα σχετικα με αυτα που μου ειπες.... δηλαδη αν βαλω εγω... την fgets μετα θα βαλω μονο την sscanf και καμια απο τις get_char ή s_get?????

έγραψε:
EDIT: αΚΥΡο.. την s_get την θελω ουτως η αλλως γιατι χρησιμοποιειται και στις αλλες συναρτησεις.... λοιπον κοιτα εγω το εκανα ετσι......
Spoiler: show
Κώδικας: Επιλογή όλων

int main( void )
{
/*Και εβγαλα και απο εδω το c */
int y,z;
long int l1,l2;
float f1, f2;
char buffer[BUFFER_SIZE] = "";

printf("Dwste enan xarakthra: "); /*Oι τροποποιήσεις */
-> fgets(buffer,BUFFER_SIZE,stdin);
-> sscanf(buffer,"%c", &buffer[BUFFER_SIZE]);
-> printf("dwsate ton xarakthra: %c\n",buffer[BUFFER_SIZE] );

Κάνεις το ίδιο σφάλμα, περνάς το buffer και ως 1ο και ως 3ο όρισμα στην sscanf.

Αν θες να κρατήσεις μονάχα τον 1ο χαρακτήρα του διαβασμένου buffer σε μια δική σου μεταβλητή c είτε πάρε τον απευθείας με: c = *buffer; (ή: c = buffer[0]; ) ή χρησιμοποίησε την sscanf: sscanf(buffer, "%c", &c);

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

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

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