H_ANARXIA_EINAI_PSEMA Δημοσ. 15 Φεβρουαρίου 2015 Δημοσ. 15 Φεβρουαρίου 2015 Σε αυτό το μαθηματικό παιχνίδι ο σκοπός είναι να κάνετε τον αντίπαλο να παίξει τελευταίος, ώστε να κερδίσετε. Ξεκινάτε με 10 πετραδάκια, και μπορείτε να πάρετε 1,2 ή 3 συνεχόμενα πετραδάκια. Ο λόγος που λέγεται κυκλικό είναι ότι μπορείτε να πάρετε π.χ. τα πετραδάκια 10,1,2 (είναι σαν να βρίσκοντε σε κύκλο). Ο κώδικας απαιτεί να γράφετε 1 3 για τα πετραδάκια 1,2,3, και 4 4 για το πετραδάκι 4. Δηλαδή πάντα διαβάζει 2 αριθμούς (ξέρω ότι θα μπορούσα να το καλυτερέψω αλλά δεν βαρίεσε βρε αδερφέ) Παράδειγμα ./cnim 10 *** Game of Circular Nim *** See http://en.wikipedia.org/wiki/Nim#Circular_Nim for rules .......... 0123456789 8 3 _.......__ 0123456 1 3 _.___...__ 0 123 1 1 _.____..__ 0 12 1 2 The winner is P2 Παρακάτω ο κώδικας, σχολιάστε ελεύθερα. #include <stdio.h> #include <stdlib.h> #include <string.h> #define OBJECT_ACCESS(board, i) (board.objects[(i)%board.size]) #define OBJECT_SET(board, i) (OBJECT_ACCESS((*board), i) = 1) #define OBJECT_ISSET(board, i) (!!OBJECT_ACCESS(board, i)) static const char *alphanum = "0123456789abcdefghijklmnopqrstuvwxyz"; typedef struct board { char *objects; int size, moves; } Board; typedef struct input { int position; int size; } Input; void help(const char *prog) { printf("%s <number of objects>\n", prog ? prog : "circ-nim"); exit(0); } int board_init(Board *board, size_t size) /* Init the board to size objects */ { char *objects; if(!size || size > 36) return 1; else if(objects = calloc(size, 1)) { board->objects = objects; board->size = size; board->moves = 0; return 0; } else return 1; } int board_input(Board board, Input *input) /* Read input from stdin and proof-check it */ { int position, size, i, j; char cposition; if(scanf("%c%d", &cposition, &size) != 2) return 1; else if(strchr(alphanum, tolower((unsigned char)cposition)) == NULL) return 1; else if(size < 1 || size > 3) return 1; else position = strchr(alphanum, tolower((unsigned char)cposition)) - alphanum; for(cposition = i = 0; i < board.size; i++) { if(!OBJECT_ISSET(board, i)) { if(cposition == position) break; else cposition++; } } if(cposition != position) return 1; else { for(j = 0; j < size; j++) if(OBJECT_ISSET(board, i + j)) break; if(j != size) return 1; else { input->position = i; input->size = size; } } return 0; } void board_flush(void) /* Read and ignore junk input from stdin */ { (void)scanf("%*[^0-9a-zA-Z]"); } #define board_flush() (void)scanf("%*[^0-9a-zA-Z]") void board_process(Board *board, Input input) /* Play according to input */ { int i; for(i = 0; i < input.size; i++) OBJECT_SET(board, (i + input.position)); board->moves++; } int board_count(Board board) /* How many objects are unset? */ { int i, c; for(i = c = 0; i < board.size; i++) if(!OBJECT_ISSET(board, i)) c++; return c; } int board_finished(Board board) /* Has the game finished? */ { return board_count(board) > 1; } const char *board_winner(Board board) /* Who is the winner? */ { const char *players[] = { "P1", "P2" }; int c = board_count(board); if(c > 1) return "none"; else return players[(board.moves + c) % 2]; } void board_print(Board board) /* Show the board */ { int i, j; for(i = 0; i < board.size; i++) putchar("._"[OBJECT_ISSET(board, i)]); putchar('\n'); for(i = j = 0; i < board.size; i++) putchar(OBJECT_ISSET(board, i) ? ' ' : alphanum[j++]); putchar('\n'); } int main(int argc, char **argv) { Board board; Input input; printf("*** Game of Circular Nim ***\n" "See http://en.wikipedia.org/wiki/Nim#Circular_Nim for rules\n\n"); if(argc != 2) help(*argv); if(board_init(&board, atoi(argv[1]))) return 0; do { board_print(board); do board_flush(); while(board_input(board, &input)); board_process(&board, input); } while(board_finished(board)); printf("The winner is %s\n", board_winner(board)); return 0; }
gon1332 Δημοσ. 15 Φεβρουαρίου 2015 Δημοσ. 15 Φεβρουαρίου 2015 Στην board_init, σε αυτή τη γραμμή: else if(objects = calloc(size, 1)) { θα ήταν καλύτερα αντί για 1 να έβαζες sizeof(char). Για λόγους μεταφερσιμότητας. Βασικά κυρίως αναγνωσιμότητας. Το standard λέει πως ο char είναι εκείνος ο τύπος με το μικρότερο υποστηριζόμενο μέγεθος, το οποίο είναι το 1 byte, αλλά καλύτερα να το παίζεις χαζός εδώ. Δε ξέρεις σε τί αρχιτεκτονική θα κάτσεις. Δε διάβασα παρακάτω, ούτε το έτρεξα ακόμη αλλά γενικά με κούρασε λίγο ο πυκνογραμμένος κώδικας. 1
H_ANARXIA_EINAI_PSEMA Δημοσ. 15 Φεβρουαρίου 2015 Μέλος Δημοσ. 15 Φεβρουαρίου 2015 Έχεις δίκιο είναι πυκνογραμμένο από τις μέρες που έγραφα κώδικα λες και δεν υπήρχε αρκετός χώρος στο δίσκο για να χωρέσει. Θα το ξαναγράψω σε C++
bnvdarklord Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 θα ήταν καλύτερα αντί για 1 να έβαζες sizeof(char). Για λόγους μεταφερσιμότητας. Βασικά κυρίως αναγνωσιμότητας. Το standard λέει πως ο char είναι εκείνος ο τύπος με το μικρότερο υποστηριζόμενο μέγεθος, το οποίο είναι το 1 byte, αλλά καλύτερα να το παίζεις χαζός εδώ. Δε ξέρεις σε τί αρχιτεκτονική θα κάτσεις. Ξέρεις κάποιο παράδειγμα αρχιτεκτονικής στην οποία sizeof(char) != 1; Δεν το ήξερα, αν ισχύει.
Moderators Kercyn Δημοσ. 16 Φεβρουαρίου 2015 Moderators Δημοσ. 16 Φεβρουαρίου 2015 Ξέρεις κάποιο παράδειγμα αρχιτεκτονικής στην οποία sizeof(char) != 1; Δεν το ήξερα, αν ισχύει. Και να μην υπάρχει, με το sizeof είσαι καλυμμένος.
παπι Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Ξέρεις κάποιο παράδειγμα αρχιτεκτονικής στην οποία sizeof(char) != 1; Δεν το ήξερα, αν ισχύει. Όχι, δεν υπάρχει. Η sizeof σου επιστρέφει το μέγεθος σε bytes, το char είναι ενα byte.
migf1 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Αν δεν απατώμαι (βασικά είμαι σχεδόν σίγουρος), το πρότυπο εγγυάται πως το sizeof(char) είναι πάντα 1. Κατά τα άλλα, εγώ δεν έχω καταλάβει πως παίζεται το παιχνίδι. Για παράδειγμα, στο λινκ της βικιπέδιας που δίνεις φίλε η_αναρχία_είναι_ψέμα για την cyclic παραλλαγή, στο τέλος λέει πως δεν υπάρχουν 3 συνεχόμενα objects για να διαλεχτούν και σταματάει. Αλλά στους κανόνες από πάνω λέει πως μπορεί κάποιος να διαλέξει 1 object ή 2 συνεχόμενα objects (ή 3), και αυτά υπάρχουν στο final pattern του παραδείγματος που έχει δώσει. Επίσης, στο δικό σου output, ως 1η κίνηση δίνεις 8 3 η οποία σύμφωνα με τους κανόνες που περιγράφεις από πάνω αντιστοιχεί σε 6 objects (8,9,0,1,2,3). EDIT: Όπα άκυρο, τώρα παρατήρησα πως ναι μεν ο χρήστης δίνει 6 objects, αλλά το πρόγραμμα κρατάει μόνο τα 3 πρώτα. Οπότε τώρα μένει μονάχα η 1η μου απορία. Τί μου διαφεύγει; ΥΓ. Τον κώδικα δεν τον κοίταξα (θα προσπαθήσω να ξεκλέψω λίγο χρόνο αύριο) αλλά με 1η ματιά μου φαίνεται λίγο over-complicated (βασικά μου φαίνεται too much η OOP προσέγγιση για τόσο μικρό πρόγραμμα). Επίσης, ούτε εμένα μου χτυπάει καλά που είναι τόσο πυκνογραμμένος ο κώδικας.
bnvdarklord Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Ευχαριστώ για τις απαντήσεις. migf1 δεν το έχει εξηγίσει καλά, αλλά το 2ο νούμερο είναι πόσες πέτρες θες. Αρα το 8 3 ειναι ξεκινα απο το 8 και παρε 3 προς τα δεξια. Επίσης οι πέτρες εμφανίζονται ως τελείες ".", με τις πάυλες να δειχνουν κενή θεση. Οι αριθμοί από κάτω απλα αριθμούν τις υπάρχουσες πέτρες, οπότε οι αριθμοί δεν δείχνουν πάντα τις ίδιες πέτρες
migf1 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 ... migf1 δεν το έχει εξηγίσει καλά, αλλά το 2ο νούμερο είναι πόσες πέτρες θες. Αρα το 8 3 ειναι ξεκινα απο το 8 και παρε 3 προς τα δεξια. ... Α οκ, thanks! Γιατί όμως στη βικιπέδια λέει πως το παιχνίδι σταματάει επειδή δεν υπάρχουν 3 συνεχόμενα objects? Υπάρχουν 2 συνεχόμενα για να διαλεχτούν. Ο η_αναρχία_είναι_ψέμα βγάζει σωστά το αποτέλεσμα, αλλά μάλλον έχει ξεχάσει να κάνει το τελευταίο print... να δείχνει δλδ το pattern μονάχα με την μονή τελεία με την οποία μένει στο τέλος ο 2ο παίκτης (και πρέπει αναγκαστικά να τη διαλέξει).
imitheos Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 θα ήταν καλύτερα αντί για 1 να έβαζες sizeof(char). Για λόγους μεταφερσιμότητας. Βασικά κυρίως αναγνωσιμότητας. Το standard λέει πως ο char είναι εκείνος ο τύπος με το μικρότερο υποστηριζόμενο μέγεθος, το οποίο είναι το 1 byte, αλλά καλύτερα να το παίζεις χαζός εδώ. Δε ξέρεις σε τί αρχιτεκτονική θα κάτσεις. Ξέρεις κάποιο παράδειγμα αρχιτεκτονικής στην οποία sizeof(char) != 1; Δεν το ήξερα, αν ισχύει. Και να μην υπάρχει, με το sizeof είσαι καλυμμένος. Όχι, δεν υπάρχει. Η sizeof σου επιστρέφει το μέγεθος σε bytes, το char είναι ενα byte. nitpick βέβαια χωρίς σημασία αλλά μια και είμαστε σε φόρουμ κουβέντα να γίνεται . Άπαξ και μιλάμε για C (και όχι για κάποιο pre-ansi compiler που υλοποιεί ποιος ξέρει τι), τότε το sizeof(char) είναι πάντα 1 όπως είπε ο παπί. Όταν λέμε τη λέξη byte όλοι ξέρουμε ότι αυτό ισοδυναμεί με 8 bits. Πολλές φορές όμως, χάριν ευκολίας, χρησιμοποιούμε γνωστούς όρους με λίγο διαφορετικό νόημα από το κανονικό. Για παράδειγμα χρησιμοποιούμε τους όρους KB, MB, GB, κτλ και λέμε "1KB ισοδυναμεί με 1024 bytes, 1MB ισοδυναμεί με 1048576 bytes, κτλ". Το πρόθεμα Κ όμως είναι 1000 (10^3) και όχι 1024 (2^10). Ο όρος που θα έπρεπε να χρησιμοποιούμε είναι KiB, MiB, GiB αλλά χάριν ευκολίας χρησιμοποιούμε τα γνωστά K, M, G, κτλ που είναι ευρέως γνωστά απλά τους αλλάζουμε το νόημα. Το ίδιο γίνεται και με τον όρο byte. Σε σειριακές επικοινωνίες μπορούμε να έχουμε start / stop bits, parity bits, κτλ και όταν αναφέρουμε τον όρο byte να τον εννοούμε στην πραγματικότητα ως 10 bits. Το ίδιο γίνεται και στην C. Για την C, ένα byte ισοδυναμεί με αυτή την ποσότητα bits που χρειάζεται για να αποθηκευθεί ένας char του περιβάλλοντος και έτσι το sizeof(char) θα επιστρέψει πάντα 1 σε όλες τις αρχιτεκτονικές που έχουν C compiler. Μερικοί χρησιμοποιούν τον όρο "C Byte" για πιο σωστά αλλά το πιο συχνό είναι να αναφέρεται ως byte. Υπάρχουν αρχιτεκτονικές που ο char χρειάζεται 9 bits αλλά το sizeof(char) δίνει 1. Επίσης μπορεί να έχουμε υλοποίηση του char ως 16 bits και πάλι το sizeof(char) θα δίνει 1 (και επίσης θα ισχύει sizeof(char) == sizeof(int)). Αυτό δηλαδή που επιστρέφει η sizeof είναι αυτό που η C θεωρεί byte και αυτό θα είναι πάντα 1 για τον char ακόμη και αν χρειάζονται 324 bits για ένα char. 6
defacer Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Ο ημίθεος τα είπε υπερτέλεια. Ένα πράγμα που ίσως αξίζει κανείς να λάβει υπόψη είναι πως αφού όσον αφορά τον compiler δεν υπάρχει διαφορά ανάμεσα σε sizeof(char) και literal 1 η απάντηση είναι στον άνθρωπο. Απ' αυτή την άποψη λοιπόν το sizeof(char) είναι πιο self-explanatory από το νούμερο 1 οπότε ίσως θα έπρεπε να προτιμάται. (από την άλλη βέβαια μιας και έχουμε το context ότι μιλάμε για allocation size σε malloc τότε το 1 είναι επίσης αυτονόητο, τουλάχιστον από ένα επίπεδο και πάνω) 1
H_ANARXIA_EINAI_PSEMA Δημοσ. 16 Φεβρουαρίου 2015 Μέλος Δημοσ. 16 Φεβρουαρίου 2015 ΥΓ. Τον κώδικα δεν τον κοίταξα (θα προσπαθήσω να ξεκλέψω λίγο χρόνο αύριο) αλλά με 1η ματιά μου φαίνεται λίγο over-complicated (βασικά μου φαίνεται too much η OOP προσέγγιση για τόσο μικρό πρόγραμμα). Επίσης, ούτε εμένα μου χτυπάει καλά που είναι τόσο πυκνογραμμένος ο κώδικας. Ο λόγος είναι ότι όταν το έγραψα ήθελα να γράψω και ενα client/server για online gaming. Τότε δεν το έκανα, ίσως το κάνω τώρα (τώρα που έχουμε και τη cpp-netlib!)
gon1332 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Το ίδιο γίνεται και στην C. Για την C, ένα byte ισοδυναμεί με αυτή την ποσότητα bits που χρειάζεται για να αποθηκευθεί ένας char του περιβάλλοντος και έτσι το sizeof(char) θα επιστρέψει πάντα 1 σε όλες τις αρχιτεκτονικές που έχουν C compiler. Μερικοί χρησιμοποιούν τον όρο "C Byte" για πιο σωστά αλλά το πιο συχνό είναι να αναφέρεται ως byte. Έχω κάποιες ενστάσεις/αμφιβολίες. Μπορεί να οφείλονται και στην απειρία μου. Δίαβασα πως ο χαρακτήρας στη C ισοδυναμεί με το μικρότερο μέγεθος το οποίο μπορεί να διευθυν- σιοδοτηθεί σ' ένα σύστημα. Αν είναι όπως τα λες (για "C Byte"), αργκό δηλαδή τότε είμαστε εντάξει. Απλά δεν το είχα ξανακούσει αυτό (λίγα χρόνια εμπειρίας). Από την άλλη το C refe- rence manual της GNU μας λέει ότι είναι 8-bits. Μπερδεύτηκα!!! Υπάρχουν αρχιτεκτονικές που ο char χρειάζεται 9 bits αλλά το sizeof(char) δίνει 1. Επίσης μπορεί να έχουμε υλοποίηση του char ως 16 bits και πάλι το sizeof(char) θα δίνει 1 (και επίσης θα ισχύει sizeof(char) == sizeof(int)). Αυτό δηλαδή που επιστρέφει η sizeof είναι αυτό που η C θεωρεί byte και αυτό θα είναι πάντα 1 για τον char ακόμη και αν χρειάζονται 324 bits για ένα char. Εφόσον ο int έχει μέγεθος 2 ή 4 "C bytes" γιατί η sizeof να είναι ίδια με αυτή του χαρακτήρα; Σύμφωνα με τα προηγούμενα που είπες κι αυτά που ξέρω, το sizeof(char) == sizeof(int)) μεταφ- ράζεται σε: "Το sizeof(char) σε μία αρχιτεκτονική όπου το "C byte", είναι 16-bits, είναι ίδιο με το sizeof(int) σε μία αρχιτεκτονική όπου το "C byte" είναι 8-bits".
migf1 Δημοσ. 16 Φεβρουαρίου 2015 Δημοσ. 16 Φεβρουαρίου 2015 Ο λόγος είναι ότι όταν το έγραψα ήθελα να γράψω και ενα client/server για online gaming. ... Α οκ. Tου έκανα μόλις κι εγώ μια procedural υλοποίηση, με την ορολογία που χρησιμοποιεί η Wikipedia, αλλά με διαφορετικό τρόπο i/ο (βάζω τον χρήστη να γράφει ως string τα objects που θέλει και πάω και τα αντικαθιστώ με τελείες πάνω στο heap, που είναι κι αυτό string). Επίσης έχω βάλει επίτηδες το heap να αποτελείται μονάχα από συνεχόμενα γράμματα μόνο (είναι πιο απλό έτσι). How many objects in heap? 10 HEAP: abcdefghij Moves consist of 1 to 3 chars. Extra chars are ignored. P1: ija HEAP: .bcdefgh.. P2: cde HEAP: .b...fgh.. P1: f HEAP: .b....gh.. P2: gh HEAP: .b........ P1 lost! Press any key to continue . . . Κώδικας: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <ctype.h> #define OBJECTS "abcdefghijklmnopqrstuvwxyz" #define MAX_OBJECTS (int)strlen(OBJECTS) #define MIN_OBJECTS 10 #define VALID_HEAP_LEN( n ) ( (n) >= MIN_OBJECTS && (n) <= MAX_OBJECTS ) #define MAX_MOVESTR_SZ 4 #define PLROUT( moves ) ( 1 + ((moves) % 2) ) /************************************************//** * Read up to sz-1 chars from stdin to an already allocated c-string s. * Return the newly read c-string or NULL on error. * * The newline char, if present in s, is removed. Also, stdin is flushed. **************************************************** */ char *s_get( char *s, size_t sz ) { int c = '\0'; size_t i, len = sz-1; if ( NULL == s || 0 == sz ) { return NULL; } memset(s, 0, sz); for (i=0; i < len && '\n' != (c=getchar()) && EOF != c; i++) { s[i] = c; } s[i] = '\0'; if ( len == i ) { while ( '\n' != (c=getchar()) && EOF != c ) { ; } } return s; } /************************************************//** * Prompt for an integer, read it from stdin and return it. * On error, return INT_MAX. * * Prompting is disabled if NULL is passed as an argument. * In either case, stdin gets flushed. **************************************************** */ int read_int( const char *prompt ) { char input[BUFSIZ] = {'\0'}; int ret = INT_MAX; if ( NULL != prompt ) { printf( prompt ); fflush( stdout ); } if ( NULL == s_get(input,BUFSIZ) || 1 != sscanf(input, "%d", &ret) ) { fprintf( stderr, "*** %s: bad input\n", __func__ ); return INT_MAX; } return ret; } /************************************************//** * Return true if movestr represents either a normal or a cyclic * sequence of consecutive chars in heap. Return false otherwise. * * NOTE: * This function is meant to be called from within: movestr_is_valid() * so it depends on assumptions made there. For example, no sanity checks * are performed on arguments here, movestr is assumed to consist of * lowercase alpha-chars only, etc. **************************************************** */ int _movestr_is_sequence( char *movestr, const char *heap ) { int ret = 0; /* A single-char movestr is a valid sequence only if its * char is a lowercase latin letter present in the heap. */ int len = strlen( movestr ); if ( 1 == len ) { return NULL != strchr(heap,*movestr); } /* * To cope with cyclic sequences, a temp string is created, conisiting * of the alpha-chars of heap + the heap's first strlen(movestr) alpha-chars. * Then strstr() is used to determine whether movestr exists in the heap. */ int heaplen = strlen(heap); char *temp = calloc( 1 + heaplen + len, sizeof(char) ); if ( NULL == temp ) { return 0; } //somewhat similar to strcpy( temp, heap ); int i,j; for (i=0, j=0; i < heaplen; i++) { if ( isalpha(heap[i]) ) { temp[j++] = heap[i]; } } temp[j] = '\0'; //somewhat similar to strncat( temp, heap, len ); for (i=0; i < len; i++) { temp[j+i] = temp[i]; } temp[j+i] = '\0'; ret = (NULL != strstr(temp, movestr)); free( temp ); return ret; } /************************************************//** * Return true if the c-string movestr consists only of lowercase * alpha-chars and it represents a valid heap sequence, otherwise * return false. * * For details see also the function: _movestr_is_sequence(). **************************************************** */ int movestr_is_valid( char *movestr, const char *heap ) { /* sanity checks */ if ( NULL == movestr || NULL == heap || '\0' == *movestr ) { return 0; } char *cp = movestr; while ( '\0' != (*cp = tolower(*cp)) ) { if ( !isalpha(*cp) ) { return 0; } cp++; } return _movestr_is_sequence( movestr, heap ); } /************************************************//** * In the c-string heap, replace with dots all the chars * found in the c-string movestr. Return the updated heap * or NULL on error. * * NOTE: movestr must have been already validated via the * function: movestr_is_valid(). **************************************************** */ char *apply_valid_movestr( const char *movestr, char *heap ) { if ( NULL == heap || NULL == movestr ) { return NULL; } while ( *movestr ) { char *cp = strchr( heap, *movestr ); *cp = '.'; movestr++; } return heap; } /************************************************//** * **************************************************** */ int heap_has_two_or_more_moves( const char *heap ) { if ( NULL == heap ) { return 0; } int count = 0; while ( *heap && count < 2) { if ( isalpha(*heap) ) { count++; } heap++; } return count > 1; } /************************************************//** * **************************************************** */ int main( void ) { /* demand a valid length for the heap */ int n; while ( INT_MAX == (n = read_int("How many objects in heap? ")) || !VALID_HEAP_LEN(n) ){ printf( "*** must be in [%d,%d], try again...\n", MIN_OBJECTS, MAX_OBJECTS ); }; /* create and print the heap */ char *heap = calloc(n+1, 1); if ( NULL == heap ) { goto exit_failure; } for (int i=0; i < n; i++) { heap[i] = OBJECTS[i]; } printf( "HEAP: %s\n\n", heap ); /* input info */ printf( "Moves consist of 1 to %d chars. Extra chars are ignored.\n", MAX_MOVESTR_SZ-1 ); /* game loop */ int moves = 0; while ( heap_has_two_or_more_moves(heap) ) { char movestr[MAX_MOVESTR_SZ] = {'\0'}; for (; { printf( "P%d: ", PLROUT(moves) ); fflush( stdout ); s_get(movestr, MAX_MOVESTR_SZ); if ( !movestr_is_valid(movestr, heap) ) { puts( "*** invalid move, try again..." ); continue; } apply_valid_movestr( movestr, heap ); printf( "HEAP: %s\n\n", heap ); moves++; break; } } printf( "\nP%d lost!\n", PLROUT(moves) ); free( heap ); system( "pause" ); return 0; exit_failure: fprintf( stderr, "*** error: possibly out of memory, bye...\n" ); free( heap ); system( "pause" ); return 1; } Σχετικά με το sizeof(char) σε όσες αρχιτεκτονικές χρησιμοποιούν περισσότερα από 8 bits, οι compilers ορίζουν αντίστοιχα την σταθερά CHAR_BITS στο <limits.h>. Επίσης, πρέπει να είναι τουλάχιστον 8 bits, αλλιώς δεν θεωρούνται compliant με το πρότυπο. Further reading: http://c-faq.com/charstring/wchar.html Tο πρότυπο εγγυάται πως sizeof(char) == 1 ΥΓ. Την απορία που εξέφρασα σχετικά με τη σελίδα της Wikipedia, μπορεί να μου τη λύσει κάποιος;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα