Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω μια συνάρτηση η οποία ψάχνει έναν πίνακα και , αναλογα τι θα βρει, επιστρέφει τις συντεταγμένες από καμία, μία η δύο θέσεις του πίνακα. Σκέυτομαι να το κάνω με ενα char string[]. Υπάρχει κάποιος καλύτερος τρόπος;

Δημοσ.

Μια άλλη λύση που μου έρχεται στο μυαλό είναι να επιστρέφεις έναν πίνακα με τις συντεταγμένες και άλλη μια μεταβλητή με το μέγεθος του πίνακα.

Δημοσ.

Μπορείς να κανείς μια struct, πχ

>struct TwoCoords
{
   int x1, y1;
   int x2, y2;
};

struct TwoCoords myFunction(...);

Κάτι τέτοιο και αν δεν θες να χρησιμοποιήσεις τις τιμές, επειδή πχ δεν βρήκες αυτό που θες στον πίνακα τότε θα βάζεις τις τιμές ίσες με μια "άκυρη" τιμή, πχ -1

Δημοσ.

Έχω μια συνάρτηση η οποία ψάχνει έναν πίνακα και , αναλογα τι θα βρει, επιστρέφει τις συντεταγμένες από καμία, μία η δύο θέσεις του πίνακα. Σκέυτομαι να το κάνω με ενα char string[]. Υπάρχει κάποιος καλύτερος τρόπος;

 

μπορεις να γίνεις λίγο πιο περιγραφικός;;

Δημοσ.

Ευχαριστω για τις συμβουλες σας.

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 λέω καμία,μία η δυο ενώ είναι καμία δύο η τρεις. Αν και δεν αλλάζει ο τρόπος που θα γίνει το αναφέρω.

Δημοσ.

Σίγουρα όχι με 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).

Δημοσ.

Το έκανα με 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;
}

Δημοσ.

Επειδή είμαι κουρασμένος για να διαβάσω τον κώδικα (που btw μου φαίνεται αχρείαστα πολύπλοκος, από ένστικτο εννοώ) για πες τι ακριβώς θέλεις να κάνεις. Ποιες είναι οι προϋποθέσεις που πρέπει να τηρηθούν;

 

Πάντως σε γενικές γραμμές, η διαχείριση ενός μονοδιάστατου πίνακα σαν να ήταν δισδιάστατος απλοποιεί αρκετές διαδικασίες (και περιπλέκει κάποιες άλλες).

 

ΥΓ. Έχω πήξει με το Win32API :lol:

Δημοσ.

Καταρχάς ευχαριστώ πολύ για το χρόνο σου.Ο κώδικας μέσα στη συνάρτηση πρέπει να είναι σωστός. Μου βγάζει warning no semicolon at end of struct or union μεσα στο struct στη γραμμή του int x0=-1,y0=-1;

Δημοσ.

Καταρχάς ευχαριστώ πολύ για το χρόνο σου.Ο κώδικας μέσα στη συνάρτηση πρέπει να είναι σωστός. Μου βγάζει 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 };

ΥΓ. Τελικά ποιες είναι οι προϋποθέσεις;

Δημοσ.

Σας ευχαριστώ πολύ.Βρήκα τα λάθοι(κάνει 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;
}

Δημοσ.

Κι αν υπάρχουν περισσότερα του 1ος πούλια που μπορούν να "φάνε" τι γίνεται (επίσης, δεν κατάλαβα τι είναι τα 1 και 2 που λες ότι επιστρέφει για θέσεις που μπορεί να πάει το πούλι)

Δημοσ.

Έχεις πολύ δίκιο...ενώ το είχα στο μυαλό μου το ξέχασα στη συνέχεια. εννός ότι ίσως να έχει την επιλογή να πάει σε μια θέση η σε δύο.

Δημοσ.

Έκανα ένα διάλειμμα από το 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;
}

 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...