Your Issue
The code you copied here is unfinished and would not even compile.
Could you, please, instead link your project? You can click the orange SHARE button (3 to the right from RUN) and post the "share code" from there.
It is also a good idea to
- list the exact steps taken to produce the issue
- what you expected to happen
- what happened instead
What I've Found (So Far...)
I looked at the code provided so far and tried to make some sene of it and finish whatever you missed in your post to make the code compile and do whatever it's supposed to do.
I've found you've got quite a lot of things to do.
This also looks like a homework or some kind of assignment and the best way you can learn is by doing it yourself, so I'm not going to provide you a finished code, but I'm going to point out some significant mistakes and I'll let you fix these and similar ones and allow you to progress with your code.
Problem #1 - Calling a function
In the main() function you're trying to call methods but instead of calling a method, you're just declaring them again.
// 1. Initialize Board
void initialize_board (TicTacToeBoard * board);
The above is not a function call, it's a declaration of a function where you state the signature (name, return value, parameters, etc) of the function. If you want to call the function, you need to provide the name and the arguments to the compiler.
The above function would be called correctly like this:
initialize_board(&board);
So we provided the name of the function and the arguments in parenthesis. Since initialize_board expects a pointer to TicTacToeBoard, and board is of type TicTacToeBoard, we need to use the & (address of) operator to get the pointer to the TicTacToeBoard.
Apply the same logic across all your code when you're calling functions.
Problem #2 - Reading/Writing a file
In save_board_to_file() and load_board_from_file() you used the functions fprintf() and fscanf() respectively. This may even work, however, the arguments you provided did not match expected parameters. You could instead use the fwrite() and fread() functions respectively and they would have the arguments in the order you provided them.
Problem #3 - make_move()
In this function you always put an X into the given row/column, regardless of which player is playing. You can utilize board->current_player to see which player is active. However, no one maintains the current_player field of the TicTacToeBoard, so you should start flipping it between player 1 and player 2 every time a new turn is taken. The best place for this would be probably in the main() in the while loop.
Another problem with this function is that you'd need to ask the user to provide the row and column. So you'd either need to create a new function that will ask the user for this information and pass the user input to make_move(), or you completely remove row and col parameters and the make_move() function itself will just get this from the user.
And keep remember you have to keep repeating asking for rows and columns until a valid input is provided, i.e. the return value of make_move() is not 0.
Final Words
There are still some lesser issues in your code that I haven't addressed, but I think first you need to fix these major problems to have a functional game. When everything works, you can focus on cleaning your code of warnings and other subtle problems.
Good luck and ask further questions if you need help. But don't forget to link your code, it's easier than copying things here (and potentially missing some part of the code).