-
December 2nd, 2014, 08:17 PM
#1
run-time check failure #0 - the value of ESP error with conversions
I get this error:
run-time check failure #0 - the value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention
when i try to run my code. It has compiled fine on another computer, but it simply will not work on this one and i cannot figure out why. This is the part of code where it is receiving the error. it has to do with the stoi
Code:
#include <string> // for use of string
#include <fstream> //for file handling
#include <iostream> // for file handling
#include <cstdlib>
#include <iomanip> //for the setprecision used further below
using namespace std;
struct MasterData //struct created named 'MasterData' to hold one line from master file
{
string playerId,
firstName,
lastName,
division,
teamName;
int appearances,
atBats,
singles,
doubles,
triples,
homeRuns,
sacFly,
walks,
hitByPitch;
double battingAvg,
OBP,
sluggingPercent;
};
struct MasterUpdate // struct created for the Update of the master file
{
string recordType;
MasterData record;
};
std :: istream &operator>>(istream& in, MasterData& d) //Overloads the input and output
{ //Overloads the ">>" operator
std :: string value;
getline(in, d.playerId, ',');
getline(in, d.firstName, ',');
getline(in, d.lastName, ',');
getline(in, d.division, ',');
getline(in, d.teamName, ',');
getline(in, value, ',');
d.appearances = stoi(value);
getline(in, value, ',');
d.atBats = stoi(value);
getline(in, value, ',');
d.singles = stoi(value);
getline(in, value, ',');
d.doubles = stoi(value);
getline(in, value, ',');
d.triples = stoi(value);
getline(in, value, ',');
d.homeRuns = stoi(value);
getline(in, value, ',');
d.sacFly = stoi(value);
getline(in, value, ',');
d.walks = stoi(value);
getline(in, value, ',');
d.hitByPitch = stoi(value);
getline(in, value, ',');
d.battingAvg = stod(value); // stod converts string to double and then stores it in MasterData
getline(in, value, ',');
d.OBP = stod(value);
getline(in, value, '\n');
d.sluggingPercent = stod(value);
return in;
}
ostream &operator<<(ostream& out, MasterData d)
{
//Overloads the "<<" operator
out << setw(11) << d.playerId << "|";
out << setw(15) << d.firstName << "|";
out << setw(15) << d.lastName << "|";
out << setw(15) << d.division << "|";
out << setw(15) << d.teamName << "|";
out << setw(15) << d.appearances << "|";
out << setw(10) << d.atBats << "|";
out << setw(10) << d.singles << "|";
out << setw(10) << d.doubles << "|";
out << setw(10) << d.triples << "|";
out << setw(10) << d.homeRuns << "|";
out << setw(10) << d.sacFly << "|";
out << setw(10) << d.walks << "|";
out << setw(15) << d.hitByPitch << "|";
out << setprecision(3) << fixed;
out << setw(15) << d.battingAvg << "|";
out << setw(15) << d.OBP << "|";
out << setw(15) << d.sluggingPercent << "|";
out << "\n";
return out;
}
istream &operator>>(istream& in, MasterUpdate& u) //Overload operators for MasterUpdate
{
//Overloads the ">>" operator (opposite of the one above)
getline(in, u.recordType, ',');
in >> u.record;
return in;
}
// Function Prototypes
void swap(MasterData stats[], int x, int y);
void sortByBattingAvg(MasterData stats[], int length);
void sortByDivThenBattingAvg(MasterData stats[], int length);
void sortByTeamThenDiv(MasterData stats[], int length);
void printTop20Batters(ostream& out, MasterData stats[], int length);
void printTop10PlayersbyDivision(ostream& out, MasterData stats[], int length);
void printOffensiveStatsbyTeam(ostream& out, MasterData stats[], int length);
void printNewMaster(ostream& out, MasterData stats[], int length);
void printRecordCSV(ostream& out, MasterData d);
void printHeaders(ostream& out);
void lineA(ostream& out);
void lineB(ostream& out);
int main()
{
ifstream inFile;
inFile.open("Master_Data.csv");
MasterData current;
MasterData stats[500];
int length = 0;
while (!inFile.eof())
{
inFile >> current;
stats[length] = current;
length++;
}
inFile.close();
//Update array for 2014 stats then print out the updated master file
MasterUpdate update;
ifstream inleagueData("2014_League_Stats.csv");
string value;
//Remove Headers
for (int i = 0; i < 17; i++)
getline(inleagueData, value, ',');
getline(inleagueData, value, '\n');
//Make updates
while (!inleagueData.eof())
{
inleagueData >> update;
switch (update.recordType[0])
{
case 'D': //Delete player that did not return to league
for (int i = 0; i < length; i++)
if (update.record.playerId == stats[i].playerId)
{
swap(stats, i, length - 1);
length--;
}
break;
case 'N': //Add new player that is entering the league
stats[length] = update.record;
length++;
break;
case 'R': //Update stats for player returning to league
int position;
for (int i = 0; i < length; i++)
if (update.record.playerId == stats[i].playerId)
position = i;
//Update record based on new stats
stats[position].teamName = update.record.teamName;
stats[position].division = update.record.division;
stats[position].appearances += update.record.appearances;
stats[position].atBats += update.record.atBats;
stats[position].singles += update.record.singles;
stats[position].doubles += update.record.doubles;
stats[position].triples += update.record.triples;
stats[position].homeRuns += update.record.homeRuns;
stats[position].sacFly += update.record.sacFly;
stats[position].walks += update.record.walks;
stats[position].hitByPitch += update.record.hitByPitch;
//Update hits based on new stats
double hits = 0;
hits += stats[position].singles;
hits += stats[position].doubles;
hits += stats[position].triples;
hits += stats[position].homeRuns;
//Update total bases based on the updated hits
double totalBases = 0;
totalBases += stats[position].singles;
totalBases += stats[position].doubles * 2;
totalBases += stats[position].triples * 3;
totalBases += stats[position].homeRuns * 4;
//Update calculated fields for batting average, OBP, and slugging percent
stats[position].OBP = ((hits + stats[position].walks + stats[position].hitByPitch)
/ stats[position].appearances);
stats[position].sluggingPercent = (totalBases / stats[position].atBats);
break;
}
}
//Display the updated master file
ofstream outNewMaster("2014_League_Stats.csv");
printNewMaster(outNewMaster, stats, length);
outNewMaster.close();
//Processing and Output 1 - Top 20 Batters Report
sortByBattingAvg(stats, length);
ofstream top20("Top 20 Batters.txt");
printTop20Batters(top20, stats, length);
top20.close();
//Processing and Output 2 - Top 10 Batters by Division Report
sortByDivThenBattingAvg(stats, length);
ofstream outTop10("Top 10 Players by Division Report.txt");
printTop10PlayersbyDivision(outTop10, stats, length);
outTop10.close();
//Processing and Output 3 - Offensive Stats by Team Report
sortByTeamThenDiv(stats, length);
ofstream outTeamStats("Offensive Stats by Team.txt");
printOffensiveStatsbyTeam(outTeamStats, stats, length);
outTeamStats.close();
}
// Function Definitions
void swap(MasterData stats[], int x, int y) //sort (x and y for positions)
{
MasterData temp = stats[x];
stats[x] = stats[y];
stats[y] = temp;
}
void sortByBattingAvg(MasterData stats[], int length)
{
//select sort
for (int holdPos = 0; holdPos < length - 1; holdPos++) //Position Holder Loop
{
int maxPos = holdPos; //maxPos is recreated for each iteration of Position Holder Loop
for (int valueFindPos = holdPos + 1; valueFindPos < length; valueFindPos++) //Value Finder Loop
{
if (stats[valueFindPos].battingAvg > stats[maxPos].battingAvg) //Sort
maxPos = valueFindPos;
else if (stats[valueFindPos].battingAvg == stats[maxPos].battingAvg && stats[valueFindPos].sluggingPercent > stats[maxPos].sluggingPercent)
maxPos = valueFindPos;
}
swap(stats, holdPos, maxPos); //Swaps biggest value foudn to holdPos (held position)
}
}
void sortByDivThenBattingAvg(MasterData stats[], int length)
for (int i = 0; i < length - 1; i++)
{
int maxIndex = i;
for (int p = i + 1; p < length; p++)
{
//Sort Logic
if (stats[p].division > stats[maxIndex].division)
maxIndex = p;
else if (stats[p].division == stats[maxIndex].division)
if (stats[p].battingAvg > stats[maxIndex].battingAvg)
maxIndex = p;
}
swap(stats, i, maxIndex);
}
}
void sortByTeamThenDiv(MasterData stats[], int length)
{
for (int i = 0; i < length - 1; i++)
{
int maxPos = i;
for (int p = i + 1; p < length; p++)
{
//Sort Logic
if (stats[p].teamName > stats[maxPos].teamName)
maxPos = p;
else if (stats[p].teamName == stats[maxPos].teamName)
if (stats[p].division > stats[maxPos].division)
maxPos = p;
else if (stats[p].division == stats[maxPos].division)
if (stats[p].battingAvg > stats[maxPos].battingAvg)
maxPos = p;
}
swap(stats, i, maxPos);
}
}
//Prints and Print Helpers
void printTop20Batters(ostream& out, MasterData stats[], int length)
{
printHeaders(out);
for (int i = 0; i < 20; i++)
out << stats[i];
lineA(out);
}
void printTop10PlayersbyDivision(ostream& out, MasterData stats[], int length)
{
int counter = 0;
string currentDivision = stats[0].division;
printHeaders(out); //Prints Headers on top of report
for (int i = 0; i < length; i++)
{
if (stats[i].division == currentDivision && counter < 10)
{
out << stats[i];
counter++;
}
else if (stats[i].division != currentDivision)
{
lineA(out);
out << stats[i];
counter = 1;
currentDivision = stats[i].division;
}
}
lineA(out);
}
void printOffensiveStatsbyTeam(ostream& out, MasterData stats[], int length)
{
int counter = 0;
string currentTeam = stats[0].teamName;
string currentDivision = stats[0].division;
printHeaders(out);
for (int i = 0; i < length; i++)
{
if (stats[i].teamName == currentTeam)
{
if (stats[i].division != currentDivision)
{
lineB(out);
currentDivision = stats[i].division;
}
out << stats[i];
counter++;
}
else
{
lineA(out);
out << stats[i];
counter = 1;
currentTeam = stats[i].teamName;
currentDivision = stats[i].division;
}
}
lineA(out);
}
void printNewMaster(ostream& out, MasterData stats[], int length)
{
for (int i = 0; i < length; i++)
printRecordCSV(out, stats[i]);
}
void printRecordCSV(ostream& out, MasterData d)
{
out << d.playerId << ',';
out << d.firstName << ',';
out << d.lastName << ',';
out << d.division << ',';
out << d.teamName << ',';
out << d.appearances << ',';
out << d.atBats << ',';
out << d.singles << ',';
out << d.doubles << ',';
out << d.triples << ',';
out << d.homeRuns << ',';
out << d.sacFly << ',';
out << d.walks << ',';
out << d.hitByPitch << ',';
out << setprecision(3) << fixed;
out << d.battingAvg << ',';
out << d.OBP << ',';
out << d.sluggingPercent << '\n';
}
void printHeaders(ostream& out)
{
out << setw(11) << "Player ID" << "|";
out << setw(15) << "First Name" << "|";
out << setw(15) << "Last Name" << "|";
out << setw(15) << "Division" << "|";
out << setw(15) << "Team Name" << "|";
out << setw(15) << "Appearances" << "|";
out << setw(10) << "At Bats" << "|";
out << setw(10) << "Singles" << "|";
out << setw(10) << "Doubles" << "|";
out << setw(10) << "Triples" << "|";
out << setw(10) << "Home Runs" << "|";
out << setw(10) << "Sac Flys" << "|";
out << setw(10) << "Walks" << "|";
out << setw(15) << "Hit by Pitch" << "|";
out << setw(15) << "Batting Avg" << "|";
out << setw(15) << "On Base %" << "|";
out << setw(15) << "Slugging %" << "|";
out << "\n";
lineA(out); // line printed for neatness in reports
}
void lineA(ostream& out) //line printed for neatness in reports
{
for (int i = 0; i < 116; i++)
out << "~~~";
out << "\n";
}
void lineB(ostream& out) //line printed for neatness in reports
{
for (int i = 0; i < 116; i++)
out << " ~ ";
out << "\n";
}
//End
-
December 3rd, 2014, 04:49 AM
#2
Re: run-time check failure #0 - the value of ESP error with conversions
What compiler are you using, on what computer was it compiled and on what computer are you obtaining the error?
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
December 3rd, 2014, 09:21 AM
#3
Re: run-time check failure #0 - the value of ESP error with conversions
1) Your read loop does not check if it goes over 500 entries.
2) Why are you writing your own sort function, when you could use just std::sort?
when i try to run my code. It has compiled fine on another computer,
There is a big difference between "compiling fine" and "running fine". If a program compiles with no syntax errors doesn't mean it will run correctly.
Regards,
Paul McKenzie
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|