-1

我的部分代码有问题。它应该可以工作,因为它没有错误,并且它没有逻辑问题,因为它可以在其他电脑上工作,但在我的电脑上,结果与输入相同。代码(可运行):

#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
class RAngle{
public:
   int x,y,l;
   RAngle(){}
   RAngle(int i,int j,int k){
      x=i,y=j,l=k;
   }
   bool operator<(const RAngle& rhs)const{
      if(l < rhs.l){
         return true;
        }
      return 0;
  }
  friend ostream& operator << (ostream& out, const RAngle& ra){
    out << ra.x << " " << ra.y << " " << ra.l;
    return out;
  }
  friend istream& operator >>( istream& is, RAngle &ra){
    is >> ra.x;
    is >> ra.y;
    is >> ra.l;
    return is ;
  }
};
void descrSort(vector <RAngle> &l){
    for(unsigned i=0; i<l.size();i++){
        cout<<l[i]<<endl;
    }
    cout << "==================" << endl;
    sort(l.begin(),l.end());
    reverse(l.begin(),l.end());
    for(unsigned i=0; i<l.size();i++){
        cout<<l[i]<<endl;
    }
}
void readData(vector <RAngle> &l){
   RAngle r;
   ifstream f_in;
   f_in.open("test.txt",ios::in);
   for(int i=0;i<10;++i){
      f_in >> r;
      l.push_back(r);
   }
}
int main(){
   vector <RAngle> a;
   readData(a);
   descrSort(a);

   return 0;
  }

数据:

1 7 31
2 2 2
3 3 3
4 5 1
10 5 1
1 1 9
10 3 10
4 5 7
5 4 15
2 3 25
1 7 31

其他机器上的输出(只打印部分之后,descr排序):

1 7 31
2 3 25
5 4 15
10 3 10
1 1 9
4 5 7
3 3 3
2 2 2
10 5 1
4 5 1

在我的电脑上(孔输出):

1 7 31

2 2 2

3 3 3

4 5 1

10 5 1

1 1 9

10 3 10

4 5 7

5 4 15

2 3 25

==================
1 7 31

2 2 2

3 3 3

4 5 1

10 5 1

1 1 9

10 3 10

4 5 7

5 4 15

2 3 25
4

2 回答 2

1

这意味着您的代码有错误。C 和 C++ 让那些实际上有错误的东西编译和运行。像这样:

int i;
std::cout << i << std::endl;

会在不同的机器上做不同的事情。我会称之为错误。编译器不会。

现在至于你的错误在哪里,这是我的“使用调试器”演讲。使用调试器。与我阅读您的代码以查看是否有任何问题相比,使用调试器花费的时间更少,并且找到错误的机会也很大。用 编译-g。谷歌“gdb 备忘单”。使用 gdb 运行。按照备忘单。看看你的代码在哪里做了一些意想不到的事情。

在输出错误的机器上执行此操作似乎很聪明。看看它在哪里做错了。

于 2012-06-13T14:23:15.820 回答
0

为了扩展@djechlin 所说的内容,您最有可能拥有的是“未定义的行为”。

大多数编程语言都严格定义了可以做什么和不可以做什么,编译器编写者使用它来生成编译器错误。另一方面,未定义的行为意味着它取决于编译器编写者和系统;任何事情都可能发生——它可以正常工作,它可以擦除你的引导扇区,僵尸艾伦图灵的崛起和你的大脑盛宴等等。

例如,使用像这样的未初始化变量:

int i; 
std::cout << i << std::endl; 

在某些编译器上,会在调试版本中为您提供类似 0xCECECECE 的模式,以帮助查找未初始化的变量。在发布版本中,它可能被编译器设置为 0,或者它可能是垃圾数据。

于 2012-06-13T14:48:19.760 回答