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

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

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

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

Δημοσίευσηαπό Star_Light » 12 Μαρ 2012, 23:28

A ρε Ηλία! Είσαι τσάκαλος ρε φιλε.

Εικόνα

οποτε διπλα απο το Μεταγλώτιση βάζω την εντολή που αναγκάζει τον gcc να κάνει πιο εξονυχιστικό έλεγχο ε?
Γνώσεις ⇛ 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

Δημοσίευσηαπό Ilias95 » 12 Μαρ 2012, 23:40

Εκεί που λέει "Πηγαίο Αρχείο C Commands", το 2 (Build) κάνε το:
Κώδικας: Επιλογή όλων
gcc -W -Wextra -Wall -std=c99 -o "%e" "%f"

To '-std=c99' είναι προαιρετικό.

Edit: Το 1 (Μεταγλώττιση) άστο όπως είναι.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 12 Μαρ 2012, 23:58

Ilias95 έγραψε:Εκεί που λέει "Πηγαίο Αρχείο C Commands", το 2 (Build) κάνε το:
Κώδικας: Επιλογή όλων
gcc -W -Wextra -Wall -std=c99 -o "%e" "%f"

To '-std=c99' είναι προαιρετικό.

Edit: Το 1 (Μεταγλώττιση) άστο όπως είναι.


a ok!!!! ευχαριστω ;)
Γνώσεις ⇛ 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

Δημοσίευσηαπό Ilias95 » 13 Μαρ 2012, 22:38

Έχω μια απορία σχετικά με την pointer arithmetic.

Έχω το παρακάτω sample που τυπώνει δύο φορές την διεύθυνση στην μνήμη των στοιχείων μιας array:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
int x[5] = {1, 12, 45, 64, 5}, *p;

printf("%p\n", &x[0]);
printf("%p\n", &x[1]);
printf("%p\n", &x[2]);
printf("%p\n", &x[3]);
printf("%p\n", &x[4]);
puts("");

for (p = x; p < x + 5; p++)
printf("%p\n", p);

return 0;
}

Μια output που παίρνω είναι:
Κώδικας: Επιλογή όλων
0xbfe51e48
0xbfe51e4c
0xbfe51e50
0xbfe51e54
0xbfe51e58

0xbfe51e48
0xbfe51e4c
0xbfe51e50
0xbfe51e54
0xbfe51e58


Παρατηρώ ότι η διεύθυνση της μνήμης αυξάνεται κατά 4 μονάδες (;) στο δεκαεξαδικό σύστημα.
Γιατί συμβαίνει αυτό; Έχει να κάνει με το ότι ο τύπος int στο σύστημα μου καταλαμβάνει 4 bytes;

Αυτό που κυρίως δεν μπορώ να καταλάβω είναι πως καταλαβαίνει και μεταφράζει ο compiler την έκφραση p++ όταν η μεταβλητή p είναι pointer και δείχνει σε κάποιο στοιχείο μιας array. Τι ακριβώς του λέει αυτή η εντολή;

"Άλλαξε την διεύθυνση μνήμης σε αυτήν που είναι τώρα συν τόσες μονάδες (;) όσος και ο αριθμός των bytes που καταλαμβάνει ο τύπος της array στην οποία δείχνεις"; :problem:
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 00:52

Γεια χαρα ντάν :P

Ναι! Έχει να κάνει με το οτι ο τύπος int καταλαμβάνει στο συστημα σου 4 bytes.

H παράσταση

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


μεταφράζεται στην ουσία σαν

Κώδικας: Επιλογή όλων
p + n * sizeof(int)


btw μπορεις επισης στον παραπάνω κώδικα να εκχωρήσεις τιμή στον δείκτη σου κατα την δηλωση του
initialization :P

Κώδικας: Επιλογή όλων
int x[5] = {1, 12, 45, 64, 5}, *p=x;


οποτε μετα μεσα στην for

Κώδικας: Επιλογή όλων
for (; p < x + 5; p++)


μπορεις να παιξεις και ετσι δηλαδη ;)

αλλα και ετσι φυσικα

Κώδικας: Επιλογή όλων
for (; p < &x[4]; p++)


