How do i declare an integer in main and have it recognised in a sub function?

I need line 72 declaration to apply to the formula stated on line 207. I have formatted it this way because previously my move() function was re-declaring the variable zeroi, which did not allow it to change continuously over each iteration or move. Sorry if this is convoluted, i have been lookign at this for a while

``````/**
* fifteen.c
*
* Computer Science 50
* Problem Set 3
*
* Implements Game of Fifteen (generalized to d x d).
*
* Usage: fifteen d
*
* whereby the board's dimensions are to be d x d,
* where d must be in [DIM_MIN,DIM_MAX]
*
* Note that usleep is obsolete, but it offers more granularity than
* sleep and is simpler to use than nanosleep; `man usleep` for more.
*/

#define _XOPEN_SOURCE 500

#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// constants
#define DIM_MIN 3
#define DIM_MAX 9

// board
int board[DIM_MAX][DIM_MAX];

// dimensions
int d;

// prototypes
void clear(void);
void greet(void);
void init(void);
void draw(void);
bool move(int tile);
bool won(void);

int main(int argc, string argv[])
{
// ensure proper usage
if (argc != 2)
{
printf("Usage: fifteen d\n");
return 1;
}

// ensure valid dimensions
d = atoi(argv[1]);
if (d < DIM_MIN || d > DIM_MAX)
{
printf("Board must be between %i x %i and %i x %i, inclusive.\n",
DIM_MIN, DIM_MIN, DIM_MAX, DIM_MAX);
return 2;
}

// open log
FILE* file = fopen("log.txt", "w");
if (file == NULL)
{
return 3;
}

// greet user with instructions
greet();

// initialize the board
init();

int zeroi = d - 1; \\LOOK HERE
int zeroj = d - 1;

// accept moves until game is won
while (true)
{

// draw the current state of the board
draw();

// log the current state of the board (for testing)
for (int i = 0; i < d; i++)
{
for (int j = 0; j < d; j++)
{
fprintf(file, "%i", board[i][j]);
if (j < d - 1)
{
fprintf(file, "|");
}
}
fprintf(file, "\n");
}
fflush(file);

// check for win
if (won())
{
printf("ftw!\n");
break;
}

// prompt for move
printf("Tile to move: ");
int tile = GetInt();

// quit if user inputs 0 (for testing)
if (tile == 0)
{
break;
}

// log move (for testing)
fprintf(file, "%i\n", tile);
fflush(file);

// move if possible, else report illegality
if (!move(tile))
{
printf("\nIllegal move.\n");
usleep(2000000);
}
else;
move(tile);
}

// close log
fclose(file);

// success
return 0;
}

/**
* Clears screen using ANSI escape sequences.
*/
void clear(void)
{
printf("\033[2J");
printf("\033[%d;%dH", 0, 0);
}

/**
* Greets player.
*/
void greet(void)
{
clear();
printf("WELCOME TO GAME OF FIFTEEN\n");
usleep(2000000);
}

/**
* Initializes the game's board with tiles numbered 1 through d*d - 1
* (i.e., fills 2D array with values but does not actually print them).
*/
void init(void)
{
for (int i = 0; i < d; i++)
{
for (int j = 0; j < d; j++)
{
board[i][j] = d*d - 1 - j - i*d;
}
}

if (d % 2 != 0)
{
board[d - 1][d - 2] = 2;
board[d - 1][d - 3] = 1;
}
}

/**
* Prints the board in its current state.
*/
void draw(void)
{
for (int i = 0; i < d; i++)
{
for (int j = 0; j < d; j++)
{
if (board[i][j] < 10)
{
printf("%2i   ", board[i][j]);
}

else if (board[i][j] >= 10)
{
printf("%i   ", board[i][j]);
}
}
printf("\n");
}
printf("\n");
}

/**
* If tile borders empty space, moves tile and returns true, else
* returns false.
*/
bool move(int tile) \\LOOK HERE!
{

for (int i = 0; i < d; i++)
{
for(int j = 0; j < d; j++)
{
if (board[i][j] == tile)
{
if ((abs(i - zeroi) == 1)^(abs(j - zeroj) == 1))
{
board[zeroi][zeroj] = tile;
board[i][j] = 0;

return true;
break;
}
else;
{
return false;
}
}
}
}
}

bool won(void)
{
int count = 0;
for (int i = 0; i < d; i++)
{
for(int j = 0; j < d; j++)
{
if (board[i][j] == j + i*d)
{
count = count + 1;
}
}

if (count == d*d)
{
return true;
}
else;
{
return false;
}
}
return false;
}
``````
• Can you please edit your question and identify which lines you are talking about and why you need to do this? Keep in mind that lines get reformatted when pasted here and often again when copied to or from an IDE. We have no idea which lines you're talking about. Oct 29 '16 at 9:35
• oh sorry i thought the lines would translate. THIS IS THE DECLARATION: int zeroi = d - 1; int zeroj = d - 1; int tilei; int tilej; THIS IS THE FUNCTION I WANT IT TO APPLY TO: bool move(int tile) they are at rows 74 and 207 respectively more or less Oct 29 '16 at 10:40
• Again, we have no idea what rows 74 and 207 are! Edit your question, and add comments on those rows to identify them! Oct 29 '16 at 10:55
• ok, i have added the comment \\LOOK HERE So you can word search for that i guess? I don't see the difference personally Oct 29 '16 at 11:02

One way to do it would be to declare `zeroi` and `zeroj` inside of the `move()` function. Since `d` is a global, you can just use it inside the `move()` function. I suggest this, because you don't use `zeroi` nor `zeroj` anywhere else, but only on the `move()` function.

The `move()` function will look something like this:

``````/**
* If tile borders empty space, moves tile and returns true, else
* returns false.
*/
bool move(int tile) \\LOOK HERE!
{
int zeroi = d - 1; \\LOOK HERE
int zeroj = d - 1;

for (int i = 0; i < d; i++)
{
for(int j = 0; j < d; j++)
{
if (board[i][j] == tile)
{
if ((abs(i - zeroi) == 1)^(abs(j - zeroj) == 1))
{
board[zeroi][zeroj] = tile;
board[i][j] = 0;

return true;
break;
}
else;
{
return false;
}
}
}
}
}
``````