通过递增循环的致命错误

编程入门 行业动态 更新时间:2024-10-17 13:39:02
本文介绍了通过递增循环的致命错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

目前,我想在Fighter.cpp文件的函数sortFighters中做一个功能排序一个矢量充满战士。这一切似乎都编译正确;但是,当它运行时,我在afor .cpp文件的一行中遇到致命错误。我知道确切的问题是什么,并据此发表评论。 所以,我在这里问,是我可以做,以解决这个问题,而不添加任何其他功能等。

Currently, I'm trying to make a function that sorts a vector full of fighters in the function sortFighters in the Fighter.cpp file. It all seems to compile correctly; However, when it does run, I get a fatal error in one of the lines of the aformentioned .cpp file. I know exactly what the problem is, and put a comment there accordingly. So, what I'm asking here, is what I might do to fix this problem without adding any other functions and such.

这里是我的Fighter.h档案:

Here's my Fighter.h file:

#ifndef FIGHTER_H #define FIGHTER_H #include <iostream> #include <ctime> #include <string> #include <cstdlib> #include <fstream> #include <vector> class Fighter { protected: std::string name; int health, level; //int damage; public: int getHealth(int); void getEnemies(std::vector<Fighter> &); void printFighter(std::vector<Fighter> &); void sortFighters(std::vector<Fighter> &); //friend std::istream & operator >> (std::istream & strm, Fighter & x); //friend std::ostream & operator << (std::ostream & strm, const Fighter & f); //void attack(); Fighter(); ~Fighter(); }; class Player : public Fighter { private: int experience; public: int getHealth(int); void pri`enter code here`ntFighter(); void getExperience(int); void playerAttack(); Player(); ~Player(); }; //class FightPub //{ // private: // Player player; // Fighter enemy; // public: // //void fight(); // //void getStats(); //}; #endif

我的Fighter.cpp文件:

My Fighter.cpp file:

