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

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

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

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

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

Star_Light έγραψε:
Eλα Χάρη ! Κάπου στο insomnia σε πήρε το μάτι μου να τεχνολογείς ! Tι εγινε ο hex editor... έβγαλες άκρη τελικα? :D

Τον δουλεύω. Όσο προχωράει τόσο πιο σύνθετος γίνεται ο κώδικας. Το search το έβαλα προσωρινά στην άκρη και ασχολούμαι με σελιδοδείκτες τώρα...

Spoiler: show
Εικόνα

Γίνεται σταδιακά δυσκολότερο να διατηρηθεί μονάχα ένα πηγαίο αρχείο, οπότε σίγουρα θα το σπάσω σε μικρότερα. Ήδη υπάρχουν 7 header files (τα 2 είναι γενικότερης φύσης, ενώ άλλα 2 είναι η έξοδος σε δυο γλώσσες: ελληνικά και αγγλικά) ενώ σίγουρα θα χρειαστεί να σπάσει και το πηγαίο σε τουλάχιστον 2-3 μικρότερα.

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

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

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

@migf1
Στο πρώτο μέρος του tutorial σου έχεις γράψει στο πρώτο μερος:
Κώδικας: Επιλογή όλων
printf("The physical memory address of n is %llu\n", (unsigned long long) naddr);
ενώ το nadrr έχει δηλωθεί ως unsigned long long int, άρα προς τι το casting;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

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

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

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

Star_Light έγραψε:@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 ");


Φυσικά και θα δούλευε.
Αλλά γιατί να κάνεις κάτι τέτοιο; Κάνεις τον κώδικα πιο δυσανάγνωστο.
Το σωστό είναι: viewtopic.php?p=234961#p234961
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

Βασικά το πιο ευανάγνωστο (και συνηθισμένο) πάει κάπως έτσι...

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
#define VALID_OPTION(opt) ( (opt) > 0 && (opt) < 4 )
...
bool do_option( int ch )
{
if ( !VALID_OPTION(ch) ) {
puts( "Invalid option" );
return false;
}

if ( 1 == ch )
do_1( ... );

else if ( 2 == ch )
do_2( ... );

else /* 3 == ch */
do_3(...);

return true;
}

int main( void )
{
...
ch = get_option();
do_option(ch);
...
return 0;
}

Εναλλακτικά μπορεί να γίνει με switch...

Μορφοποιημένος Κώδικας: Επιλογή όλων
bool do_option( int ch )
{
switch ( ch )
{
case 1:
do_1( ... );
break;

case 2:
do_1( ... );
break;

case 3:
do_3( ... );
break;

default:
puts( "Invalid option" );
return false;
}

return true;
}

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

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

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

Κώδικας: Επιλογή όλων
if( 1== ch)


Αυτο λογικα οπως και τα αλλα το στοιχίζεις ετσι επειδη ο == ειναι left associative.
Γνώσεις ⇛ 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, 19:00

Δεν ξέρω τι εννοείς όταν λες left-associative, αλλά αυτό είναι απλά μια προληπτική συνήθεια έτσι ώστε να παράξει σφάλμα ο compiler σε περίπτωση που μου ξεφύγει κι αντί για == γράψω =
Τελευταία επεξεργασία από migf1 και 14 Μαρ 2012, 19:26, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

migf1 έγραψε:Δεν ξέρω τι εννοείς όταν λες left-associative, αλλά αυτό είναι απλά μια προληπτική συνήθεια έτσι ώστε να παράξει σφάλμα ο compiler σου περίπτωση που μου ξεφύγει κι αντί για == γράψω =


Eνοοω οτι αυτο

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


δεν μπορεις να το κανεις επειδη (περα απο το οτι το 2 δεν ειναι lvalue) ο τελεστης εκχώρησης ειναι right associative...
απο δεξια προς τα αριστερα γινεται η εκχωρηση δηλαδη. Ετσι και στο αλλο... επειδη ειναι left ο ελεγχος γινεται απο αριστερα
τσεκαρει αν το 1 ειναι ισο με το ch.
Γνώσεις ⇛ 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, 19:17

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

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
enum ColorCode { INVCOLOR = -1, BLACK, RED, GREEN, BLUE, YELLOW, BROWN, MAXCOLORS }; /* INV means invalid */
#define VALID_COLOR(clr) ( (clr) > INVCOLOR && (clr) < MAXCOLORS )
...
int main( void )
{
enum ColorCode color = INVCOLOR;

printf( "Give color-code (%d - %d): ", INVCOLOR+1, MAXCOLORS-1 );
do
mySCANF( "%d", &color );
while ( !VALID_COLOR(color) );
...
return 0;
}

Μπορείτε μελλοντικά να προσθαφαιρέσετε όσους άλλους κωδικούς χρωμάτων θέλετε ανάμεσα στο INVCOLOR και το MAXCOLORS στον enumerator (CYAN, MAGENTA, WHITE, κλπ, κλπ) χωρίς να επηρεαστεί ο υπόλοιπος κώδικας ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 14 Μαρ 2012, 19:31

Αυτή εδώ η γραμμή, τι κάνει define;
Κώδικας: Επιλογή όλων
#define VALID_COLOR(clr) ( (clr) > INVCOLOR && (clr) < MAXCOLORS )
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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