το οποιο ηδη θα γνωριζεις !!!!! Μιας και έπαιξες με x+ 5 μέσα.
Γνώσεις ⇛ 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

Δημοσίευσηαπό Ilias95 » 14 Μαρ 2012, 01:15

Star_Light έγραψε:
H παράσταση
Κώδικας: Επιλογή όλων
p++;

μεταφράζεται στην ουσία σαν
Κώδικας: Επιλογή όλων
p + n * sizeof(int)


Όπου n;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 01:34

Το πλήθος των στοιχείων του πινακα σου.

Στην προκειμένη 4 * 5 = 20 bytes.

Κώδικας: Επιλογή όλων
printf("%ld" , sizeof(x));


Ελπιζω να ειμαι συνεπής :P
Γνώσεις ⇛ 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

Δημοσίευσηαπό migf1 » 14 Μαρ 2012, 03:28

Όπως τα είπε ο Κώστας είναι :)

Αν βρεις όρεξη και χρόνο, ρίξε μια ματιά εδώ: http://x-karagiannis.gr/prog/libs/conte ... nters1.php όπου προσπαθώ να τα εξηγήσω στα Ελληνικά με όσο πιο απλά λόγια μπορώ.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 04:56

migf1 έγραψε:Όπως τα είπε ο Κώστας είναι :)

Αν βρεις όρεξη και χρόνο, ρίξε μια ματιά εδώ: http://x-karagiannis.gr/prog/libs/conte ... nters1.php όπου προσπαθώ να τα εξηγήσω στα Ελληνικά με όσο πιο απλά λόγια μπορώ.


Eλα Χάρη ! Κάπου στο insomnia σε πήρε το μάτι μου να τεχνολογείς ! Tι εγινε ο hex editor... έβγαλες άκρη τελικα? :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: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 14 Μαρ 2012, 05:12

@Ilias95

Σχετικα με αυτο που μου επισήμανες τις προάλλες

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

if( ch == 1 )
ISBN_13(ch);
if( ch == 2)
ISBN_10(ch);
if( ch == 3)
UPC(ch);
if( ch!= 1 || ch!=2 || ch!=3 )
printf(" Error Message : There is no option ");


Θα δουλευε και ετσι πιστευω

Κώδικας: Επιλογή όλων
if( ch!= 1 && ch!=2 && ch!=3 )
printf(" Error Message : There is no option ");


Άν καποιος θέλει να αποφύγει την ένθεση στις if.
Πχ αν δεις εναν κωδικα που ειχα φτιαξει πιο παλια :lol: :lol:

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

/**********************************************
* Purpose: Greeting for new
* programmers.
*
* OUTPUT: Greeting messages "WELCOME TO C"
*
* ********************************************/

#include<stdio.h>
int main(void)

{
int ch; // user choice

puts(" Push 1 stars scheme , 2 for squares scheme \n or 3 for a simple greeting (without schemes) : ");
scanf("%d" , &ch);

if( ch ==1 )
{
printf("****************\n");
printf("* WELCOME *\n");
printf("* *\n");
printf("* TO *\n");
printf("* *\n");
printf("* C *\n");
printf("****************\n");
}

if( ch == 2)
{
printf("----------------\n");
printf("| WELCOME |\n");
printf("| |\n");
printf("| TO |\n");
printf("| |\n");
printf("| C |\n");
printf("----------------\n");
}

if( ch == 3)
printf(" WELCOME TO C");

if( ch!= 1 && ch!=2 && ch!=3)
{
printf(" Choice does not exist .");
printf(" You are welcome though!!! ");
}

return 0;
}


Ειχε και αυτος το ιδιο θέμα ενω τωρα πιστευω ειναι εντάξει... απλά ο τελεστής || άφηνε λάσκα τους άλλους τελεστέους πχ
αν ο χρήστης δωσει το η επιλογη ναι μεν δεν θα ειναι το 1 αλλα η συνθηκη βγαινει αληθης μιας και ο δεξιός ειναι TRUE και
υπολογιζεται και το αλλο μηνυμα... ενω πιο πανω τον κοβεις. "Short circuit" που λεει και μεσα το βιβλιαράκι σελ. 76 :D δινει 2 ο χρήστης αλλα απο την στιγμη που δεν ειναι 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
Εκτύπωση

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

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