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

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

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

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

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

Κάνει define ένα preprocessor macro, ονόματι VALID_COLOR(), το οποίο ελέγχει αν το όρισμά του (το clr) βρίσκεται ανάμεσα στους ακέραιους INVCOLOR και MAXCOLORS (exclusive). Είναι σαν να έγραφες απευθείας...

Μορφοποιημένος Κώδικας: Επιλογή όλων
( color > INVCOLOR && color < MAXCOLORS )

σε διάφορα σημεία του κώδικά σου, μόνο που με το macro μπορείς να το χρησιμοποιήσεις και με οποιαδήποτε άλλη μεταβλητή εκτός της color (περίπου όπως κάνες δηλαδή και με τα ορίσματα των συναρτήσεων... λέω περίπου, γιατί τα ορίσματα των macros δεν ελέγχονται από τον compiler για το αν έχουν τον αναμενόμενο τύπο-δεδομένων... no data-type checking ).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Αχά! Επίσης αυτός ο κώδικας από πού προέκυψε;
Κώδικας: Επιλογή όλων
...
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;
}

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, 20:13

Τώρα τον έγραψα, για να σας δείξω το τρικάκι ;)

Επίσης, αν το εύρος τιμών είναι πολύ μεγάλο, τότε τα όρια μπορούν να οριστούν σε ξεχωριστά define...

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
#define LOLIM -10001
#define HILIM 10001
#define IN_RANGE(n) ( (n) > LOLIM && (n) < HILIM )
...
int main( void )
{
int n = LOLIM;

printf( "Enter an integer from %d to %d: ", LOLIM+1, HILIM-1 );
do
mySCANF( "%d", &n );
while ( !INRANGE(n) );
...
return 0;
}

Κι αν θέλετε να το κάνετε πολύ strict, για να είναι πιο εμφανές πως π.χ. κάποιες μεταβλητές του προγράμματός σας προορίζονται αποκλειστικά για το συγκεκριμένο εύρος τιμών, μπορείτε να κάνετε κάτι σαν το παρακάτω...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
...
#define MYINT_ISVALID(n) ( (n) > MYINT_LOLIM && (n) < MYINT_HILIM )

enum {
MYINT_LOLIM = -10001,
MYINT_HILIM = 10001
};

