Reputation: 11
I'm working on a project for my programming class and when I try to compile it I keep getting a build error LNK2019. I've tried consulting another CPS major and he isn't quite sure why I keep getting the error.
// File: Asgn7_Skel.cpp
// CPS 150/Fall 2013 Assignment 7 Skeleton
// Modified from Gaddis Program 8-32 to satisfy the assignment
// requirements.
// Skeleton by: Tamisra H. Sanyal
// Completed by: Kyle Abel
// This program lets the user play a game of rock, paper, scissors
// with the computer. The computer's choices are randomly generated.
// Total 10 rounds are played.
// Change the NumRounds constant to play a different number of rounds
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
#include <string>
#include <array>
using namespace std;
// enumerations of choices and outcomes
enum Choices {Rock, Paper, Scissors, Last};
enum Outcomes {ComputerWin, PlayerWin, Tie,};
// Data for one round
struct GameData
{
Choices computerChoice;
Choices playerChoice;
Outcomes result;
}; // end struct
const int NumRounds(10); // number of rounds to play
const int ArraySize(NumRounds); // we will not use index 0
typedef array<GameData, ArraySize> DataStore;
// These constant arrays are used to translate enumeration constants to
// readable descriptions (see line 9 in textbook's program)
const array<string, 3> ChoiceNames = {"Rock", "Paper", "Scissors"};
const array<string, 3> OutcomeNames = {"Computer win", "Player win", "Tie"};
array<int, 3> ResultsTalley = {};
// Function prototypes
void getPlayerChoice(Choices & choice);
Outcomes getRoundResult(const Choices computerChoice, const Choices playerChoice);
void showRoundResult(const Choices computerChoice, const Choices playerChoice,
const Outcomes roundResult);
void showGameResults(const DataStore & results);
int main()
{
Choices computerChoice, playerChoice;
Outcomes roundResult;
int computerPoints = 0, playerPoints = 0; // Point accumulators
DataStore gameResults = {};
srand(time(NULL)); // Give the random generator
int counter; // a seed to start with
int pl_choice;
cout << "CPS 150 Assignment 7 by Kyle Abel\n\n";
cout << "Let's play Rock-Paper-Scissors!\n";
cout << "We will play " << NumRounds << " rounds.\n\n";
// TODO: Add main function code here
for (counter = 0; counter < NumRounds; counter++)
{
computerChoice = static_cast<Choices>(rand() % 3);
getPlayerChoice(playerChoice);
getRoundResult(computerChoice, playerChoice);
showRoundResult(computerChoice, playerChoice, roundResult);
if (Tie)
{
return 0;
}
else if (ComputerWin)
{
computerPoints++;
}
else
playerPoints++;
} // end for
cout << "\nCPS 150 Assignment 7 complete\n\n";
return 0;
} // end main
void showGameResults(const DataStore & results)
{
cout << "Game results\n";
cout << "============\n";
cout << right << setw(5) << "Round" << ' '
<< left << setw(14) << "Player choice"
<< setw(16) << "Computer choice"
<< setw(13) <<"Round result" << endl;
cout << right << setw(5) << "-----" << ' '
<< left << setw(14) << "-------------"
<< setw(16) << "---------------"
<< setw(13) <<"------------" << endl;
for (int k(1); k < results.size(); k++)
{
cout << right << setw(5) << k << ' ' << left
<< setw(14) << ChoiceNames[results[k].playerChoice]
<< setw(16) << ChoiceNames[results[k].computerChoice]
<< setw(13) << OutcomeNames[results[k].result] << endl;
} // end for
cout << endl;
} // end showGameResults
void getPlayerChoice(Choices playerChoice, int PChoice)
{
cout << "Enter your choice, 1 for Rock, 2 for Paper, or 3 for Scissors";
cin >> PChoice;
if (PChoice != 1 || PChoice != 2 || PChoice != 3)
{
cout << "Please Enter a Valid # 1-3" << "\n\n";
cin >> PChoice;
}
else if (PChoice = 1)
{
PChoice--;
static_cast<Choices>(PChoice);
}
else if (PChoice = 2)
{
PChoice--;
static_cast<Choices>(PChoice);
}
else
{
PChoice--;
static_cast<Choices>(PChoice);
}
}
Outcomes getRoundResult(const Choices computerChoice, const Choices playerChoice)
{
if (computerChoice == playerChoice)
{
return Tie;
}
else if ((playerChoice == 1 && computerChoice == 2) ||
(playerChoice == 2 && computerChoice == 3) ||
(playerChoice == 3 && computerChoice == 1) )
{
return ComputerWin;
}
else
{
return PlayerWin;
}
}
void showRoundResult(const Choices computerChoice, const Choices playerChoice, const Outcomes roundResult)
{
if (Outcomes(Tie))
{
cout << "we have tied!";
}
else if (Outcomes(ComputerWin))
{
cout << "I chose " << ChoiceNames[computerChoice] << ", so I win the game! "
<< ChoiceNames[computerChoice] << " beats " << ChoiceNames[playerChoice]
<< ". \n\n";
}
else if (Outcomes(PlayerWin))
{
cout << "I chose " << ChoiceNames[computerChoice] << ", so you won!! "
<< ChoiceNames[playerChoice] << " beats " << ChoiceNames[computerChoice]
<< ". \n\n";
}
}
These are the errors I keep getting whenever I try to build the project:
1>------ Build started: Project: ConsoleApplication15, Configuration: Debug Win32 ------
1>Source.obj : error LNK2019: unresolved external symbol "void __cdecl getPlayerChoice(enum Choices &)" (?getPlayerChoice@@YAXAAW4Choices@@@Z) referenced in function _main
1>C:\Users\Kyle\documents\visual studio 2012\Projects\ConsoleApplication15\Debug\ConsoleApplication15.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Any guidance on how to fix this problem would be much appreciated!
Upvotes: 1
Views: 177
Reputation: 1213
The issue is occurring because your function prototype is different from the function definition. You have the prototype as:
void getPlayerChoice(Choices & choice);
But your definition for that function is:
void getPlayerChoice(Choices playerChoice, int PChoice)
To fix this the function prototype and definition must be the same.
Upvotes: 4
Reputation: 1
I would rewrite your getPlayerChoice function to use a loop, because if the user inputs two invalid choices, it will flow through. Here's what I'm thinking.
void getPlayerChoice(Choices& playerChoice, int PChoice) {
cout << "Enter your choice, 1 for Rock, 2 for Paper, or 3 for Scissors";
cin >> PChoice;
while (PChoice != 1 || PChoice != 2 || PChoice != 3) {
cout << "Please Enter a Valid # 1-3" << "\n\n";
cin >> PChoice;
}
//Now that we're sure it's either 1 2 or 3, we can alter the rest of the code a bit
PChoice--; //Instead of once in each branch
playerChoice = static_cast<Choices>(PChoice); //Why cast it without assigning it?
}
I just had another thought, and, I fear I may have already done too much of your assignment, I won't include the code, but if you figure this out, you'll really impress your professor (oh, great, now I'm going to have the voice of Heinz Doofenschmirtz singing "I must impress my professor" in my head for a while). The winner can be determined by taking the user's choice converted to an integer, subtracting the computer's choice converted to an integer, then use modulus 3 on the result. 0=tie, 1=human, 2=PC.
Upvotes: 0
Reputation: 4012
Well - you didn't define the getPlayerChoice(Choices & choice)
function, so the compiler gives you an error.
There's an declaration of getPlayerChoice(Choices & choice)
and definition of void getPlayerChoice(Choices playerChoice, int PChoice)
in your code. That's not the same. You invoke the first one in your main, while it has no definition, becuase you defined a different version of it.
Upvotes: 1