I have an array [8][8]
char d[ROWS][COLS] = {
{0, 2, 0, 2, 0, 2, 0, 2},
{2, 0, 2, 0, 2, 0, 2, 0},
{0, 2, 0, 2, 0, 2, 0, 2},
{1, 0, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1},
{3, 0, 3, 0, 3, 0, 3, 0},
{0, 3, 0, 3, 0, 3, 0, 3},
{3, 0, 3, 0, 3, 0, 3, 0}};
int countOccurrences(char d[ROWS][COLS], int i, int j, int res)
{
res = 0;
for (i=0; i<=ROWS; i ){
for(j=0; j<=COLS; j ){
if ('2' == d[ROWS][COLS])
res ;
}
}
return res;
printf("score%d", res);
}
my code doesn't work and I need to find and count the occurrences in 2D array and print it out
CodePudding user response:
I made a comment, but I will also go ahead and respond with the fixed function. There were three main issues in the code that I'll point out:
- In your code, you have numbers within the array, but then you try comparing a char to a number (
'2' == 2
is false), so that means your result will be 0 over all - The print statement was after the
return
, which means it won't actually run. - the if statement
if (2 == d[ROWS][COLS])
is always going to check the number at positionROWS
andCOLS
. The first issue there is thatROWS
andCOLS
aren't changing positions, that's a constant; you want to check at the positioni
andj
. Second, since array's in C are zero-based, accessingd
at position[ROWS][COLS]
will actually point to some unknown memory space since that's beyond the scope of the array, but that's just an interesting fact.
The following code should fix the problems I pointed out above:
char d[ROWS][COLS] = {
{0, 2, 0, 2, 0, 2, 0, 2},
{2, 0, 2, 0, 2, 0, 2, 0},
{0, 2, 0, 2, 0, 2, 0, 2},
{1, 0, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1},
{3, 0, 3, 0, 3, 0, 3, 0},
{0, 3, 0, 3, 0, 3, 0, 3},
{3, 0, 3, 0, 3, 0, 3, 0}};
int countOccurrences(char d[ROWS][COLS], int i, int j, int res) {
res = 0;
// NOTICE that it is now i < ROWS and j < COLS instead of
// i <= ROWS and j <= COLS to deal with what I mentioned
// before about the zero-based indexing in C, which means
// we need to stop BEFORE ROWS and COLS
for (i = 0; i < ROWS; i ) {
for (j = 0; j < COLS; j ) {
if (2 == d[i][j])
res ;
}
}
printf("score%d", res);
return res;
}
CodePudding user response:
There are some problems with your code:
- You have a char
'2'
, which will transform to whatever character encoding that your system use, in my case, ASCII, which will be saved by the value50
, and you are comparing it with the value2
, which will returnfalse
. - You're comparing
d[ROWS][COLS]
every time, that's probably not what you want. - In your loop, there will be times that it will try to access
d[ROW][...]
,d[...][COL]
, which will create an out of bounds error. - You make too many unnecessary arguments for your function.
- You
return
beforeprintf()
, soprintf()
never get executed.
Suggested code:
char d[ROWS][COLS] = {
{'0', '2', '0', '2', '0', '2', '0', '2'},
{'2', '0', '2', '0', '2', '0', '2', '0'},
{'0', '2', '0', '2', '0', '2', '0', '2'},
{'1', '0', '1', '0', '1', '0', '1', '0'},
{'0', '1', '0', '1', '0', '1', '0', '1'},
{'3', '0', '3', '0', '3', '0', '3', '0'},
{'0', '3', '0', '3', '0', '3', '0', '3'},
{'3', '0', '3', '0', '3', '0', '3', '0'}};
int countOccurrences(char d[ROWS][COLS])
{
int res = 0;
for (int i=0; i<ROWS; i ){
for(int j=0; j<COLS; j ){
if ('2' == d[i][j])
res;
}
}
printf("score%d", res);
return res;
}