typedef int MyInt;
...
int main( void )
{
MyInt n1, n2;

printf( "Give 2 integers, in the range %d to %d: ", MYINT_LOLIM+1, MYINT_HILIM-1 );
mySCANF( "%d %d", &n1, &n2);

if ( !MYINT_ISVALID(n1) || !MYINT_ISVALID(n2) ) {
printf( "out of range error" );
exit( EXIT_FAILURE );
}

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

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

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

A, btw, σύμφωνα με το προτεινόμενο στυλ γραφής από τον οργανισμό ANSI, τα pre-preprocessor macros & defines γράφονται με κεφαλαία γράμματα, οι πρόσθετοι τύποι ( typedef ) καθώς και τα struct/union/enum γράφονται με κεφαλαίο το 1ο γράμμα (και όποιων 2ων ή 3ων λέξεων περιέχει η ονομασία τους, π.χ.: MyInt).

Τέλος, οι στάνταρ τύποι, οι μεταβλητές και οι συναρτήσεις γράφονται με πεζά γράμματα. Κατά προτίμηση, οι μεταβλητές χωρίς τον χαρακτήρα _ στα ονόματά τους, ενώ οι συναρτήσεις με τον χαρακτήρα _ ως διαχωριστικό αν αποτελούνται από πολλές λέξεις.

Με αυτό τον τρόπο μπορούμε να ξεχωρίζουμε αμέσως αν αυτό που διαβάζουμε είναι macro/define, αν είναι συνάρτηση, αν είναι μεταβλητή ή αν είναι στάνταρ ή πρόσθετος τύπος.

Μπορείτε να διαβάσετε την ANSI πρόταση εδώ: Standards and Style for Coding in ANSI C

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

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

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

migf1 έγραψε:Κατά προτίμηση, οι μεταβλητές χωρίς τον χαρακτήρα _ στα ονόματά τους

Δηλαδή τι θα γράψουμε αντί για: ;
Κώδικας: Επιλογή όλων
int this_is_a_variable = 5;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

Ilias95 έγραψε:
migf1 έγραψε:Κατά προτίμηση, οι μεταβλητές χωρίς τον χαρακτήρα _ στα ονόματά τους

Δηλαδή τι θα γράψουμε αντί για: ;
Κώδικας: Επιλογή όλων
int this_is_a_variable = 5;

Τα μόνα που μπορώ να φανταστώ είναι thisisavariable και σκέτο variable :/
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

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

Οι μεταβλητές ειναι ουσιαστικα τοποθεσίες στην μνήμη που κρατάνε τις τιμές που δίνουμε...

πχ
Κώδικας: Επιλογή όλων
int x=1;


Αυτες οι τοποθεσιες σε ποια μνημη ακριβως βρισκονται ομως? :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

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

stamatiou έγραψε:
Ilias95 έγραψε:
migf1 έγραψε:Κατά προτίμηση, οι μεταβλητές χωρίς τον χαρακτήρα _ στα ονόματά τους

Δηλαδή τι θα γράψουμε αντί για: ;
Κώδικας: Επιλογή όλων
int this_is_a_variable = 5;

Τα μόνα που μπορώ να φανταστώ είναι thisisavariable και σκέτο variable :/

Εντελώς δυσανάγνωστο το thisisavariable. :sick:
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

Ilias95 έγραψε:
migf1 έγραψε:Κατά προτίμηση, οι μεταβλητές χωρίς τον χαρακτήρα _ στα ονόματά τους

Δηλαδή τι θα γράψουμε αντί για: ;
Κώδικας: Επιλογή όλων
int this_is_a_variable = 5;

Κάτι μικρότερο, όπως π.χ.: var

Βασικά πρόκειται για προτάσεις, χωρίς να είναι υποχρεωτική η πιστή εμμονή σε αυτές... ή μπορεί να γίνουν κάποιες εξαιρέσεις αν δεν γίνεται αλλιώς. Είναι προτιμότερο όμως τα ονόματα των μεταβλητών να είναι σύντομα κι εύστοχα.

Π.χ. ...
Μορφοποιημένος Κώδικας: Επιλογή όλων
arrlen /* ή lenarr */
arrsize /* ή szarr */

αντί για...
Μορφοποιημένος Κώδικας: Επιλογή όλων
array_length // ή lenght_of_array
array_size /* ή size_of_array*/


Πάντως δεν κάνουν όλα τα στυλ γραφής για όλα τα projects. Π.χ. όταν δουλεύεις με GUI είναι εξαιρετικά δύσκολο να κρατήσεις μικρά τα ονόματα των συναρτήσεων, ενίοτε και των μεταβλητών. Εκεί συνηθίζεται πολύ το CamelCase convention και στα δυο, , όπου το σύνηθες είναι οι μεταβλητές να ξεκινάνε με πεζό γράμμα που προσδιορίζει τον τύπο τους, ενώ οι συναρτήσεις ξεκινάνε με κεφαλαίο.

Π.χ...
Μορφοποιημένος Κώδικας: Επιλογή όλων
/* μεταβλητές */
size_t szArray;
bool bEnabled;

/* συναρτήσεις */
size_t ArraySize();
bool IsEnabled();

Επίσης, σε ANSI στυλ είναι βολικό το tab-size ίσο με 8, αλλά για GUI είναι πολύ μεγάλο, συνηθίζεται 4 (το GTK+ προτείνει 2).

Γενικώς υπάρχουν διάφορα στυλ, π.χ...

Linux Kernel Style: http://www.mjmwired.net/kernel/Document ... odingStyle
GTK+ Coding Style: http://git.gnome.org/browse/gtk+/plain/ ... DING-STYLE
Windows Coding Style: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
GNU style: http://www.gnu.org/prep/standards/stand ... #Writing-C
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Σε αυτό το πρόγραμμα:
Κώδικας: Επιλογή όλων
#include <stdio.h>

char *s_get2( char *s, int n )
{
register int i=0;

*s = fgetc( stdin );
while ( *s != '\n' && i < n-1 )
{
i++;
s++;
*s = fgetc( stdin );
}
*s = '\0';

return s;
}

int main(void) {
char s[100+1],*p;
p = s_get2(s,100+1);
printf("%s",p);
return 0;
}

Το p δεν θα πρέπει να δείχνει στο τέλος του s;
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
Εκτύπωση

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

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