2017-01-27 34 views
-1

この質問をする前に、私は答えを見つけようとしましたが、私が見つけたのは、コードに間違いを犯した人や、コードが実際には同じではなかったということでした。全く同じC++コードは別の出力を与えます

私の問題はまったく同じコードなので、違うのはファイル名の違いだけです。 (2つのフォルダ、2つのプロジェクト、異なるファイル名、#include行以外の同一コード)

http://imgur.com/a/5HmzN コードと出力の比較。左のコードは動作しており、仕上げ後のベクトルサイズは2です。

これはコードである:(プロジェクトファイル名/プロジェクトBファイル名)

main.cppに/ main.cppに

#include <iostream> 
#include <vector> 
#include "class.h" //this would be "Card.h" in project B 

using namespace std; 

int main() 
{ 
    cout<<"Start of main"<<endl; 
    cout<<K.size()<<endl; 
    K.push_back("random STR"); 
    cout<<K.size()<<endl; 
    cout<<"End of main"<<endl; 
    return 0; 
} 

class.cpp/Card.cpp

#include "class.h" //this would be "Card.h" in project B 
#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

vector<string> K; 

Card::Card(string card_name   , 
      string card_type   , 
      bool card_active  , 
      bool card_discardable , 
      bool card_heals  , 
      bool card_deals_damage , 
      bool card_draws  , 
      bool card_blocks  , 
      bool card_discards  , 
      void (*card_pointer)() ) 
{ 
    Name   = card_name   ; 
    Type   = card_type   ; 
    Active   = card_active  ; 
    Discardable  = card_discardable ; 
    Heals   = card_heals  ; 
    Deals_damage = card_deals_damage ; 
    Draws   = card_draws  ; 
    Blocks   = card_blocks  ; 
    Discards  = card_discards  ; 
    Execution  = card_pointer  ; 
    cout<<"Start of Class"<<endl; 
    cout<<K.size()<<endl; 
    K.push_back(Name); 
    cout<<K[0]<<endl; 
    cout<<K.size()<<endl; 
    cout<<"End of Class"<<endl; 
} 
string Card::getName() 
{ 
    return Name; 
} 
void Card::execute() 
{ 
    Execution(); 
}  

class.h/Card.h

aFileの位置
#ifndef CARD_H 
#define CARD_H 
#include <string> 
#include <vector> 

extern std::vector<std::string> K; 

class Card 
{ 
    public: 
     Card( std::string card_name  , 
       std::string card_type  , 
       bool   card_active  , 
       bool   card_discardable , 
       bool   card_heals  , 
       bool   card_deals_damage, 
       bool   card_draws  , 
       bool   card_blocks  , 
       bool   card_discards , 
       void (*card_pointer)()   ); 
     std::string getName(); 
     void execute(); 
    private: 
     std::string Name  ; 
     std::string Type  ; 
     bool  Active  ; 
     bool  Discardable ; 
     bool  Heals  ; 
     bool  Deals_damage; 
     bool  Draws  ; 
     bool  Blocks  ; 
     bool  Discards ; 
     void  (*Execution)(); 
}; 



#endif 

プロジェクトA:

Start of Class 
0 
1 
Stab 
End of Class 
Start of main 
1 
2 
End of main 

プロジェクトB:

の.cpp/TEST.CPP

#include <iostream> 
#include "class.h" 
void execute_stab() 
{ 
    std::cout<<"You dealt 2 dmg to enemy player"<<std::endl; 
} 
Card Stab("Stab", "Offensive", false, true, false, true, false, false, false, execute_stab); 

出力はそれがここimgur使うことができない人のために、アルバムにあります

Start of Class 
0 
1 
Stab 
End of Class 
Start of main 
0 
1 
End of main 

私のコードが面倒であれば謝ってしまいます。私は愚かなやり方でやっています。私はちょうどC++を学び始めました。これが私の試みです。 トランプゲーム。だからこそ大きな疑問は、同じコードが異なる出力を出すのはなぜですか? ありがとうございます

+3

[MCVE]にトリムしてみてください。プロセスをトリミングすると、バグを見つけるのに役立つかもしれません。それで、われわれがバグを見つけ出すのを容易にします。現時点では、良い質問のための余計なコードがあります。 – BoBTFish

+1

2つのバージョンを前処理することもできます。これは '#include'とマクロを処理し、その結果を比較して実際の違いを確認します。 g ++やclang ++では '-E'オプションを用いてこれを行います。 – BoBTFish

+0

@BoBTFishバグはありません。コードは私のプロジェクトAで完璧に動作しています。なぜ同じコピーが動作しないのですか? –

答えて

6

グローバル変数の初期化の順番は、単一のtranslation unitに対してのみ明確に定義されています。変換単位間の順序はで、定義されていませんです。それがここで起こっていることです。

KCard.cppから最初に、Stabtest.cppに初期化されるかどうかはわかりません。

+0

両方のプロジェクトを壊すべきではありませんか?私はそれが私のプロジェクトAで意図したとおりに働いている理由を理解していません。答えてくれてありがとう、私はそれを修正しようとします。 –

+3

@MantasKandrataviciusそれは*あなたのために*未定義の動作です。時々それはうまくいくように見え、次の分にはそれは単に破壊されます。 –

+0

ありがとう、ありがとう。私はそれを徹底的に読むでしょう。私はこれが私の質問に答えると思う。 –

関連する問題