//dynamically locate an array that holds the number of fighters, and for each fighter in the array, assign from the .txt //file the name and level from the fighter. #include "Fighter.h" #pragma region getEnemies void Fighter::getEnemies(std::vector<Fighter> &baddie) { Fighter x; std::ifstream inputFile; inputFile.open("EnemyFighters.txt"); if(!inputFile) { std::cout << "error!" << std::endl; } else { while(!inputFile.eof()) { std::string line; inputFile >> line; if (line == "<fighter>") { do { inputFile >> line; x.name = line; inputFile >> line; x.level = atoi(line.c_str()); inputFile >> line; x.health = getHealth(this->level); baddie.push_back(x); inputFile >> line; }while(line != "</fighter>"); } } inputFile.close(); } } #pragma endregion #pragma region getHealth int Fighter::getHealth(int lv) { if(lv >= 6) { std::cout << "\nHealth Bonus!"; this->health = lv * 2; } /*else if (lv > 1) for (int i = 1; i < lv; i++) {this->health += 2;}*/ return health; } #pragma endregion #pragma region attack //void Fighter::attack() //{ // int randomAttack = rand() % 4 + 1; // // switch (randomAttack) // case 1: // { // std::cout << "Enemy uses critical attack!" // } //} #pragma endregion #pragma region printFighter void Fighter::printFighter(std::vector<Fighter> &baddie) { //std::cout << this; for (int i=0; i<baddie.size(); i++) { std::cout << "\nName: " << baddie[i].name << std::endl << "Level: " << baddie[i].level << std::endl << "Health: " << baddie[i].health << std::endl; } } #pragma endregion void Fighter::sortFighters(std::vector<Fighter> &x) { Fighter * temp = new Fighter; bool swap; do { swap = false; std::cout << x.size() << std::endl; for (int i=0; i<=(x.size()); i++) { //if the level in the first is greater than the level in the next if(x[i].level > x[i+1].level)//I get a fatal error here when it tries to compare //the iterator with 1 that's outside its range { //assign the stats from the first to temp temp->name = x[i].name; temp->health = x[i].health; temp->level = x[i].level; //assign the stats from the next to the first x[i].name = x[i+1].name; x[i].health = x[i+1].health; x[i].level = x[i+1].level; //assign the ones in temp(the first) to the next x[i+1].name = temp->name; x[i+1].health = temp->health; x[i+1].level = temp->level; swap = true; } else if(x[i].level >= x[i+1].level) { temp->name = x[i].name; temp->health = x[i].health; temp->level = x[i].level; x[i].name = x[i+1].name; x[i].health = x[i+1].health; x[i].level = x[i+1].level; x[i+1].name = temp->name; x[i+1].health = temp->health; x[i+1].level = temp->level; swap = true; } else if (x[i].level < x[i+1].level) { //temp->name = x[i].name; //temp->health = x[i].health; //temp->level = x[i].level; //x[i].name = x[i+1].name; //x[i].health = x[i+1].health; //x[i].level = x[i+1].level; //x[i+1].name = temp->name; //x[i+1].health = temp->health; //x[i+1].level = temp->level; swap = false; } else if(x[i].level <= x[i+1].level) { /*temp->name = x[i].name; temp->health = x[i].health; temp->level = x[i].level; x[i].name = x[i+1].name; x[i].health = x[i+1].health; x[i].level = x[i+1].level; x[i+1].name = temp->name; x[i+1].health = temp->health; x[i+1].level = temp->level;*/ swap = false; } } }while (swap); delete temp; } //std::istream & operator >>(std::istream & strm, Fighter x) //{ // //x.name += strm.c_str(); // //x.level += atoi(strm.c_str()); // strm >> x.name; // strm >> x.level; // return strm; //} //std::ostream & operator << (std::ostream & strm, const Fighter f) //{ // strm << "Name: " << f.name << std::endl; // strm << "Level: " << f.level << std::endl; // strm << "Health: " << f.health << std::endl; // return strm; //} #pragma region Fighter C&D Fighter::Fighter() { level = 1; health = 10; } Fighter::~Fighter() { } #pragma endregion //void operator <() //{ //} // //void operator >() //{ //} // //void operator <=() //{ //} // //void operator >=() //{ //} // // // int Player::getHealth(int lv) { if(lv >= 6) { std::cout << "\nHealth Bonus!"; this->health = lv * 2; } /*else if (lv > 1) for (int i = 1; i < lv; i++) {this->health += 2;}*/ return health; } void Player::printFighter() { //std::cout << this; std::cout << "\nPlayer's stats: \n" << "Level: " << this->level << std::endl << "Health: " << this->health << std::endl << "Experience: " << this->experience <<std::endl; } void Player::getExperience(int dmg) { experience += dmg; if (experience >= (level * 10)) { std::cout << "Congratulations, Player! You're up a level!\n"; level ++; } } #pragma region Player C&D Player::Player() { level = 1; health = getHealth(level); experience = 0; } Player::~Player() { } #pragma endregion //Player::printFighter() //{ // //}

这里是main.cpp:

And here's main.cpp:

#include "Fighter.h" int main() { unsigned seed = time(0); srand(seed); std::vector<Fighter> baddie; Fighter * enemy = new Fighter; Player * me = new Player; enemy->getEnemies(baddie); enemy->sortFighters(baddie); enemy->printFighter(baddie); me->printFighter(); delete enemy; delete me; return 0; }

推荐答案

for (int i=0; i<=(x.size()); i++) { if(x[i].level > x[i+1].level) {

um .. Size()从1开始计数。索引从0开始计数。所以你会想让 i< x.size(),而不是< = 。 ,在下一行中,您会说 x [i + 1] ,因此 i 无法到达最后一个项目,它必须在此之前停止:

um.. Size() counts from 1. Indexes count from 0. So you'll want to make that i < x.size(), not <=. But, in the very next line, you say x[i+1], so i can't even reach the last item, it has to stop one before that:

for (int i=0; i < x.size()-1; i++)

更多推荐

通过递增循环的致命错误

本文发布于:2023-11-27 21:59:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1639754.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:错误

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!