-1

コードの一部に問題があります。エラーがなく、他のPCでも機能するため論理的な問題はないため、機能するはずですが、私のコンピューターでは結果は入力と同じです。コード (実行可能):

#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

私のコンピュータ上(hoel出力):

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ます。Google の「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 に答える