monkey90 Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Έχω μια συνάρτηση η οποία ψάχνει έναν πίνακα και , αναλογα τι θα βρει, επιστρέφει τις συντεταγμένες από καμία, μία η δύο θέσεις του πίνακα. Σκέυτομαι να το κάνω με ενα char string[]. Υπάρχει κάποιος καλύτερος τρόπος;
computeras13 Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Μια άλλη λύση που μου έρχεται στο μυαλό είναι να επιστρέφεις έναν πίνακα με τις συντεταγμένες και άλλη μια μεταβλητή με το μέγεθος του πίνακα.
nilosgr Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Μπορείς να κανείς μια struct, πχ >struct TwoCoords { int x1, y1; int x2, y2; }; struct TwoCoords myFunction(...); Κάτι τέτοιο και αν δεν θες να χρησιμοποιήσεις τις τιμές, επειδή πχ δεν βρήκες αυτό που θες στον πίνακα τότε θα βάζεις τις τιμές ίσες με μια "άκυρη" τιμή, πχ -1
ExaByte Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Έχω μια συνάρτηση η οποία ψάχνει έναν πίνακα και , αναλογα τι θα βρει, επιστρέφει τις συντεταγμένες από καμία, μία η δύο θέσεις του πίνακα. Σκέυτομαι να το κάνω με ενα char string[]. Υπάρχει κάποιος καλύτερος τρόπος; μπορεις να γίνεις λίγο πιο περιγραφικός;;
monkey90 Δημοσ. 15 Μαΐου 2012 Μέλος Δημοσ. 15 Μαΐου 2012 Ευχαριστω για τις συμβουλες σας. Exabyte έχω έναν πίνακα array[8][8] και έχω φτιάξει μια συνάρτηση(στην οποία δίνω ως όρισμα τον πίνακα) η οποία ψάχνει αν μια θέση του πίνακα (δεν υπάρχει περίπτωση να είναι δύο) τηρεί δύο προυποθέσεις. Άμα τις τηρει όλες θέλω να επιστρέψει τις συντεταγμένες της συγκεκριμένης θέσης καθώς και τις συντεταγμένες δύο άλλων θέσεων του πίνακα(τις οποίες έχω εντοπίσει μέσα στη συνάρτηση). Αν τηρει τις μισές θέλω να επιστρέψει τις συντεταγμένες της συγκεκριμένης θέσης καθώς και τις συντεταγμένες μίας θέσεις του πίνακα και αν δεν τηρεί καμία κάτι συμβολικό ώστε να ξέρω ότι δεν βρήκε τίποτα. Ορίστε και η συνάρτηση μέχρι στιγμής > char checking(char board[8][8], int turn) { int i,j; char r[5]; //ayto tha allaksei psaxnw ton tropo for(i=0;i<8;i++) { if(turn==1) { if(board[i][j]=='X') { if(board[i+1][j+1]=='O') { if(board[i+2][j+2]=='.') { //edw tha valw kapou tis syntetagmenes i,j kai tis syntetagmenes i+2,j+2 } } if(board[i+1][j-1]=='O') { if(board[i+2][j-2]=='.') { //edw tha valw kapou tis syntetagmenes i,j kai tis syntetagmenes i+2,j-2 } } } } else { if(board[i][j]=='O') { if(board[i-1][j+1]=='X') { if(board[i-2][j+2]=='.') { //edw tha valw kapou tis syntetagmenes i,j kai tis syntetagmenes i-2,j+2 } } if(board[i-1][j-1]=='X') { if(board[i-2][j-2]=='.') { //edw tha valw kapou tis syntetagmenes i,j kai tis syntetagmenes i-2,j-2 } } } } } return r; } ps: στο πρώτο comment λέω καμία,μία η δυο ενώ είναι καμία δύο η τρεις. Αν και δεν αλλάζει ο τρόπος που θα γίνει το αναφέρω.
migf1 Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Σίγουρα όχι με string, μιας και είναι αχρείαστο overhead. Ο πίνακάς σου είναι 1D ή 2D; Αν είναι 2D, εγώ θα τον όριζα ως 1D (με τον τρόπο που έχουμε αναλύσει σε πάρα πολλά ποστς εδώ στο φορουμ) και κατόπιν στην συνάρτηση που τον σκανάρει θα πέρναγα κι έναν ακόμα μονοδιάστατο πίνακα αποτελούμενο από 3 int (έναν για κάθε συντεταγμένη που θέλω να μου επιστρέφει) αρχικοποιημένο σε -1. > int arr_lookup(datatype *arr, data_type data, int *posfound ) { int i, j; posfound[0] = posfound[1] = posfound[2] = -1; for (i=0,j=0; i < MAXELEMS; i++) if ( arr[ i ] == data ) { posfound[ j ] = i; j++; } return (-1 == posfound[ 0 ] ? -1 : j); } int main( void ) { int npos, posfound[3] = {-1, -1, -1}; data_type arr[ MAXELEMS ]; npos = arr_lookup( arr, data, pos ); for ( int i=0; i < npos; i++) printf( "%d ", posfound[i] ); puts('\b'); return 0; } ΥΓ. Ελπίζω να μην έχω καμιά απροσεξία βιασύνης, γιατί δεν το δοκίμασα... το έγραψα απευθείας εδώ. EDIT: Γράφαμε μαζί, οπότε το παραπάνω είναι κατά ήμισυ άκυρο (στην συνάρτηση lookup() δηλαδή όπου εγώ υπέθεσα πως έψαχνες πολλές εμφανίσεις του ίδιου data μέσα στον arr).
monkey90 Δημοσ. 15 Μαΐου 2012 Μέλος Δημοσ. 15 Μαΐου 2012 Το έκανα με struct. Φένεται εντάξει; > struct ThreeCoords checking(char[][], int); typedef struct { int x0=-1,y0=-1; int x1=-1,y1=-1; int x2=-1,y2=-1; }ThreeCoords; struct checking(char board[8][8], int turn) { int i,j,k=0; ThreeCoords r; for(i=0;i<8;i++) { if(turn==1) { if(board[i][j]=='X') { if(board[i+1][j+1]=='O') { if(board[i+2][j+2]=='.') { r.x0=i; r.y0=j; r.x1=i+2; r.y1=j+2; k=1; } } if(board[i+1][j-1]=='O') { if(board[i+2][j-2]=='.') { r.x0=i; r.y0=j; if(k==1) { r.x2=i+2; r.y2=j-2; } else { r.x1=i+2; r.y1=j-2; } } } } } else { if(board[i][j]=='O') { if(board[i-1][j+1]=='X') { if(board[i-2][j+2]=='.') { r.x0=i; r.y0=j; r.x1=i-2; r.y1=j+2; k=1; } } if(board[i-1][j-1]=='X') { if(board[i-2][j-2]=='.') { r.x0=i; r.y0=j; if(k==1) { r.x2=i-2; r.y2=j-2; } else { r.x1=i-2; r.y1=j-2; } } } } } } return r; }
migf1 Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Επειδή είμαι κουρασμένος για να διαβάσω τον κώδικα (που btw μου φαίνεται αχρείαστα πολύπλοκος, από ένστικτο εννοώ) για πες τι ακριβώς θέλεις να κάνεις. Ποιες είναι οι προϋποθέσεις που πρέπει να τηρηθούν; Πάντως σε γενικές γραμμές, η διαχείριση ενός μονοδιάστατου πίνακα σαν να ήταν δισδιάστατος απλοποιεί αρκετές διαδικασίες (και περιπλέκει κάποιες άλλες). ΥΓ. Έχω πήξει με το Win32API
monkey90 Δημοσ. 15 Μαΐου 2012 Μέλος Δημοσ. 15 Μαΐου 2012 Καταρχάς ευχαριστώ πολύ για το χρόνο σου.Ο κώδικας μέσα στη συνάρτηση πρέπει να είναι σωστός. Μου βγάζει warning no semicolon at end of struct or union μεσα στο struct στη γραμμή του int x0=-1,y0=-1;
migf1 Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Καταρχάς ευχαριστώ πολύ για το χρόνο σου.Ο κώδικας μέσα στη συνάρτηση πρέπει να είναι σωστός. Μου βγάζει warning no semicolon at end of struct or union μεσα στο struct στη γραμμή του int x0=-1,y0=-1; Ναι, δεν μπορείς να αρχικοποιήσεις στον ορισμό των struct. Μπορείς να αρχικοποιήσεις μεταβλητές που ορίζεις να είναι τύπου struct. Δηλαδή... > typedef struct Point { float x,y; } Point; ... int main( void ) { Point point = { -1.0, -1.0 }; // ή σε C99: Point point = { .x = -1.0, .y = -1.0 }; } ή μπορείς π.χ... > int main( void ) { struct Point { float x,y; } point = {1.0, 1.0 }; ΥΓ. Τελικά ποιες είναι οι προϋποθέσεις;
monkey90 Δημοσ. 15 Μαΐου 2012 Μέλος Δημοσ. 15 Μαΐου 2012 Σας ευχαριστώ πολύ.Βρήκα τα λάθοι(κάνει compile). Βασικά προσπαθώ να φτιάξω προσομοίωση του παιχνιδιού checkers. Τα 'Χ' συμβολίζουν τα πούλια του ενός παίχτη, τα 'Ο' του άλλου και τα '.' τα κενά. Η συνάρτηση ψάχνει αν υπάρχει κάποιο αναγαστικό "φάγωμα" και αναλόγος επιστρέφει τις συντεταγμένες του πουλιού που θα κάνει το "φάγωμα" , αν υπάρχει, και τις συντεταγμένες των θέσεων που μπορεί να πάει(1 η 2). > struct ThreeCoords checking(char[][], int); typedef struct ThreeCoords { int x0,y0,x1,y1,x2,y2; }ThreeCoords; struct ThreeCoords checking(char board[8][8], int turn) { int i,j,k=0; ThreeCoords r = {-1,-1,-1,-1,-1,-1}; for(i=0;i<8;i++) { if(turn==1) { if(board[i][j]=='X') { if(board[i+1][j+1]=='O') { if(board[i+2][j+2]=='.') { r.x0=i; r.y0=j; r.x1=i+2; r.y1=j+2; k=1; } } if(board[i+1][j-1]=='O') { if(board[i+2][j-2]=='.') { r.x0=i; r.y0=j; if(k==1) { r.x2=i+2; r.y2=j-2; } else { r.x1=i+2; r.y1=j-2; } } } } } else { if(board[i][j]=='O') { if(board[i-1][j+1]=='X') { if(board[i-2][j+2]=='.') { r.x0=i; r.y0=j; r.x1=i-2; r.y1=j+2; k=1; } } if(board[i-1][j-1]=='X') { if(board[i-2][j-2]=='.') { r.x0=i; r.y0=j; if(k==1) { r.x2=i-2; r.y2=j-2; } else { r.x1=i-2; r.y1=j-2; } } } } } } return r; }
migf1 Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Κι αν υπάρχουν περισσότερα του 1ος πούλια που μπορούν να "φάνε" τι γίνεται (επίσης, δεν κατάλαβα τι είναι τα 1 και 2 που λες ότι επιστρέφει για θέσεις που μπορεί να πάει το πούλι)
monkey90 Δημοσ. 15 Μαΐου 2012 Μέλος Δημοσ. 15 Μαΐου 2012 Έχεις πολύ δίκιο...ενώ το είχα στο μυαλό μου το ξέχασα στη συνέχεια. εννός ότι ίσως να έχει την επιλογή να πάει σε μια θέση η σε δύο.
migf1 Δημοσ. 15 Μαΐου 2012 Δημοσ. 15 Μαΐου 2012 Έκανα ένα διάλειμμα από το Win32API, για δες αν σε βοηθάει η λογική του παρακάτω κώδικα. Δεν κάνει τίποτα το φοβερό, απλώς ελέγχει τον γείτονα όποιας θέσης του δώσεις, ανάλογα την κατεύθυνση που θα του δώσεις: NORTH σημαίνει από κάτω προς τα πάνω (δηλαδή ο κάτω παίκτης), SOUTH σημαίνει από πάνω προς τα κάτω (δηλαδή ο πάνω παίκτης). Το board ξεκινάει από πάνω προς τα κάτω (δλδ από 0,0 πάνω αριστερά, έως 63,63 κάτω δεξιά)... αυτό εννοώ πάνω & κάτω παίκτης. Επίσης το board το ορίζω ως 1D πίνακα αλλά το διαχειρίζομαι όπου χρειάζεται ως 2D με τα macros ROW(), COL() και IDX(). Έχω βάλει στην main() μεταβλητές: row, col & dir για να δοκιμάσει όποιος θέλει αν λειτουργούν σωστά οι συναρτήσεις rneighbor() και lneighbor() (αριστερός & δεξής γείτονας δηλαδή, πάντα σύμφωνα με την δοθείσα κατεύθυνση) Εγώ δεν το πολυδοκίμασα γιατί την κάνω για σπίτι. Το ποστάρω γιατί μπορεί να σε βοηθήσει να χτίσεις πάνω του και τα υπόλοιπα (ή να το φέρεις στα μέτρα σου). > #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> #define NCOLS 8 #define NROWS 8 #define NSIZE ( (NROWS) * (NCOLS) ) #define ROW(n) ( (n) / NCOLS ) #define COL(n) ( (n) % NCOLS ) #define IDX(row,col) ( (row) * NCOLS + (col) ) #define myMIN(x,y) ( (x) < (y) ? (x) : (y) ) #define myMAX(x,y) ( (x) > (y) ? (x) : (y) ) #define VALID_POS(pos) ( (pos) > -1 && (pos) < NSIZE ) #define VALID_DIR(dir) ( NORTH == (dir) || SOUTH == (dir) ) #define DIR2TEXT(dir) \ ( NORTH == (dir) ? "NORTH" : SOUTH == (dir) ? "SOUTH" : "ERR!" ) enum ChMark { CHINVALID = '#', CHBLNK = '.', CHPLR1 = 'X', CHPLR2 = 'O' }; enum Dir { NORTH = 0, SOUTH }; // -------------------------------- // -------------------------------- // -------------------------------- enum ChMark piece_get_lneighbor( int pos, enum Dir dir, enum ChMark board[] ) { if ( !VALID_POS(pos) || !VALID_DIR(dir) || !board ) return CHINVALID; if ( SOUTH == dir ) { if ( NROWS-1 == ROW(pos) || NCOLS-1 == COL(pos) ) return CHINVALID; return board[ IDX(ROW(pos)+1, COL(pos)+1) ]; } if ( NORTH == dir ) { if ( 0 == ROW(pos) || 0 == COL(pos) ) return CHINVALID; return board[ IDX(ROW(pos)-1, COL(pos)-1) ]; } } // -------------------------------- enum ChMark piece_get_rneighbor( int pos, enum Dir dir, enum ChMark board[] ) { if ( !VALID_POS(pos) || !VALID_DIR(dir) || !board ) return CHINVALID; if ( SOUTH == dir ) { if ( NROWS-1 == ROW(pos) || 0 == COL(pos) ) return CHINVALID; return board[ IDX(ROW(pos)+1, COL(pos)-1) ]; } if ( NORTH == dir ) { if ( 0 == ROW(pos) || NCOLS-1 == COL(pos) ) return CHINVALID; return board[ IDX(ROW(pos)-1, COL(pos)+1) ]; } } // -------------------------------- void print_board( const enum ChMark board[] ) { int i = 0; if ( !board ) return; for (i=0; i < NSIZE; i++) { if ( 0 != i && 0 == i % NCOLS ) putchar( '\n' ); putchar( board[i] ); } putchar('\n'); return; } // -------------------------------- int main( void ) { int row =0, col = 0; enum Dir dir = NORTH; enum ChMark board[ NSIZE ] = { /* row 0 */ CHBLNK, CHPLR1, CHBLNK, CHPLR1, CHBLNK, CHPLR1, CHBLNK, CHPLR1, /* row 1 */ CHPLR1, CHBLNK, CHPLR1, CHBLNK, CHPLR1, CHBLNK, CHPLR1, CHBLNK, /* row 2 */ CHBLNK, CHPLR1, CHBLNK, CHPLR1, CHBLNK, CHPLR1, CHBLNK, CHPLR1, /* row 3 */ CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, /* row 4 */ CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, CHBLNK, /* row 5 */ CHPLR2, CHBLNK, CHPLR2, CHBLNK, CHPLR2, CHBLNK, CHPLR2, CHBLNK, /* row 6 */ CHBLNK, CHPLR2, CHBLNK, CHPLR2, CHBLNK, CHPLR2, CHBLNK, CHPLR2, /* row 7 */ CHPLR2, CHBLNK, CHPLR2, CHBLNK, CHPLR2, CHBLNK, CHPLR2, CHBLNK, }; print_board( board ); row = 0; col = 0; dir = NORTH; printf( "right %s neighbor of board[%d][%d]: %c\n", DIR2TEXT(dir), row, col, piece_get_rneighbor( IDX(row,col), dir, board) ); printf( "left %s neighbor of board[%d][%d]: %c\n", DIR2TEXT(dir), row, col, piece_get_lneighbor( IDX(row,col), dir, board) ); system("pause"); return 0; }
monkey90 Δημοσ. 15 Μαΐου 2012 Μέλος Δημοσ. 15 Μαΐου 2012 wow..σε ευχαριστώ πάααρα πολύ θα το κοιτάξω οταν ξεμουδιάσει το μυαλό μου
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα